python / python/cpython

zipfile.Path.is_symlink() raises KeyError for missing entries

未关闭
#152,762 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

stdlib type-bug
主要语言
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(), and Path.exists() use string/path-state checks and return booleans.
  • Lib/zipfile/_path/__init__.py:413-419: Path.is_symlink() calls self.root.getinfo(self.at) directly before checking the mode bits.
  • Lib/zipfile/__init__.py:2126-2133: ZipFile.getinfo() raises KeyError when 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-path KeyError root 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.Path test where Path(zf) / "missing.txt" returns False from is_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

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 Lib/zipfile/_path/init.py:413-419 开始,将 is_symlink() 与第 395-402 行相邻的谓词进行比较。检查现有的 zipfile.Path 测试,并为缺失成员添加覆盖,同时保留现有 symlink 用例的覆盖;完成的标准是缺失路径返回 False,且不改变有效 symlink 的行为。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
backend
Issue 类型
缺陷
难度
2/5
预计耗时
1-3 小时
活跃度
停滞
描述清晰度
描述清楚
新手友好度
25/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。