Jak określić typ zwracany „dopuszcza wartość null” za pomocą wskazówek dotyczących typu


177

Załóżmy, że mam funkcję:

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

Jak określić typ zwracania czegoś, co może być None?

Odpowiedzi:


279

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żne Union[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.


10
Możesz uprościć Union[datetime, type(None)]do Union[datetime, None]- zgodnie z PEP 484 używanie Nonew adnotacji typu jest zawsze traktowane jako równoważne type(None). ( typingDokumentacja faktycznie używa Nonew większości przypadków, ale nie tutaj, co jest przeoczeniem).
Michael0x2a

@ Michael0x2a tego nie wiedział, ciekawe. Dodałem :)
Dimitris Fasarakis Hilliard

4
Poszedłem naprzód i przesłałem poprawkę, aby to naprawić właśnie teraz, więc mam nadzieję, że dokumentacja będzie bardziej spójna w tej sprawie w najbliższej przyszłości!
Michael0x2a,

1
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.
wks
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.