Você está procurando Optional
.
Como seu tipo de retorno pode ser datetime
(como retornado datetime.utcnow()
) ou None
você deve usar Optional[datetime]
:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
A partir da documentação sobre digitação, Optional
é uma abreviação de:
Optional[X]
é equivalente a Union[X, None]
.
onde Union[X, Y]
significa um valor do tipo X
ou Y
.
Se você quiser ser explícito devido a preocupações de que outras pessoas possam tropeçar Optional
e não perceber o significado, sempre use Union
:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
Mas duvido que seja uma boa ideia, Optional
seja um nome indicativo e economize algumas teclas.
Como apontado nos comentários de @ Michael0x2a, Union[T, None]
é transformado para Union[T, type(None)]
que não seja necessário usar type
aqui.
Visualmente, eles podem diferir, mas programaticamente, em ambos os casos, o resultado é exatamente o mesmo ; Union[datetime.datetime, NoneType]
será o tipo armazenado em 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 pegar o __annotations__
atributo dos objetos em vez de acessá-lo diretamente.
Union[datetime, type(None)]
paraUnion[datetime, None]
- de acordo com o PEP 484 , usarNone
em uma anotação de tipo sempre é tratado como equivalentetype(None)
. (Atyping
documentação realmente usaNone
na maioria dos casos, mas não aqui, o que é uma supervisão).Optional[T]
tipo é bem conhecido na comunidade de programação funcional. O leitor não apenas saberá o que significaUnion[T, None]
, mas também reconhecerá o padrão de uso que a função retornará None quando não houver resposta significativa, houver um erro ou o resultado não for encontrado.