Mypy does not correctly understand MemberDescriptors for objects with slots.
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 a Python object uses slots, MemberDescriptors are created for each attribute defined as a slot.
Mypy incorrectly interprets these fields as the type of the slotted value, rather than as a member descriptor.
To Reproduce
class TestObject(object):
__slots__ = ["a", "b"]
a: int
b: str
def __init__(self, a: int, b: str) -> None:
self.a = a
self.b = b
def test() -> None:
x = TestObject(5, "hi")
reveal_type(TestObject.a)
reveal_type(TestObject.b)
reveal_type(x.a)
reveal_type(x.b)
Expected Behavior
Here is what the types actually are based on the python repl.
>>> TestObject
<class '__main__.TestObject'>
>>> x = TestObject(10, "hi")
>>> type(TestObject.a)
<class 'member_descriptor'>
>>> type(TestObject.b)
<class 'member_descriptor'>
>>> type(x.a)
<class 'int'>
>>> type(x.b)
<class 'str'>
Actual Behavior
Mypy output:
12: note: Revealed type is 'builtins.int'
13: note: Revealed type is 'builtins.str'
14: note: Revealed type is 'builtins.int'
15: note: Revealed type is 'builtins.str'
Your Environment
Python 3.8.1
mypy 0.782
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 la reproduction fournie de slots et MemberDescriptor, puis suivez la manière dont mypy détermine les types révélés pour les attributs de classe par rapport aux attributs d’instance. Confirmez la correction en vérifiant que TestObject.a et TestObject.b sont signalés comme des descripteurs de membre, tandis que x.a et x.b restent int et str.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100