Відповіді:
Ви шукаєте 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в більшості випадків, але тут немає, що є недоліком).