78 votes

Comment spécifier un type de retour "nullable" avec des indicateurs de type

Supposons que j'ai une fonction:

 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
 

Comment puis-je spécifier le type de retour pour quelque chose qui peut être None ?

119voto

Jim Points 8793

Vous êtes à la recherche pour Optional.

Depuis votre type de retour peut être soit datetime (retourné à partir de datetime.utcnow()) ou None vous devez utiliser Optional[datetime]:

from typing import Optional

def get_some_date(some_argument: int=None) -> Optional[datetime]:
    # as defined

À partir de la documentation sur le typage, Optional est un raccourci pour:

Optional[X] est équivalent à Union[X, None].

Union[X, Y] signifie une valeur de type X ou Y.


Si vous voulez être explicite, en raison des inquiétudes que d'autres pourraient tomber Optional et de ne pas réaliser ce sens, vous pouvez toujours utiliser Union:

from typing import Union

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

Mais je doute que cela soit une bonne idée, Optional a titre indicatif, le nom et il n'est sauver un couple de touches.

Comme l'a souligné dans les commentaires de @Michael0x2a Union[T, None] est changée à l' Union[T, type(None)] , donc pas besoin d'utiliser type ici.

Visuellement ces peuvent différer, mais par programmation, dans les deux cas, le résultat est exactement le même; Union[datetime.datetime, NoneType] sera le type stockés dans 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]}

*Utiliser typing.get_type_hints pour attraper les objets' __annotations__ attribut au lieu d'y accéder directement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: