Internal error on mypy of `dataclass` with `TypedDict` as `ClassVar`
还没有人认领这个 Issue。
评估
调研方向
从 mypy/plugins/dataclasses.py 开始,尤其是 collect_attributes(),并使用带有 --strict 和 --show-traceback 的最小脚本重现崩溃。跟踪包含 TypedDict 的 ClassVar 是如何处理的;完成的标准是,对于此示例,mypy 不再引发 INTERNAL ERROR,而是正常完成类型检查。
由索引模型根据 Issue 内容生成。
描述
Crash Report
When type-checking (--strict or not) a simple script with dataclass, ClassVar and TypedDict (all three components required, omitting any of three resolves the issue), mypy reports "error: INTERNAL ERROR".
Traceback
(.venv) C:\...\mypybug\mypy>mypy --strict --show-traceback test.py
test.py: error: INTERNAL ERROR -- Please try using mypy master on GitHub:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 2.4.0+dev.6934a9d01cab6226a64b38642e124368f8ddc653
Traceback (most recent call last):
File "<frozen runpy>", line 203, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "C:\...\mypybug\mypy\.venv\Scripts\mypy.exe\__main__.py", line 5, in <module>
sys.exit(console_entry())
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\__main__.py", line 16, in console_entry
main()
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\main.py", line 154, in main
res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\main.py", line 244, in run_build
res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\build.py", line 422, in build
result = build_inner(
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\build.py", line 537, in build_inner
graph = dispatch(sources, manager, stdout, connect_threads)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\build.py", line 4150, in dispatch
process_graph(graph, manager)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\build.py", line 4618, in process_graph
done, still_working, results = manager.wait_for_done(graph)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\build.py", line 1484, in wait_for_done
process_stale_scc(graph, next_scc, self)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\build.py", line 4786, in process_stale_scc
mypy.semanal_main.semantic_analysis_for_scc(graph, scc, manager.errors)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\semanal_main.py", line 97, in semantic_analysis_for_scc
apply_class_plugin_hooks(graph, scc, errors)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\semanal_main.py", line 466, in apply_class_plugin_hooks
with state.wrap_context():
File "C:\Program Files\Python313\Lib\contextlib.py", line 162, in __exit__
self.gen.throw(value)
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\build.py", line 3075, in wrap_context
yield
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\semanal_main.py", line 469, in apply_class_plugin_hooks
if not apply_hooks_to_class(
~~~~~~~~~~~~~~~~~~~~^
state.manager.semantic_analyzer,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...<4 lines>...
errors,
^^^^^^^
):
^
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\semanal_main.py", line 505, in apply_hooks_to_class
ok = ok and hook(ClassDefContext(defn, decorator, self))
~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\plugins\dataclasses.py", line 974, in dataclass_class_maker_callback
return transformer.transform()
~~~~~~~~~~~~~~~~~~~~~^^
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\plugins\dataclasses.py", line 238, in transform
attributes = self.collect_attributes()
File "C:\...\mypybug\mypy\.venv\Lib\site-packages\mypy\plugins\dataclasses.py", line 603, in collect_attributes
assert isinstance(node, Var), node
~~~~~~~~~~^^^^^^^^^^^
AssertionError: TypeInfo(
Name(test.X.TD)
Bases(typing._TypedDict)
Mro(test.X.TD, typing._TypedDict, typing.Mapping, typing.Collection, typing.Iterable, typing.Container, builtins.object)
Names())
test.py: note: use --pdb to drop into pdb
To Reproduce
This code triggers the issue:
import dataclasses
from typing import ClassVar, TypedDict
@dataclasses.dataclass
class X:
a: int
TD: ClassVar = TypedDict('TD', {'a': int})
Your Environment
- Mypy version used: mypy 2.4.0+dev.6934a9d01cab6226a64b38642e124368f8ddc653 (compiled: no)
- Mypy command-line flags: --strict
- Mypy configuration options from
mypy.ini(and other config files): none - Python version used: 3.13.15
- Operating system and version: Windows
- 主要语言
- Python
- 星标
- 20.6k
- 派生
- 3.3k
- 平均合并
- 1 天 12 小时
- 30 天内合并 PR
- 58
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
python/mypy 的其他 Issue
-
bug
难度 2/5 1-3 小时 新手友好度 78/100
-
bug
难度 2/5 1-3 小时 新手友好度 76/100
-
documentation
难度 2/5 1-3 小时 新手友好度 72/100
-
bug topic-configuration topic-error-reporting
难度 2/5 1-3 小时 新手友好度 68/100
-
bug topic-attrs
难度 2/5 1-3 小时 新手友好度 62/100
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 75/100
anthropics/skills#1811 · 1 条评论 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
speaches-ai/speaches#678 ·
-
bug
难度 2/5 1-3 小时 新手友好度 75/100
datalayer/mcp-compose#42 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
conda-forge/spacy-feedstock#177 ·
-
难度 2/5 1-3 小时 新手友好度 70/100
UKGovernmentBEIS/inspect_evals#2523 ·