Risposte:
Stai cercando Optional.
Poiché il tipo di datetimereso può essere (come restituito da datetime.utcnow()) o Noneè necessario utilizzare Optional[datetime]:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
Dalla documentazione sulla digitazione, Optionalè una scorciatoia per:
Optional[X]è equivalente aUnion[X, None].
dove Union[X, Y]significa un valore di tipo Xo Y.
Se vuoi essere esplicito a causa delle preoccupazioni su cui gli altri potrebbero inciampare Optionale non rendersi conto del suo significato, puoi sempre usare Union:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
Ma dubito che sia una buona idea, Optionalè un nome indicativo e salva un paio di battute.
Come sottolineato nei commenti di @ Michael0x2a Union[T, None]è stato trasformato in Union[T, type(None)]così non è necessario utilizzare typequi.
Visivamente questi potrebbero differire ma programmaticamente, in entrambi i casi, il risultato è esattamente lo stesso ; Union[datetime.datetime, NoneType]sarà il tipo memorizzato in 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]}
* Utilizzare typing.get_type_hintsper afferrare l' __annotations__attributo degli oggetti invece di accedervi direttamente.
Optional[T]tipo è ben noto nella comunità di programmazione funzionale. Il lettore non solo saprà che ciò significa Union[T, None], ma riconoscerà anche il modello di utilizzo che la funzione deve restituire None quando non c'è una risposta significativa, c'è un errore o il risultato non viene trovato.
Union[datetime, type(None)]alUnion[datetime, None]- secondo PEP 484 , utilizzandoNoneall'interno di un tipo di annotazione è sempre trattato come equivalente atype(None). (Latypingdocumentazione utilizzaNonein realtà nella maggior parte dei casi, ma non qui, che è una svista).