`autospec` doesn't work with lazy-imported symbols
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 35.9k
- PR 合并指标
- PR 指标待抓取
描述
Bug report
Bug description:
unittest.mock.patch(target, autospec=True) reads unresolved lazy-import bindings directly from target.__dict__ and autospecs the LazyImportType proxy instead of the imported symbol.
from unittest.mock import patch
lazy from json import dumps
with patch("__main__.dumps", autospec=True) as mock_dumps:
mock_dumps({})
On CPython main (9d231cbc937f as of now), this raises:
TypeError: 'NonCallableMagicMock' object is not callable
Resolving dumps before patching works. This also affects patch.object, spec=True, and spec_set=True.
A practical example is concurrent.futures.ThreadPoolExecutor, which now uses an explicit lazy import: existing tests such as this one patch it with autospec=True and encounter the same issue.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux, macOS, Windows
Linked PRs
- gh-153977
- gh-157768
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 unittest.mock.patch 和 patch.object 入口开始,并使用 json.dumps 的延迟导入重现该示例。比较 autospec=True 与 spec=True 和 spec_set=True,包括报告中链接的 ThreadPoolExecutor 测试用例;当这些用例能够处理导入的符号且不再出现报告中的 NonCallableMagicMock 错误时,即视为完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- testing-qa
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100