Cómo especificar el tipo de retorno "nullable" con sugerencias de tipo


Supongamos que tengo una función:

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

¿Cómo puedo especificar el tipo de retorno para algo que puede ser None?

Author: Jim Fasarakis Hilliard, 2016-09-10

1 answers

Usted está buscando Optional.

Dado que su tipo de devolución puede ser datetime (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, {[3] } es la abreviatura de:

Optional[X] es equivalente a Union[X, None].

Donde Union[X, Y] significa un valor de tipo X o Y.


Si quieres ser explícito debido a la preocupación de que otros puedan tropezar con Optional y no darse cuenta de su significado, siempre podría 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 guarda un par de pulsaciones de teclas.

Como se señala en los comentarios de @ Michael0x2a Union[T, None] se transforma a Union[T, type(None)] así que no hay necesidad de usar 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]}

*Uso typing.get_type_hints para obtener el atributo objects' __annotations__ en lugar de acceder a él directamente.

 96
Author: Jim Fasarakis Hilliard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-14 08:03:37