Metaclass confusion with properties
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
I'm using python 3.8 and mypy 0.740. The script below prints "21" and "42" when run, but fails to type check with mypy:
class meta (type):
pass
class value (metaclass=meta):
pass
class submeta (meta):
@property
def attr(cls) -> int:
return 42
class subvalue (metaclass=submeta):
@property
def attr(self) -> int:
return 21
o = subvalue()
a = o.attr
print(a)
a = subvalue.attr
print(a)
The mypy diagnostics say:
meta-test.py:24: error: Incompatible types in assignment (expression has type "Callable[[subvalue], int]", variable has type "int")
Found 1 error in 1 file (checked 1 source file)
The error is incorrect, "subvalue.attr" has type "int", as it resolves to the property defined on the metaclass, not to the property defined on the class.
This is fairly esoteric as written, but is the structure used by PyObjC to expose Objective-C classes. PyObjC uses metaclasses to expose class methods because ObjC classes can have instance- and class-methods with the same name.
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 diagnostic à l’aide de l’exemple meta-test.py décrit dans l’issue avec Python 3.8 et mypy 0.740. Commencez par retracer comment mypy résout les propriétés sur subvalue par rapport à sa métaclasse submeta. C’est terminé lorsque subvalue.attr est inféré comme int sans l’erreur incompatible-assignment signalée, tandis que l’accès à l’instance reste correct.
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é
- Clairement spécifiée
- Accessibilité débutants
- 38/100