Protocol restriction in generics do not work in methods. But work on functions.
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con el reproductor proporcionado y compara cómo mypy comprueba la restricción del protocolo genérico en getMax frente a functionGetMax. Sigue el recorrido de comprobación de tipos de las llamadas a métodos y su gestión de CustomList[NotComparable]; se considera terminado cuando la llamada al método produce el mismo error de variable de tipo que la llamada a la función.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- tooling
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100