Protocol restriction in generics do not work in methods. But work on functions.
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con il reproducer fornito e confronta il modo in cui mypy verifica la restrizione del protocollo generico in getMax rispetto a functionGetMax. Traccia il percorso del controllo dei tipi delle chiamate a metodo e la sua gestione di CustomList[NotComparable]; il lavoro è completato quando la chiamata a metodo produce lo stesso errore di variabile di tipo della chiamata a funzione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- tooling
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 42/100