Réponses:
Vous cherchez Optional
.
Étant donné que votre type de retour peut être datetime
(comme renvoyé 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
De la documentation sur la saisie, Optional
est un raccourci pour:
Optional[X]
équivaut àUnion[X, None]
.
où Union[X, Y]
signifie une valeur de type X
ou Y
.
Si vous voulez être explicite en raison de préoccupations sur lesquelles d'autres pourraient trébucher Optional
et ne pas se rendre compte de 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
c'est un nom indicatif et cela permet d'économiser quelques frappes.
Comme indiqué dans les commentaires de @ Michael0x2a Union[T, None]
est transformé en Union[T, type(None)]
donc pas besoin d'utiliser type
ici.
Visuellement, ceux-ci peuvent différer mais par programme, dans les deux cas, le résultat est exactement le même ; 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 l' __annotations__
attribut des objets au lieu d'y accéder directement.
Optional[T]
type est bien connu dans la communauté de programmation fonctionnelle. Le lecteur ne saura pas seulement que cela signifie Union[T, None]
, mais reconnaîtra également le modèle d'utilisation que la fonction doit renvoyer None lorsqu'il n'y a pas de réponse significative, qu'il y a une erreur ou que le résultat n'est pas trouvé.
Union[datetime, type(None)]
àUnion[datetime, None]
- selon PEP 484 , en utilisantNone
dans une annotation de type est toujours considéré comme équivalent àtype(None)
. (Latyping
documentation utiliseNone
en fait dans la plupart des cas, mais pas ici, ce qui est un oubli).