Respostas:
Você está procurando Optional.
Como seu tipo de retorno pode ser datetime(como retornado datetime.utcnow()) ou Nonevocê 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 aUnion[X, None].
onde Union[X, Y]significa um valor do tipo Xou Y.
Se você quiser ser explícito devido a preocupações de que outras pessoas possam tropeçar Optionale 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, Optionalseja 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 typeaqui.
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_hintspara pegar o __annotations__atributo dos objetos em vez de acessá-lo diretamente.
Optional[T]tipo é bem conhecido na comunidade de programação funcional. O leitor não apenas saberá o que significa Union[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.
Union[datetime, type(None)]paraUnion[datetime, None]- de acordo com o PEP 484 , usarNoneem uma anotação de tipo sempre é tratado como equivalentetype(None). (Atypingdocumentação realmente usaNonena maioria dos casos, mas não aqui, o que é uma supervisão).