Подсказка типа для переменной, имеющей тот же тип, что и другая переменная в Python

Пример:

def f(...): ...
v: type(f) = decorate(f)

Но VSCode Python Language Server, похоже, не распознает его (и MyPy дает это object тип?).

Часть проблемы здесь в том, что decorate не набирается вручную и неправильно выводится.

1 ответ

Выражения типа оцениваются статически с помощью средства проверки типов.* Сложные выражения, такие как type(f) не гарантированно работать, потому что type(f) оценивает тип времени выполнения f, а не его статически аннотированное значение.** Средство проверки типов не знает, каким будет этот тип времени выполнения. В общем, вы должны придерживаться выражений типа, описанных в PEP 484 для максимальной совместимости.

Часть проблемы здесь в том, что decorate не набирается вручную и неправильно выводится.

Так что исправь это. Например, вы можете сказать, что он возвращает объект того же типа, что и его аргумент:

T = typing.TypeVar('T')
d = typing.cast(decorate, typing.Callable[[T], T])
v = d(f) # v is inferred to have the same type as f

* Типовые выражения также оцениваются во время выполнения, хранятся в __annotations__ поле, а затем никогда не использовать снова, если какой-то код не решит их проанализировать. Эта функциональность во время выполнения используется редко и не имеет отношения к вопросу.
** На самом деле это еще хуже, потому что кто-то, возможно, пропатчил ваш модуль с помощью обезьянки type() это делает что-то совершенно отличное от встроенного.

Другие вопросы по тегам