Как указать тип возврата" 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 60

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__ атрибут вместо прямого доступа к нему.