variable - python type hint json



Como especificar o tipo de retorno "anulável" com dicas de tipo (1)

Suponha que eu tenha uma função:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

Como eu especifico o tipo de retorno para algo que pode ser None ?


Você está procurando por Optional .

Como seu tipo de retorno pode ser datetime (conforme retornado de 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

Na documentação sobre digitação, Optional é uma abreviação para:

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 se deparar com o Optional e não perceber o seu significado, você sempre pode usar o Union :

from typing import Union

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

Mas duvido que seja uma boa ideia, Optional é um nome indicativo e salva algumas teclas.

Como apontado nos comentários de @ Michael0x2a, a Union[T, None] é transformada em Union[T, type(None)] portanto, não é necessário usar o type aqui.

Visualmente, estes 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 atributo __annotations__ dos objetos em vez de acessá-lo diretamente.





type-hinting