Odpowiedzi:
Szukasz Optional
.
Ponieważ twoim typem zwrotu może być datetime
(jak zwrócono z datetime.utcnow()
) lub None
powinieneś 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, Optional
jest skrótem dla:
Optional[X]
jest równoważneUnion[X, None]
.
gdzie Union[X, Y]
oznacza wartość typu X
lub Y
.
Jeśli chcesz wyrazić się jednoznacznie z powodu obaw, na które inni mogą się natknąć Optional
i 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ł, Optional
jest 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 type
tutaj.
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_hints
do 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żywanieNone
w adnotacji typu jest zawsze traktowane jako równoważnetype(None)
. (typing
Dokumentacja faktycznie używaNone
w większości przypadków, ale nie tutaj, co jest przeoczeniem).