Protocol restriction in generics do not work in methods. But work on functions.
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
Protocol restriction in generics do not work in methods. But work on functions.
To Reproduce
from typing import *
CanCompare = TypeVar("CanCompare", bound='Comparable')
class Comparable(Protocol):
def __lt__(self: CanCompare, other: CanCompare) -> bool:
pass
def __gt__(self: CanCompare, other: CanCompare) -> bool:
pass
def __le__(self: CanCompare, other: CanCompare) -> bool:
pass
def __ge__(self: CanCompare, other: CanCompare) -> bool:
pass
A = TypeVar('A', covariant=True)
class CustomList(list, Generic[A]):
def getMax(self: 'CustomList'[CanCompare]) -> Optional[CanCompare]:
return functionGetMax(self)
def functionGetMax(aList: 'CustomList'[CanCompare]) -> Optional[CanCompare]:
pass
canCompareMe: CustomList[int] = CustomList([1, 2, 3])
canCompareMe.getMax() # ok
functionGetMax(canCompareMe) # ok
class NotComparable:
pass # no comparisons implemented
impossibleToCompare: CustomList[NotComparable] = CustomList([NotComparable(), NotComparable()])
impossibleToCompare.getMax() # Bug: No error raised
functionGetMax(impossibleToCompare) # Correctly raised error: Value of type variable "CanCompare" of "functionGetMax" cannot be "NotComparable"
Expected Behaviou
Mypy should raise an error on the .getMax() method when called on a CustomList[NotComparable].
Actual Behavior
Instead, no error was raised.
Curiously, the functionGetMax function correctly raises the error.
(Write what happened.)
Your Environment
- Mypy version used: Both mypy 0.910 and mypy-0.920+dev.58fb493b04c61f6202ac8ba0811d3ff8546a8e60
- Mypy command-line flags: No flags
- Mypy configuration options from
mypy.ini(and other config files): no config options - Python version used: Python 3.9.6 (v3.9.6:db3ff76da1, Jun 28 2021, 11:49:53)
- Operating system and version: Macosx 10.15.7
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 avec le reproducer fourni et comparez la manière dont mypy vérifie la restriction du protocole générique dans getMax par rapport à functionGetMax. Suivez le chemin de vérification de type des appels de méthode et son traitement de CustomList[NotComparable] ; c’est terminé lorsque l’appel de méthode produit la même erreur de variable de type que l’appel de fonction.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 42/100