mypy sometimes confuses nested classes-in-functions which share the same name
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
In some circumstances, mypy will confuse two classes of the same name, even if they're declared in non-overlapping scopes.
To Reproduce
Check the following ~minimal example with mypy:
# from __future__ import annotations # with or without makes no difference
def test_a() -> None:
class SomeClass: # line 5
def some_method(self) -> None:
_ = some_var # line 7
some_var = None # not necessary for repro; stops error on line 7
def test_b() -> None:
instance: SomeClass
class SomeClass: # line 15
pass
instance = SomeClass()
# error: Incompatible types in assignment (expression
# has type "SomeClass@15", variable has type
# "SomeClass@5") [assignment]
Expected Behavior
No errors.
Actual Behavior
The tool confuses the two classes of the same name (SomeClass), despite these being declared in entirely different scopes.
Bisection
The problem appears to have been introduced by https://github.com/python/mypy/commit/389a1725c1df7fad4e2605360157c9f910cb502c (which made its way into mypy 0.900):
389a1725c1df7fad4e2605360157c9f910cb502c is the first bad commit
commit 389a1725c1df7fad4e2605360157c9f910cb502c
Author: Jukka Lehtosalo <jukka.lehtosalo@iki.fi>
Date: Thu May 6 14:32:36 2021 +0100
Fix crash with nested NamedTuple in incremental mode (#10431)
The name of the nested tuple type was inconsistent. Sometimes if was stored
using the full name in the module symbol table.
Also improve the internal API for creating classes to be less error-prone.
Work on #7281.
mypy/semanal.py | 10 +++++++---
mypy/semanal_enum.py | 9 +++++----
mypy/semanal_namedtuple.py | 2 +-
mypy/semanal_newtype.py | 11 ++++++-----
mypy/semanal_shared.py | 2 +-
mypy/semanal_typeddict.py | 14 ++++++++------
test-data/unit/check-incremental.test | 26 ++++++++++++++++++++++++++
7 files changed, 54 insertions(+), 20 deletions(-)
Probably relates to #7281, #10431.
Your Environment
- Mypy version used: 1.9.0, 0.900, but not 0.800 (see: "bisection")
- Mypy command-line flags: none necessary
- Mypy configuration options from
mypy.ini(and other config files): none necessary - Python version used: 3.8, 3.12
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Reproduziere das minimale Beispiel mit mypy 1.9.0 und vergleiche es mit 0.800. Untersuche anschließend den Bisection-Commit und die von ihm geänderten Dateien zur semantischen Analyse, insbesondere mypy/semanal.py. Beginne mit test-data/unit/check-incremental.test als dem genannten Testort; abgeschlossen ist die Aufgabe, wenn die beiden separat abgegrenzten SomeClass-Definitionen keinen incompatible-assignment-Fehler mehr erzeugen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers, devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100