En python 3.x, il est courant d'utiliser l'annotation de type de retour d'une fonction, telle que:
def foo() -> str:
return "bar"
Quelle est l'annotation correcte pour le type "void"?
J'envisage 3 options:
def foo() -> None:
- pas logique IMO, car ce
None
n'est pas un type,
- pas logique IMO, car ce
def foo() -> type(None):
- en utilisant la meilleure syntaxe que je connaisse pour obtenir
NoneType
,
- en utilisant la meilleure syntaxe que je connaisse pour obtenir
def foo():
- omettre les informations de type de retour explicites.
L'option 2. me semble la plus logique, mais j'ai déjà vu quelques exemples de 1.
python
annotations
void
type-hinting
Tregoreg
la source
la source
void
type de retour. Toute fonction (ou branche dans une fonction) sans explicitereturn
retourneraNone
. Je suppose que l'OP comprend cela, ce commentaire est principalement destiné aux futurs lecteurs ...Réponses:
Ceci est directement issu de la documentation PEP 484 - Type Hints :
Et, comme vous pouvez le voir, la plupart des exemples utilisent
None
comme type de retour.la source
NoReturn
type est utilisé "... pour annoter des fonctions qui ne retournent jamais normalement. Par exemple, une fonction qui déclenche inconditionnellement une exception ..."TLDR: l'équivalent idiomatique d'une
void
annotation de type de retour est-> None
.Cela correspond à ce qu'une fonction sans
return
ou juste un simplereturn
évalueNone
.Omettre le type de retour ne signifie pas qu'il n'y a pas de valeur de retour. Selon PEP 484 :
Cela signifie que la valeur est considérée comme typée dynamiquement et prend en charge statiquement toute opération . C'est pratiquement le sens opposé de
void
.L'indication de type en Python ne nécessite pas strictement de types réels. Par exemple, les annotations peuvent utiliser des chaînes de noms de type:
Union[str, int]
,Union[str, 'int']
,'Union[str, int]'
et diverses variantes sont équivalentes.De même, l'annotation de type
None
est considérée comme signifiant "est deNoneType
". Cela peut être utilisé non seulement pour les types de retour, même si vous le verrez le plus souvent là-bas:Cela s'applique également aux types génériques. Par exemple, vous pouvez utiliser
None
inGenerator[int, None, None]
pour indiquer qu'un générateur ne prend ni ne renvoie de valeurs.Même si PEP 484 suggère que cela
None
signifietype(None)
, vous ne devez pas utiliser ce dernier formulaire explicitement. La spécification de type hinting ne pas inclure toute forme detype(...)
. Il s'agit techniquement d'une expression d'exécution, et sa prise en charge dépend entièrement du vérificateur de type. Lemypy
projet envisage de retirer le support pourtype(None)
et le retirer de 484 ainsi.la source