web-dev-qa-db-fra.com

Comment annoter des types de valeurs de retour multiples?

Comment utiliser les indications de type pour annoter une fonction qui renvoie un Iterable qui produit toujours deux valeurs: un bool et un str? L'indice Tuple[bool, str] Est proche, sauf qu'il limite le type de valeur de retour à un tuple, pas à un générateur ou à un autre type d'itérable.

Je suis surtout curieux parce que je voudrais annoter une fonction foo() qui est utilisée pour renvoyer plusieurs valeurs comme ceci:

always_a_bool, always_a_str = foo()

Habituellement, des fonctions comme foo() font quelque chose comme return a, b (Qui retourne un tuple), mais j'aimerais que l'indicateur de type soit suffisamment flexible pour remplacer le tuple retourné par un générateur ou une liste ou autre chose .

39
Richard Hansen

Vous retournez toujours un objet; en utilisant return one, two renvoie simplement un Tuple.

Donc oui, -> Tuple[bool, str] est tout à fait correct.

Seulement le type Tuple vous permet de spécifier un nombre fixe d'éléments, chacun avec un type distinct. Vous devriez vraiment renvoyer un Tuple, toujours, si votre fonction produit un nombre fixe de valeurs de retour, surtout lorsque ces valeurs sont des types spécifiques et distincts.

D'autres types de séquences devraient avoir une spécification de type un pour un nombre variable d'éléments, donc typing.Sequence ne convient pas ici. Voir aussi Quelle est la différence entre les listes et les tuples?

Les tuples sont des structures de données hétérogènes (c'est-à-dire que leurs entrées ont des significations différentes), tandis que les listes sont des séquences homogènes. Les tuples ont une structure, les listes ont un ordre.

Le système d'indices de type de Python adhère à cette philosophie, il n'y a actuellement aucune syntaxe pour spécifier un itérable de longueur fixe et contenant des types spécifiques à des positions spécifiques.

Si vous devez spécifier que tout itérable fera l'affaire, alors le mieux que vous puissiez faire est:

-> Iterable[Union[bool, str]]

à quel point l'appelant peut s'attendre à des booléens et des chaînes dans n'importe quel ordre, et de longueur inconnue (n'importe où entre 0 et l'infini).

49
Martijn Pieters