Mypy not detecting abstract methods returning undefined types
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug Report
I have a class with a couple of abstract methods that return a particular custom type. That custom type is then defined right after the class. Then a global variable referencing that class is created:
To Reproduce
# test.py
from abc import ABC, abstractmethod
from typing import NamedTuple, List
class F(ABC):
@abstractmethod
async def m1(self) -> Result:
pass
@abstractmethod
async def m2(self) -> Result:
pass
class Result(NamedTuple):
f1: str
f2: int
foo: List[F] = []
> mypy --strict test.py
Success: no issues found in 1 source file
> python test.py
Traceback (most recent call last):
File "test.py", line 4, in <module>
class F(ABC):
File "test.py", line 6, in F
async def m1(self) -> Result:
NameError: name 'Result' is not defined
Expected Behavior
I would expect mypy to detect that Result is not defined before its use in class F.
Actual Behavior
Mypy is happy with the code as it is, even under --strict, while Python can't even run the code as is. Moving the declaration of Result above class F solves the problem and both Python and mypy are then happy.
Your Environment
- Mypy version used: 0.991
- Mypy command-line flags: --strict
- Mypy configuration options from
mypy.ini(and other config files): N/A - Python version used: 3.9.13
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez le comportement de test.py en exécutant mypy --strict, puis Python, afin de comparer le résultat statique avec le NameError à l’exécution. Suivez la manière dont mypy analyse les annotations de retour de la méthode abstraite avant que Result ne soit déclaré. Le travail est terminé lorsque mypy signale la référence Result non définie dans ce cas sans casser les annotations valides.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- devtools
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 45/100