У меня есть функция с одним параметром, которая должна принимать int
или None
в качестве аргумента. Есть несколько способов создать псевдоним типа для такого составного типа:
# test.py
import typing
IntOrNone_1 = typing.TypeVar('IntOrNone_1', int, None)
IntOrNone_2 = typing.Union[int, None]
def my_func1(xyz: IntOrNone_1):
return xyz
def my_func2(xyz: IntOrNone_2):
return xyz
my_func1(12)
my_func1(None)
my_func1(13.7)
my_func1('str')
my_func2(12)
my_func2(None)
my_func2(13.7)
my_func2('str')
Оба метода делают то, что я от них ожидаю, однако соответствующие ошибки немного отличаются, но в основном имеют одинаковое значение.
test.py:14: ошибка: значение переменной типа «IntOrNone_1» из «my_func1» не может быть «плавающим»
test.py:15: ошибка: значение переменной типа «IntOrNone_1» из «my_func1» не может быть «str»
test.py:19: ошибка: аргумент 1 для «my_func2» имеет несовместимый тип «float»; ожидается "Необязательный [int]"
test.py:20: ошибка: аргумент 1 для «my_func2» имеет несовместимый тип «str»; ожидается "Необязательный [int]"
Я предпочитаю использовать второй подход, поскольку он дополнительно сообщает, какой аргумент вызвал ошибку.
Действительно ли оба метода эквивалентны, как я полагаю, или один из них предпочтительнее?