Odpowiedzi:
Szukasz Optional.
Ponieważ twoim typem zwrotu może być datetime(jak zwrócono z datetime.utcnow()) lub Nonepowinieneś użyć Optional[datetime]:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
Z dokumentacji dotyczącej pisania, Optionaljest skrótem dla:
Optional[X]jest równoważneUnion[X, None].
gdzie Union[X, Y]oznacza wartość typu Xlub Y.
Jeśli chcesz wyrazić się jednoznacznie z powodu obaw, na które inni mogą się natknąć Optionali nie zdawać sobie sprawy z ich znaczenia, zawsze możesz użyć Union:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
Ale wątpię, czy to dobry pomysł, Optionaljest to nazwa orientacyjna i oszczędza kilka naciśnięć klawiszy.
Jak wskazano w komentarzach @ Michael0x2a, Union[T, None]jest to przekształcone, Union[T, type(None)]więc nie ma potrzeby używania typetutaj.
Wizualnie mogą się one różnić, ale programowo, w obu przypadkach wynik jest dokładnie taki sam ; Union[datetime.datetime, NoneType]będzie typem przechowywanym w 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]}
* Służy typing.get_type_hintsdo przechwytywania __annotations__atrybutu obiektu zamiast bezpośredniego dostępu.
Optional[T]Typ jest znany w społeczności programowania funkcjonalnego. Czytelnik nie tylko będzie wiedział, że to oznacza Union[T, None], ale także rozpozna wzorzec użycia, który funkcja zwróci None, gdy nie ma sensownej odpowiedzi, wystąpił błąd lub wynik nie został znaleziony.
Union[datetime, type(None)]doUnion[datetime, None]- zgodnie z PEP 484 używanieNonew adnotacji typu jest zawsze traktowane jako równoważnetype(None). (typingDokumentacja faktycznie używaNonew większości przypadków, ale nie tutaj, co jest przeoczeniem).