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.
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
@ Michael0x2a nie wiedział tego, interesujące. Dodano go :) –
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