python / python/mypy

`AssertionError: Must not defer during final iteration` with recursive class definition

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

Nessuno ha ancora preso questa issue.

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

Descrizione

Crash Report

mypy 2.1.0 and master (938dbe2f) crash on the snippet below.

Traceback

Traceback (most recent call last):
  File ".venv-mypy/bin/mypy", line 6, in <module>
    sys.exit(console_entry())
  File "mypy/mypy/__main__.py", line 16, in console_entry
    main()
  File "mypy/mypy/main.py", line 154, in main
    res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
  File "mypy/mypy/main.py", line 244, in run_build
    res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
  File "mypy/mypy/build.py", line 422, in build
    result = build_inner(
  File "mypy/mypy/build.py", line 537, in build_inner
    graph = dispatch(sources, manager, stdout, connect_threads)
  File "mypy/mypy/build.py", line 4134, in dispatch
    process_graph(graph, manager)
  File "mypy/mypy/build.py", line 4602, in process_graph
    done, still_working, results = manager.wait_for_done(graph)
  File "mypy/mypy/build.py", line 1478, in wait_for_done
    process_stale_scc(graph, next_scc, self)
  File "mypy/mypy/build.py", line 4769, in process_stale_scc
    mypy.semanal_main.semantic_analysis_for_scc(graph, scc, manager.errors)
  File "mypy/mypy/semanal_main.py", line 91, in semantic_analysis_for_scc
    process_top_levels(graph, scc, patches)
  File "mypy/mypy/semanal_main.py", line 200, in process_top_levels
    deferred, incomplete, progress = semantic_analyze_target(
  File "mypy/mypy/semanal_main.py", line 380, in semantic_analyze_target
    analyzer.refresh_partial(
  File "mypy/mypy/semanal.py", line 701, in refresh_partial
    self.refresh_top_level(node)
  File "mypy/mypy/semanal.py", line 728, in refresh_top_level
    self.accept(d)
  File "mypy/mypy/semanal.py", line 7695, in accept
    node.accept(self)
    ~~~~~~~~~~~^^^^^^
  File "mypy/mypy/nodes.py", line 1727, in accept
    return visitor.visit_class_def(self)
           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "mypy/mypy/semanal.py", line 1840, in visit_class_def
    self.analyze_class(defn)
    ~~~~~~~~~~~~~~~~~~^^^^^^
  File "mypy/mypy/semanal.py", line 1991, in analyze_class
    self.clean_up_bases_and_infer_type_variables(defn, bases, context=defn)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "mypy/mypy/semanal.py", line 2329, in clean_up_bases_and_infer_type_variables
    result = self.analyze_class_typevar_declaration(base, has_type_var_tuple)
  File "mypy/mypy/semanal.py", line 2409, in analyze_class_typevar_declaration
    tvar = self.analyze_unbound_tvar(arg)
  File "mypy/mypy/semanal.py", line 2435, in analyze_unbound_tvar
    return self.analyze_unbound_tvar_impl(t)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
  File "mypy/mypy/semanal.py", line 2444, in analyze_unbound_tvar_impl
    self.record_incomplete_ref()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "mypy/mypy/semanal.py", line 7321, in record_incomplete_ref
    self.defer()
    ~~~~~~~~~~^^
  File "mypy/mypy/semanal.py", line 7296, in defer
    assert not self.final_iteration, "Must not defer during final iteration"
           ^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Must not defer during final iteration

To Reproduce

from typing import Generic

class C(Generic[C]):
    pass

Your Environment

  • Mypy version used: 2.1.0 and 938dbe2f
  • Mypy command-line flags: N/A
  • Mypy configuration options from mypy.ini (and other config files): N/A
  • Python version used: 3.14.5
  • Operating system and version: Arch Linux

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 crash con l’esempio ricorsivo di Generic fornito, quindi segui il percorso dell’analisi semantica attraverso mypy/semanal.py, in particolare analyze_unbound_tvar_impl e defer. Il lavoro è completato quando lo snippet non attiva più l’AssertionError dell’iterazione finale; il report non indica alcun file di test di regressione, quindi individua i test esistenti dell’analisi semantica prima di aggiungere la copertura.

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
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.