Код: Выделить всё
from collections.abc import Callable
class Delay[T]:
def __init__(self, wrapped: Callable[[T], T]):
self.wrapped = wrapped
def wrapper[T](wrapped: Callable[[T], T]) -> Callable[[], Delay[T]]:
def wrapping() -> Delay[T]:
return Delay(wrapped)
return wrapping
< /code>
При использовании этой обертки с обычной функцией проверка типа счастлива: < /p>
@wrapper
def fun1(arg: str) -> str:
return arg
reveal_type(fun1) # mypy says: "def () -> Delay[builtins.str]"
reveal_type(fun1()) # mypy says: "Delay[builtins.str]"
reveal_type(fun1().wrapped) # mypy says: "def (builtins.str) -> builtins.str"
reveal_type(fun1().wrapped("test")) # mypy says: "builtins.str"
< /code>
Однако, когда обернутая функция общая, аргумент типа каким-то образом стерт: < /p>
@wrapper
def fun2[T](arg: T) -> T:
return arg
reveal_type(fun2) # mypy says: "def () -> Delay[Never]"
reveal_type(fun2()) # mypy says: "Delay[Never]"
reveal_type(fun2().wrapped) # mypy says: "def (Never) -> Never"
reveal_type(fun2().wrapped("test")) # mypy says: "Never"
Есть ли что -то недействительное с аннотациями типа в моем коде? Является ли это известным ограничением системы типа Python или ошибкой в Mypy и Pyright?
Подробнее здесь: https://stackoverflow.com/questions/796 ... -parameter