Обертка, снятая общий параметр функции, стирает его параметр типаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обертка, снятая общий параметр функции, стирает его параметр типа

Сообщение Anonymous »

В следующем коде Python я определяю обертку общей функции, которая принимает функцию типа t → t и заменяю ее функцией без аргументов, возвращающих экземпляр задержки [t] . Этот экземпляр просто сохраняет исходную функцию, чтобы ее можно было вызвать позже.

Код: Выделить всё

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"
Я бы ожидал, что проверка типа выведет тип fun2 as def [t] () -> Delay [t] , тип fun2 (). Здесь. < /p>
Есть ли что -то недействительное с аннотациями типа в моем коде? Является ли это известным ограничением системы типа Python или ошибкой в ​​Mypy и Pyright?


Подробнее здесь: https://stackoverflow.com/questions/796 ... -parameter
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»