zipfile.Path.is_symlink() raises KeyError for missing entries
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 77.2k
- フォーク
- 35.9k
- PR マージ指標
- PR 指標を取得中
説明
Summary
zipfile.Path.is_symlink() raises KeyError for a path that is not present in the archive, while the neighboring path predicates return booleans for the same object. This makes is_symlink() leak ZipFile.getinfo() lookup behavior instead of behaving like a predicate, and it differs from pathlib.Path.is_symlink() on a missing filesystem path.
Code path
Lib/zipfile/_path/__init__.py:395-402:Path.is_dir(),Path.is_file(), andPath.exists()use string/path-state checks and return booleans.Lib/zipfile/_path/__init__.py:413-419:Path.is_symlink()callsself.root.getinfo(self.at)directly before checking the mode bits.Lib/zipfile/__init__.py:2126-2133:ZipFile.getinfo()raisesKeyErrorwhen the member name is absent.
Steps to reproduce
I reproduced this directly on Python 3.13.13 and on a local CPython main checkout built out-of-tree.
Minimal reproducer:
import io
import zipfile
buf = io.BytesIO()
with zipfile.ZipFile(buf, "w") as zf:
zf.writestr("present.txt", b"x")
buf.seek(0)
with zipfile.ZipFile(buf) as zf:
p = zipfile.Path(zf) / "missing.txt"
print(p.exists(), p.is_file(), p.is_dir())
print(p.is_symlink())
Observed on Python 3.13.13:
python: 3.13.13 | packaged by Anaconda, Inc. | (main, Apr 14 2026, 06:14:06) [Clang 20.1.8 ]
zipfile module: <python-3.13.13-env>/lib/python3.13/zipfile/__init__.py
exists/is_file/is_dir: False False False
is_symlink exception: KeyError: "There is no item named 'missing.txt' in the archive"
Observed on CPython main:
commit: 564c58c718bc3de9cf3d9bc20cdc06317411c1cd
python: 3.16.0a0 (heads/main-dirty:564c58c, Jul 1 2026, 17:29:34) [Clang 21.0.0 (clang-2100.1.1.101)]
zipfile module: <checkout>/Lib/zipfile/__init__.py
exists/is_file/is_dir: False False False
is_symlink exception: KeyError: "There is no item named 'missing.txt' in the archive"
The CPython main result was produced with the interpreter built from that checkout, without monkeypatching or shims.
The source checkout used for the anchors above was clean (git status --short produced no output); build artifacts were kept out-of-tree.
Expected behavior
zipfile.Path.is_symlink() should return False for a path that is not present in the archive. This matches the behavior of pathlib.Path.is_symlink() for a missing filesystem path and the boolean-predicate behavior of zipfile.Path.exists(), zipfile.Path.is_file(), and zipfile.Path.is_dir() on the same missing archive path.
Actual behavior
zipfile.Path.is_symlink() raises:
KeyError: "There is no item named 'missing.txt' in the archive"
Existing coverage
Related but not duplicate:
- #119588 / #119591 added
zipfile.Path.is_symlink(), but did not cover missing archive paths. - #133324 discusses broader file type semantics for
zipfile.Path, including symlinks and directories, but does not cover this missing-pathKeyErrorroot cause.
Suggested fix
Return False before calling getinfo() when the Path does not correspond to an archive member, or otherwise catch the KeyError from getinfo() and convert it to False for this predicate.
Suggested tests
- Add a
zipfile.Pathtest wherePath(zf) / "missing.txt"returnsFalsefromis_symlink(). - Keep coverage that existing symlink entries still return
True. - Consider also covering the archive root path if it is expected to behave as a non-symlink directory.
Submitted with Codex.
Linked PRs
- gh-152924
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
Lib/zipfile/_path/init.py:413-419 から始め、is_symlink() と395-402行目の隣接する述語を比較してください。既存の zipfile.Path のテストを確認し、既存の symlink ケースを引き続きカバーしたまま、存在しないメンバーのカバレッジを追加してください。完了の条件は、既存の有効な symlink の動作を変更せずに、存在しないパスが False を返すことです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- backend
- issue の種類
- バグ
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 活発さ
- 停滞
- 明瞭さ
- 明確に書かれている
- 初心者へのやさしさ
- 25/100