Regression since mypy 1.7 with functions that return a generic protocol
Abierto
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
EDIT: I found a simpler example reproducing the regression, see below
The following code used to pass with mypy 1.6.1
from typing import (
Protocol,
TypeVar,
Callable,
Concatenate,
ParamSpec,
reveal_type,
)
X = TypeVar("X")
Y = TypeVar("Y")
P = ParamSpec("P")
I = TypeVar("I", contravariant=True)
O = TypeVar("O", covariant=True)
# A callable converting I to O with parameters P
ConvertorCallable = Callable[Concatenate[I, P], O]
# An object that can convert I to O with parameters P
class ConvertorProtocol(Protocol[I, P, O]):
def convert(self, __source: I, *args: P.args, **kwargs: P.kwargs) -> O:
...
# Decorator to convert a callable to a convertor
def convertor(
func: ConvertorCallable[X, P, Y],
) -> ConvertorProtocol[X, P, Y]:
class Convertor:
def convert(self, source: X, /, *args: P.args, **kwargs: P.kwargs) -> Y:
return func(source, *args, **kwargs)
return Convertor()
# A convertor that converts X to a list of X
@convertor
def as_list(source: X, repeat: int = 1) -> list[X]:
return [source] * repeat
if __name__ == "__main__":
result = as_list.convert(1, repeat=3)
reveal_type(result)
print(result)
However, it no longer passes with mypy 1.7.0 and later:
error: Argument 1 to "convert" of "ConvertorProtocol" has incompatible type "int"; expected Never [arg-type]
Note that this sample works in the pyright playground.
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
Empieza con el reproductor autocontenido del issue y ejecútalo con mypy 1.6.1 y 1.7.0 o posteriores para confirmar la regresión. Sigue la inferencia de genéricos de Protocol que involucre ParamSpec, TypeVar y Concatenate; se considera terminado cuando el ejemplo deja de informar Never para el argumento y la regresión queda cubierta.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- devtools
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 38/100