generics are removed from function signatures that are assigned to `Callable` types
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
from typing import TypeVar, Callable
T = TypeVar("T")
def asdf(fn: Callable[[], T]) -> Callable[[], T]: ...
@asdf
def foo() -> list[T]: ...
reveal_type(foo) # "def () -> list[Never]", should be "def [T] () -> list[T]"
use case
i'm making a @NoInstance decorator that bans usages of classmethods on instances:
from typing import TypeVar, ParamSpec, Concatenate, Callable, Generic, overload, Never
out_T = TypeVar("out_T", covariant=True)
P = ParamSpec("P")
out_R = TypeVar("out_R", covariant=True)
class NoInstance(Generic[P, out_R]):
def __init__(self, function: Callable[Concatenate[type[out_T], P], out_R]):
...
@overload
def __get__(self, instance: None, owner: type[object]) -> Callable[P, out_R]:
...
@overload
def __get__(self, instance: object, owner: type[object]) -> Never:
...
def __get__(self, instance: object, owner: type[object]) -> object:
...
class Foo:
@NoInstance
@classmethod
def foo(cls):
...
Foo.foo() # allowed
Foo().foo() # not allowed
but the primary use case for class methods that should not be called on instances are constructor methods, which means the resulting signature only has the typevar on the return type (in this case, Self):
class Foo:
@NoInstance
@classmethod
def from_int(cls) -> Self:
...
reveal_type(Foo.from_int) # `"def () -> Never"`, because the `Self` generic was removed by the `Concatenate`. should be `def () -> Foo` instead
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 exécuter les exemples minimaux dans le mypy playground lié et comparez les types révélés aux signatures génériques attendues. Suivez l'inférence de types et la gestion de Callable/Concatenate impliquées dans ces exemples ; le travail est terminé lorsque le T générique ou Self est préservé au lieu d'être réduit à Never.
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é
- Clairement spécifiée
- Accessibilité débutants
- 42/100