Відповіді:
Ви шукаєте 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__
атрибут об'єктів, а не отримувати прямий доступ до нього.
Optional[T]
Типу добре відомий в співтоваристві функціонального програмування. Читач не тільки дізнається, що це означає Union[T, None]
, але й розпізнає схему використання, що функція поверне функцію None, коли немає змістовної відповіді, є помилка або результат не знайдений.
Union[datetime, type(None)]
доUnion[datetime, None]
- по PEP 484 , використовуючиNone
в якості анотації типу завжди розглядається як еквівалентtype(None)
. (typing
Документація насправді використовуєтьсяNone
в більшості випадків, але тут немає, що є недоліком).