Как указать тип возврата" nullable " с подсказками типа
Предположим, у меня есть функция:
def get_some_date(some_argument: int=None) -> %datetime_or_None%:
if some_argument is not None and some_argument == 1:
return datetime.utcnow()
else:
return None
Как указать тип возврата для чего-то, что может быть None
?
1 ответ:
вы ищете
Optional
.так как ваш тип возврата может быть либо
datetime
(как вернулся изdatetime.utcnow()
) илиNone
вы должны использоватьOptional[datetime]
:from typing import Optional def get_some_date(some_argument: int=None) -> Optional[datetime]: # as defined
из документации по набору текста,
Optional
- сокращенный вариант:
Optional[X]
эквивалентноUnion[X, None]
.здесь
Union[X, Y]
означает значение типаX
илиY
.
если вы хотите быть явными из-за опасений, что другие могут наткнуться на
Optional
и не понимают, что это означает, вы всегда можете использоватьUnion
:from typing import Union def get_some_date(some_argument: int=None) -> Union[datetime, None]:
но я сомневаюсь, что это хорошая идея,
Optional
- это показательное имя, и оно сохраняет несколько нажатий клавиш.как указано в комментариях @Michael0x2a
Union[T, None]
преобразуется вUnion[T, type(None)]
так что не нужно использоватьtype
здесь.визуально они могут отличаться, но программно, в обоих случаях, результат точно так же;
Union[datetime.datetime, NoneType]
будет тип, сохраненный вget_some_date.__annotations__
*:>>> from typing import get_type_hints >>> print(get_type_hints(get_some_date)) {'return': typing.Union[datetime.datetime, NoneType], 'some_argument': typing.Union[int, NoneType]}
*использовать
typing.get_type_hints
чтобы захватить объекты'__annotations__
атрибут вместо прямого доступа к нему.