Risposte:
Stai cercando Optional
.
Poiché il tipo di datetime
reso 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 X
o Y
.
Se vuoi essere esplicito a causa delle preoccupazioni su cui gli altri potrebbero inciampare Optional
e 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 type
qui.
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_hints
per 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 , utilizzandoNone
all'interno di un tipo di annotazione è sempre trattato come equivalente atype(None)
. (Latyping
documentazione utilizzaNone
in realtà nella maggior parte dei casi, ma non qui, che è una svista).