Можем ли мы использовать Union внутри generic typehinting в python?
Я пишу функцию, которая анализирует объект типа Union со списком синтаксических анализаторов (с конкретными типами) и возвращает объединенный тип. Однако я обнаружил, что не могу заставить Union корректно работать с универсальным списком.
from typing import List,Union,TypeVar
T=TypeVar("T")
T1=TypeVar("T1")
def union_list(l: List[Union[T,T1]] )-> Union[T,T1]:
return l[0]
test=[0,"_"]
result=union_list(test)
reveal_type(result)
Я ожидаю получить Union [int, str] в качестве типа для результата, но вместо этого получил объект. Есть ли способ объединения перечисленных типов без их явного указания?
1 ответ
Решение
Это потому, что вы не указали test
тип. Следующее будет работать:
from typing import List, TypeVar, Union
T = TypeVar("T")
T1 = TypeVar("T1")
def union_list(l: List[Union[T, T1]])-> Union[T, T1]:
return l[0]
# Here, specify the type of test
test = [0, "_"] # type: List[Union[int, str]]
result = union_list(test)
reveal_type(result)
# Happily answers: Revealed type is 'Union[builtins.int, builtins.str]'
Если вы не укажете test
типа, Mypy будет делать вывод, что test
тип List[object]
, Если бы вы дали:
test = [0, 1]
(даже без объявления типа), Mypy будет выводить, что test
тип List[int]
и выявленный тип result
было бы int
,