python / python/mypy

Protocol restriction in generics do not work in methods. But work on functions.

Abierto
#11,167 0 comentarios 2 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug
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

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. 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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.