Usted está buscando Optional
.
Dado que su tipo de devolución puede ser datetime
(tal como se devuelve desde datetime.utcnow()
) o None
debe usar Optional[datetime]
:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
De la documentación sobre mecanografía, Optional
se abrevia para:
Optional[X]
es equivalente a Union[X, None]
.
donde Union[X, Y]
significa un valor de tipo X
o Y
.
Si desea ser explícito debido a las preocupaciones con las que otros podrían tropezar Optional
y no darse cuenta de su significado, siempre puede usar Union
:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
Pero dudo que esta sea una buena idea, Optional
es un nombre indicativo y ahorra un par de pulsaciones de teclas.
Como se señaló en los comentarios de @ Michael0x2a, Union[T, None]
se transforma para Union[T, type(None)]
que no sea necesario usarlo type
aquí.
Visualmente estos pueden diferir pero programáticamente, en ambos casos, el resultado es exactamente el mismo ; Union[datetime.datetime, NoneType]
será el tipo almacenado en 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]}
* Use typing.get_type_hints
para agarrar el __annotations__
atributo de los objetos en lugar de acceder a él directamente.
Union[datetime, type(None)]
aUnion[datetime, None]
- de acuerdo con PEP 484 , el usoNone
dentro de una anotación de tipo siempre se trata como equivalente atype(None)
. (Latyping
documentación realmente se usaNone
en la mayoría de los casos, pero no aquí, lo cual es un descuido).Optional[T]
tipo es bien conocido en la comunidad de programación funcional. El lector no solo sabrá lo que significaUnion[T, None]
, sino que también reconocerá el patrón de uso que la función devolverá Ninguno cuando no haya una respuesta significativa, haya un error o no se encuentre el resultado.