web-dev-qa-db-fra.com

Comment spécifier plusieurs types de retour à l'aide d'indicateurs de type

J'ai une fonction dans python qui peut renvoyer un bool ou un list. Est-il possible de spécifier les types de retour à l'aide d'indicateurs de type?.

Par exemple, est-ce la bonne façon de le faire?

def foo(id) -> list or bool:
      ...
124
Yahya Uddin

De la documentation

classe typing.Union

Type d'union; Union [X, Y] signifie soit X, soit Y.

Par conséquent, la manière appropriée de représenter plusieurs types de données de retour est la suivante:

from typing import Union


def foo(client_id: str) -> Union[list,bool]

Mais notez que la frappe n'est pas imposée. Python reste un langage à typage dynamique. La syntaxe d'annotation a été développée pour aider au développement du code avant sa publication en production. Comme l'indique PEP 484, "aucune vérification de type n'a lieu au moment 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 str. Cependant, le __annotations__ sera réglé sur les valeurs respectives.

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}

Passez par PEP 48 pour plus d'informations sur les indicateurs de type. Voir également Que sont les indications de type dans Python 3.5 ?

Veuillez noter que ceci est disponible uniquement pour Python 3.5 et supérieur. Ceci est clairement mentionné dans PEP 484 .

188
Bhargav Rao

L’instruction def foo(client_id: str) -> list or bool: lorsqu’elle est évaluée est équivalente à 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 "soit A, soit B" est nion (grâce à Bhargav Rao):

def foo(client_id: str) -> Union[list, bool]:

Je ne veux pas être le type "Pourquoi voulez-vous faire cela quand même", mais peut-être qu'avoir 2 types de retour n'est pas ce que vous voulez:

Si vous souhaitez renvoyer un booléen pour indiquer un type de cas d'erreur spécial, envisagez plutôt d'utiliser Exceptions. Si vous voulez renvoyer une valeur booléenne à une valeur spéciale, une liste vide serait peut-être une bonne représentation. Vous pouvez également indiquer que None pourrait être renvoyé avec Optional[list]

16
Felk