Réponses:
Vous cherchez Optional.
Étant donné que votre type de retour peut être datetime(comme renvoyé de datetime.utcnow()) ou Nonevous 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, Optionalest un raccourci pour:
Optional[X]équivaut àUnion[X, None].
où Union[X, Y]signifie une valeur de type Xou Y.
Si vous voulez être explicite en raison de préoccupations sur lesquelles d'autres pourraient trébucher Optionalet 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, Optionalc'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 typeici.
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_hintspour 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 utilisantNonedans une annotation de type est toujours considéré comme équivalent àtype(None). (Latypingdocumentation utiliseNoneen fait dans la plupart des cas, mais pas ici, ce qui est un oubli).