Come specificare il tipo restituito "nullable" con suggerimenti sul tipo


177

Supponiamo che io abbia una funzione:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

Come posso specificare il tipo restituito per qualcosa che può essere None?

Risposte:


279

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 a Union[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.


10
È possibile semplificare Union[datetime, type(None)]al Union[datetime, None]- secondo PEP 484 , utilizzando Noneall'interno di un tipo di annotazione è sempre trattato come equivalente a type(None). (La typingdocumentazione utilizza Nonein realtà nella maggior parte dei casi, ma non qui, che è una svista).
Michael0x2a,

@ Michael0x2a non lo sapeva, interessante. Aggiunto :)
Dimitris Fasarakis Hilliard

4
Sono andato avanti e ho inviato una patch per risolvere il problema proprio ora, quindi spero che i documenti saranno più coerenti su questo nel prossimo futuro!
Michael0x2a

1
Il 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.
settimana
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.