Vous êtes à la recherche de Optional
.
Puisque votre type de retour peut être soit datetime
(tel que renvoyé par 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
Extrait de la documentation sur la saisie, Optional
est une abréviation de :
Optional[X]
est équivalent à Union[X, None]
.
où Union[X, Y]
signifie une valeur de type X
ou Y
.
Si vous voulez être explicite parce que vous craignez que d'autres personnes ne tombent sur Optional
et ne pas réaliser sa signification, vous pouvez toujours utiliser Union
:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
Mais je doute que ce soit une bonne idée, Optional
est un nom indicatif et il permet d'économiser quelques frappes de clavier.
Comme indiqué dans les commentaires par @Michael0x2a <code>Union[T, None]</code> est transformé en <code>Union[T, type(None)]</code> il n'est donc pas nécessaire d'utiliser <code>type</code> ici.
Visuellement, ils peuvent être différents, mais en termes de programmation, dans les deux cas, le résultat est le suivant exactement la même chose ; Union[datetime.datetime, NoneType]
sera le type stocké 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]}
* Utilisez typing.get_type_hints
pour saisir les objets __annotations__
au lieu d'y accéder directement.
3 votes
Mauvaise dénomination appliquée dans
typing
paquet. Il peut s'agirNullable[X]
comme un équivalent pourUnion[None, X]
. Il n'est donc pas nécessaire d'expliquer queOptional
n'est pas pour l'argument facultatif docs.python.org/3/library/typing.html#typing.Optional