Regression since mypy 1.7 with functions that return a generic protocol
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 54
Description
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.
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 par le reproducteur autonome de l’issue et exécutez-le avec mypy 1.6.1 et 1.7.0 ou une version ultérieure pour confirmer la régression. Suivez l’inférence générique de Protocol impliquant ParamSpec, TypeVar et Concatenate ; le travail est terminé lorsque l’exemple ne signale plus Never pour l’argument et que la régression est couverte.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- devtools
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 38/100