False negative: potentially unbound instance attribute doesn't trigger `possibly-undefined` error
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
When enabling the possibly-undefined error code, a potentially undefined instance attribute doesn't trigger the error, while a potentially unbound variable does.
To Reproduce
def test_possibly_undefined(flag: bool):
if flag:
a = 1
print(a) # error: Name "a" may be undefined [possibly-undefined]
class Foo:
def test_possibly_undefined(self, flag: bool):
if flag:
self.a = 1
print(self.a) # false negative, should also be a possibly-undefined error
try:
test_possibly_undefined(False)
except Exception as e:
print(f"{type(e).__name__}: {e}") # UnboundLocalError: cannot access local variable 'a' where it is not associated with a value
f = Foo()
try:
f.test_possibly_undefined(False)
except Exception as e:
print(f"{type(e).__name__}: {e}") # AttributeError: 'Foo' object has no attribute 'a'
Also available as mypy Playground, but cannot enable enable_error_code = possibly-undefined there.
Expected Behavior
A possible-undefined error should be reported for line 11 as well, e.g.:
test.py:4: error: Name "a" may be undefined [possibly-undefined]
test.py:11: error: Attribute "a" may be undefined [possibly-undefined]
Found 2 errors in 1 file (checked 1 source file)
Actual Behavior
No error reported for line 11.
test.py:4: error: Name "a" may be undefined [possibly-undefined]
Found 1 error in 1 file (checked 1 source file)
Your Environment
- Mypy version used: 1.11.2
- Mypy command-line flags:
--enable-error-code=possibly-undefined - Mypy configuration options from
mypy.ini(and other config files): None - Python version used: 3.12.6
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
Commencez par reproduire l’exemple avec mypy 1.11.2 et le code d’erreur possibly-undefined, puis localisez la logique du checker et les tests de régression concernant les variables locales potentiellement non définies. Comparez le traitement des noms locaux avec celui des attributs d’instance et ajoutez une couverture pour l’exemple Foo ; le travail est terminé lorsque mypy signale l’erreur attendue Attribute "a" may be undefined.
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é
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 45/100