Создавая библиотеку Python, я использую подсказки типов, чтобы гарантировать согласованность определенного представления данных. В частности, я использую Union
(типы суммы) во вложенном виде, чтобы представить различные варианты данных, которые могут принимать данные.
То, что я получаю до сих пор, похоже на следующий пример:
from typing import Union
MyNumberT = Union[float,int]
MyDataT = Union[str,MyNumber]
def my_data_to_string(datum: MyDataT) -> str:
if isinstance(datum, float):
return _my_number_to_string(datum)
elif isinstance(datum, int):
return _my_number_to_string(datum)
elif isinstance(datum, str):
return datum
# assert_never omitted for simplicity
def _my_number_to_string(number: MyNumberT) -> str:
return "%s" % number
Какой тип проверяется нормально, используя mypy
.
Теперь мой реальный код немного сложнее, и мне нужно выполнить некоторые общие операции с переменными типа MyNumberT
. В примере это просто подчеркивается путем адаптации import
и замены my_data_to_string
, как показано ниже:
from typing import get_args, Union
[...]
def my_data_to_string(datum: MyDataT) -> str:
if isinstance(datum, get_args(MyNumberT)):
return _my_number_to_string(datum)
elif isinstance(datum, str):
return datum
# assert_never omitted for simplicity
[...]
На котором проверка типа mypy
не удалась: Argument 1 to "_my_number_to_string" has incompatible type "Union[str, Union[float, int]]"; expected "Union[float, int]"
.
Я ожидал, что mypy
поймет, что в первой ветке datum
может быть только типа float
или int
, но сообщение об ошибке указывает, что это не так...
Как я могу добиться сопоставления с образцом для частей таких вложенных типов?
datum
сMyNumberT
, не повторяя его составляющие? - person MisterMiyagi   schedule 27.01.2021MyNumberT
в этой функции. - person Pamplemousse   schedule 27.01.2021