MyPy should report error if variable imported in TYPE_CHECKING block?
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Currently, MyPy doesn't report an error when a variable is imported in the if TYPE_CHECKING block and then used elsewhere.
For example, MyPy accepts this code:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import NamedTuple
class C(NamedTuple):
x: int
y: int
even though, at runtime, it fails:
Traceback (most recent call last):
File "type_checking_test.py", line 6, in <module>
class C(NamedTuple):
NameError: name 'NamedTuple' is not defined
(I'm using MyPy version 0.650.)
Should this be fixed? I think this could be fixed by adding an is_type_checking_only variable to SymbolTableNode, which is True if the variable was imported or assigned within a TYPE_CHECKING block, and ensuring that this flag is false for any variables used in places other than type annotations in the actual code.
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
Beginne damit, das Problem mit dem bereitgestellten TYPE_CHECKING- und NamedTuple-Beispiel zu reproduzieren, und verfolge anschließend, wie Importe und Symboltabelleneinträge aus TYPE_CHECKING-Blöcken behandelt werden. Die Arbeit ist abgeschlossen, wenn MyPy die zur Laufzeit ungültige Verwendung meldet und gleichzeitig weiterhin Namen zulässt, die ausschließlich in Typannotationen verwendet werden, mit einer Abdeckung für das Verhalten des Beispiels.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 38/100