Подсказка типа для переменной, имеющей тот же тип, что и другая переменная в 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()
это делает что-то совершенно отличное от встроенного.