Из документации , TypeVar
служат параметрами для обобщенных c типов, а также для generi c функций определений. Это также позволяет нам ограничивать возможные типы для нашего универсального c типа или функции.
Если я запусту приведенный ниже код с mypy, он будет правильно идентифицировать y
как int
и z
как float
.
from typing import TypeVar, Any
Array = TypeVar("Array")
X = TypeVar("X", int, float, str, complex)
def identity(x: X) -> X:
return x
if __name__ == '__main__':
y = identity(5)
z = identity(5.5)
reveal_type(y)
reveal_type(z)
Однако, если я изменю определение X
на X = TypeVar("X", int, float, str, complex, Any)
, тогда обнаруженный тип y
и z
, который я получаю от mypy, просто Any
.
Мой вопрос: это ошибка или я неправильно использую TypeVar
? Как мне тогда набрать эту функцию, если TypeVar - неправильный путь к go здесь?
Самое смешное, что если вместо этого я определю X
как X = TypeVar("X", Any, int, float, str, complex)
, тогда я получу правильные выявленные типы для y
и z
, как и раньше, но документация о TypeVar
ничего не говорит о заказе, и это может быть просто деталью реализации, и от нее зависит agile. Если поставить Any
после int, float,
, типы y
и z
будут обозначены как complex
, что неверно.
Примечание. Что я действительно хочу добавить к ограниченным типам это массив numpy, но так как он не имеет информации о типизации, mypy интерпретирует его как просто Any
, и он имеет тот же эффект.