python / python/mypy

[2.2 regression] Internal mypy error related to circular imports and TypedDict

Aperta
#21,741 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

crash topic-import-cycles topic-typed-dict
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

Crash Report

I have observed a regression in mypy 2.2.0 and up where code that used to type check now causes an internal mypy error. An example of this can be seen here. https://github.com/QCoDeS/Qcodes_contrib_drivers/pull/576 https://github.com/QCoDeS/Qcodes_contrib_drivers/actions/runs/29298819262/job/86978061271?pr=576 as well as a more minimal example linked below.

Traceback

❯ uv run mypy mypy_repro\ --show-traceback
mypy_repro\m_nd.py: error: Cannot resolve TypedDict item (possible cyclic definition)  [misc]
mypy_repro\m_param.py:28: 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.67eecf07fea3fa4bbaab9d46cd28372a8ded330b
Traceback (most recent call last):
  File "<frozen runpy>", line 203, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "D:\source\repos\mypy_22_issue\.venv\Scripts\mypy.exe\__main__.py", line 10, in <module>
    sys.exit(console_entry())
  File "D:\source\opensource\mypy\mypy\__main__.py", line 16, in console_entry
    main()
  File "D:\source\opensource\mypy\mypy\main.py", line 154, in main
    res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
  File "D:\source\opensource\mypy\mypy\main.py", line 244, in run_build
    res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
  File "D:\source\opensource\mypy\mypy\build.py", line 422, in build
    result = build_inner(
  File "D:\source\opensource\mypy\mypy\build.py", line 537, in build_inner
    graph = dispatch(sources, manager, stdout, connect_threads)
  File "D:\source\opensource\mypy\mypy\build.py", line 4146, in dispatch
    process_graph(graph, manager)
  File "D:\source\opensource\mypy\mypy\build.py", line 4614, in process_graph
    done, still_working, results = manager.wait_for_done(graph)
  File "D:\source\opensource\mypy\mypy\build.py", line 1484, in wait_for_done
    process_stale_scc(graph, next_scc, self)
  File "D:\source\opensource\mypy\mypy\build.py", line 4782, in process_stale_scc
    mypy.semanal_main.semantic_analysis_for_scc(graph, scc, manager.errors)
  File "D:\source\opensource\mypy\mypy\semanal_main.py", line 92, in semantic_analysis_for_scc
    process_functions(graph, scc, patches)
  File "D:\source\opensource\mypy\mypy\semanal_main.py", line 275, in process_functions
    process_top_level_function(
  File "D:\source\opensource\mypy\mypy\semanal_main.py", line 314, in process_top_level_function
    deferred, incomplete, progress = semantic_analyze_target(
  File "D:\source\opensource\mypy\mypy\semanal_main.py", line 380, in semantic_analyze_target
    analyzer.refresh_partial(
  File "D:\source\opensource\mypy\mypy\semanal.py", line 709, in refresh_partial
    self.accept(node)
  File "D:\source\opensource\mypy\mypy\semanal.py", line 7732, in accept
    node.accept(self)
    ~~~~~~~~~~~^^^^^^
  File "D:\source\opensource\mypy\mypy\nodes.py", line 1165, in accept
    return visitor.visit_func_def(self)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "D:\source\opensource\mypy\mypy\semanal.py", line 991, in visit_func_def
    self.analyze_func_def(defn)
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "D:\source\opensource\mypy\mypy\semanal.py", line 1036, in analyze_func_def
    self.defer(defn)
    ~~~~~~~~~~^^^^^^
  File "D:\source\opensource\mypy\mypy\semanal.py", line 7333, in defer
    assert not self.final_iteration, "Must not defer during final iteration"
           ^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Must not defer during final iteration

mypy_repro\m_param.py:28: note: use --pdb to drop into pdb

To Reproduce

Run mypy on the code in the following repo https://github.com/jenshnielsen/mypy_22_issue
Note that since this is related to circular imports, I was not able to minimize this below 4 files

Your Environment

  • Mypy version used: 2.2.0, 2.3.0 as well as master as of 67eecf07fea3fa4bbaab9d46cd28372a8ded330b
  • Mypy command-line flags: None
  • Mypy configuration options from mypy.ini (and other config files): Empty config
  • Python version used: 3.14.6
  • Operating system and version: Windows 11

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

Riproduci il problema con il repository mypy_22_issue collegato e --show-traceback, quindi segui il percorso segnalato attraverso mypy/semanal.py e mypy/semanal_main.py, in particolare il rinvio dell’iterazione finale e la risoluzione ciclica di TypedDict. Il lavoro è completato quando l’esempio composto da quattro file non produce più un INTERNAL ERROR e riporta il risultato appropriato del controllo dei tipi.

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

Valutazione

Stack tecnologico
python
Ambito
compilers
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
42/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.