Class inheriting from property doesn't typecheck properly when used as a decorator
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 54
Description
I have a custom class inheriting from property. When I go to use this as a decorator though mypy seems to miss that it's a property at all. This is with Python 3.6.3 and mypy 0.650.
Example:
class CustomProperty(property):
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
super().__init__(fget, fset, fdel, doc)
class A:
def __init__(self) -> None:
self._val = 1
@CustomProperty
def val(self) -> int:
return self._val
@val.setter
def val(self, v: int) -> None:
self._val = v
def test_a() -> None:
print(A.val)
Running mypy on this gives the following output:
mypy minimal2.py
minimal.py:14: error: Name 'val' already defined on line 10
minimal.py:14: error: Name 'val' is not defined
minimal.py:20: error: "Type[A]" has no attribute "val"
Contrast this with the same code with the builtin property which typechecks fine:
class B:
def __init__(self) -> None:
self._val = 1
@property
def val(self) -> int:
return self._val
@val.setter
def val(self, v: int) -> None:
self._val = v
def test_b() -> None:
print(B.val)
It's possible that this is related to #1529 where @ilevkivskyi suggested that:
The original example now passes mypy, not sure however how useful the subclass can be (property is heavily special-cased in mypy), but at least the original bug is fixed, so closing this.
Is subclassing property frowned upon (or just not supported in mypy?).
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 rapport avec l’exemple minimal.py en utilisant Python 3.6.3 et mypy 0.650, puis comparez le cas du décorateur CustomProperty avec celui de la propriété builtin. Suivez le traitement par mypy des sous-classes de property et des setters de décorateurs ; le travail est terminé lorsque la classe personnalisée passe la vérification de types comme la propriété builtin, sans les erreurs duplicate-name ou missing-attribute signalées.
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