J'ai une fonction en python qui peut retourner un bool
ou un list
. Existe-t-il un moyen de spécifier les types de retour à l'aide d'indices de type.
Par exemple, est-ce la bonne façon de procéder?
def foo(id) -> list or bool:
...
J'ai une fonction en python qui peut retourner un bool
ou un list
. Existe-t-il un moyen de spécifier les types de retour à l'aide d'indices de type.
Par exemple, est-ce la bonne façon de procéder?
def foo(id) -> list or bool:
...
Réponses:
De la documentation
classe
typing.Union
Type d'union; Union [X, Y] signifie X ou Y.
Par conséquent, la bonne façon de représenter plus d'un type de données de retour est
from typing import Union
def foo(client_id: str) -> Union[list,bool]
Mais notez que la saisie n'est pas appliquée. Python continue de rester un langage à typage dynamique. La syntaxe d'annotation a été développée pour aider lors du développement du code avant sa mise en production. Comme l'indique PEP 484, "aucune vérification de type ne se produit lors de l'exécution".
>>> def foo(a:str) -> list:
... return("Works")
...
>>> foo(1)
'Works'
Comme vous pouvez le voir, je passe une valeur int et retourne une chaîne. Cependant, le __annotations__
sera réglé sur les valeurs respectives.
>>> foo.__annotations__
{'return': <class 'list'>, 'a': <class 'str'>}
Veuillez consulter le PEP 483 pour en savoir plus sur les astuces de type. Voir également Que sont les conseils de type dans Python 3.5 ?
Veuillez noter que cela n'est disponible que pour Python 3.5 et versions ultérieures. Ceci est clairement mentionné dans le PEP 484 .
La déclaration def foo(client_id: str) -> list or bool:
lorsqu'elle est évaluée, équivaut à
def foo(client_id: str) -> list:
et ne fera donc pas ce que vous voulez.
La manière native de décrire un indice de type "A ou B" est Union (merci à Bhargav Rao):
def foo(client_id: str) -> Union[list, bool]:
Je ne veux pas être le gars "Pourquoi voulez-vous faire ça quand même", mais peut-être que 2 types de retours ne sont pas ce que vous voulez:
Si vous souhaitez renvoyer un booléen pour indiquer un certain type de cas d'erreur spécial, envisagez d'utiliser des exceptions à la place. Si vous souhaitez renvoyer un bool en tant que valeur spéciale, une liste vide serait peut-être une bonne représentation. Vous pouvez également indiquer qui None
pourrait être retourné avecOptional[list]
Au cas où quelqu'un atterrirait ici à la recherche de "comment spécifier les types de valeurs de retour multiples?", Utilisez Tuple[type_value1, ..., type_valueN]
from typing import Tuple
def f() -> Tuple[dict, str]:
a = {1: 2}
b = "hello"
return a, b
Plus d'informations: https://code-examples.net/en/q/2651e60