Подтвердить что ты не робот

Как указать тип возвращаемого типа с нулевым типом с подсказками типа

Предположим, что у меня есть функция:

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?

4b9b3361

Ответ 1

Так как ваш тип возврата может быть 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__ объектов вместо прямого доступа к нему.