2016-09-10 12 views

Odpowiedz

58

Ponieważ rodzaj powrotu może być albo datetime (jak wrócił z datetime.utcnow()) lub None należy użyć Optional[datetime]:

from typing import Optional 

def get_some_date(some_argument: int=None) -> Optional[datetime]: 
    # as defined 

z dokumentacji, Optional jest skrótem dla:

Optional[X] jest równoważna do Union[X, None].

gdzie Union[X, Y] oznacza wartość typu X lub Y.


Jeśli chcesz być jednoznaczne ze względu na obawy, że inni mogą natknąć się na Optional i nie zdają sobie sprawy, że to znaczy, zawsze można użyć Union:

from typing import Union 

def get_some_date(some_argument: int=None) -> Union[datetime, None]: 

Ale wątpię, że jest to dobry pomysł, Optional to nazwa orientacyjna, która zapisuje kilka naciśnięć klawiszy.

Jak zauważył w komentarzach przez @ Michael0x2a Union[T, None] jest przekształcona do Union[T, type(None)] więc nie ma potrzeby korzystania type tutaj.

Wizualnie mogą się one różnić, ale programowo, w obu przypadkach wynikiem jest dokładnie taki sam; Union[datetime.datetime, NoneType] będzie typ przechowywane 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]} 

* Zastosowanie typing.get_type_hints chwycić przedmioty __annotations__ atrybut zamiast dostępu do niego bezpośrednio.

+0

Możesz uprościć 'Union [datetime, type (None)]' do 'Union [datetime, None]' - zgodnie z [PEP 484] (https://www.python.org/dev/peps/pep -0484/# using-none), użycie 'None' w adnotacji typu jest zawsze traktowane jako równoważne' type (None) '. (Dokumentacja typu "pisząc" faktycznie używa "Brak" w większości przypadków, ale nie tutaj, co jest niedopatrzeniem). – Michael0x2a

+0

@ Michael0x2a nie wiedział tego, interesujące. Dodano go :) –

+1

Poszedłem dalej i przesłałem [łatkę] (http://bugs.python.org/issue28073), aby rozwiązać ten problem właśnie teraz, więc miejmy nadzieję, że dokumenty będą bardziej spójne na ten temat w najbliższej przyszłości! – Michael0x2a

Powiązane problemy