Annotation de type de retour Python void

108

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:

  1. def foo() -> None:
    • pas logique IMO, car ce Nonen'est pas un type,
  2. def foo() -> type(None):
    • en utilisant la meilleure syntaxe que je connaisse pour obtenir NoneType,
  3. 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.

Tregoreg
la source
11
FWIW, Python n'a pas de fonctions avec le voidtype de retour. Toute fonction (ou branche dans une fonction) sans explicite returnretournera None. Je suppose que l'OP comprend cela, ce commentaire est principalement destiné aux futurs lecteurs ...
PM 2Ring
Eh bien, cette question n'est pas aussi populaire que "pourquoi ma fonction retourne-t-elle None en Python?" (J'ai posé cette question), donc la plupart des lecteurs connaissent probablement déjà le comportement par défaut. Le dilemme 1 vs 2 est résolu dans la réponse. Mais qu'en est-il de 3? Pour les "procédures", je préférerais en fait l'option 3, sans encombrement inutile (après tout, cette fonction ne renvoie rien).
Tomasz Gandor
@TomaszGandor D'accord. Lorsqu'une fonction ou une méthode ne contient aucune instruction return, il est inutile de spécifier son type de retour.
Jeyekomon

Réponses:

121

Ceci est directement issu de la documentation PEP 484 - Type Hints :

Lorsqu'elle est utilisée dans une indication de type, l'expression Noneest considérée comme équivalente à type(None).

Et, comme vous pouvez le voir, la plupart des exemples utilisent Nonecomme type de retour.

AKS
la source
22
Pour clarifier, choisissez l'option 1 ci-dessus.
Adam Nelson
13
@asmaier selon cette question qui cite PEP 484 - Type Hints NoReturn type est utilisé "... pour annoter des fonctions qui ne retournent jamais normalement. Par exemple, une fonction qui déclenche inconditionnellement une exception ..."
Rodrigo Laguna
38

TLDR: l'équivalent idiomatique d'une voidannotation de type de retour est -> None.

def foo() -> None:
    ...

Cela correspond à ce qu'une fonction sans returnou juste un simple returnévalue None.

def void_func():  # unannotated void function
    pass

print(void())  # None

Omettre le type de retour ne signifie pas qu'il n'y a pas de valeur de retour. Selon PEP 484 :

Pour une fonction cochée, l'annotation par défaut pour les arguments et pour le type de retour est Any.

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 Noneest considérée comme signifiant "est de NoneType". Cela peut être utilisé non seulement pour les types de retour, même si vous le verrez le plus souvent là-bas:

bar : None

def foo(baz: None) -> None:
    return None

Cela s'applique également aux types génériques. Par exemple, vous pouvez utiliser Nonein Generator[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 Nonesignifie type(None), vous ne devez pas utiliser ce dernier formulaire explicitement. La spécification de type hinting ne pas inclure toute forme de type(...). Il s'agit techniquement d'une expression d'exécution, et sa prise en charge dépend entièrement du vérificateur de type. Le mypyprojet envisage de retirer le support pour type(None)et le retirer de 484 ainsi.

Ou peut-être devrions-nous mettre à jour PEP 484 pour ne pas suggérer que ce type type(None)est valide et Noneque la seule orthographe est correcte? Il devrait y avoir une - et de préférence une seule - façon évidente de le faire, etc.

--- JukkaL, 18 mai 2018

MonsieurMiyagi
la source
4
Grand cri pour expliquer pourquoi la troisième option n'est en fait pas du tout une fonction vide.
никта