Примечание: typing.Optional[x]
является псевдонимом для typing.Union[x, None]
Теперь можно проверить атрибуты аннотации вашего поля ввода, чтобы проверить, определено ли оно как Union [x, None]:Вы можете прочитать его атрибуты __module__
, __args__
и __origin__
:
from typing import *
def print_meta_info(x):
print(x.__module__, x.__args__, x.__origin__)
x = Optional[int]
print_meta_info(x) # 'typing', (class Int,), typing.Union
x = Union[int, float]
print_meta_info(x) # 'typing', (class int, class float), typing.Union
x = Iterable[str]
print_meta_info(x) # 'typing', (class int,), typing.Iterable
Вам необходимо выполнить следующие шаги, чтобы определить свою проверку:
- Убедитесь, чтоаннотация имеет ключи
__module__
, __args__
и __origin__
__module__
должны быть установлены на «печатать».Если нет, аннотация не является объектом, определенным модулем набора * __origin__
значение равно типированию. Union __args__
должен быть кортежем из 2 элементов, где второйявляется классом NoneType (type(None)
)
Если все условия оцениваются как true, у вас есть типирование. Опция [x]Вам также может понадобиться узнать, что такое необязательный класс в аннотации:
x = Optional[int].__args__[0]
print(x) # class int