python / python/mypy

Internal error on mypy of `dataclass` with `TypedDict` as `ClassVar`

Aperta
#21,915 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

crash topic-dataclasses
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia da mypy/plugins/dataclasses.py, in particolare collect_attributes(), e riproduci il crash con lo script minimo usando --strict e --show-traceback. Traccia come viene gestito il ClassVar che contiene un TypedDict; il lavoro è concluso quando mypy non genera più un INTERNAL ERROR per questo esempio e completa invece normalmente il controllo dei tipi.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
devtools
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Attiva
Chiarezza
Specificata chiaramente
Idoneità per principianti
72/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.