78 votes

Quelle est la meilleure façon de renvoyer plusieurs valeurs à partir d'une fonction en Python?

J'ai une fonction où j'ai besoin de faire quelque chose pour une chaîne de caractères. J'ai besoin de la fonction pour retourner un booléen indiquant si l'opération a réussi, et j'ai aussi besoin de retourner la chaîne modifiée.

En C#, je voudrais utiliser un paramètre de la chaîne, mais il n'y a pas d'équivalent en Python. Je suis encore très nouveau pour Python et la seule chose que je peux penser à est de retour d'un n-uplet avec l'opérateur booléen et chaîne modifiée.

Liés à la question: Est-il pythonic pour fonction de renvoyer plusieurs valeurs?

136voto

John Millikin Points 86775
def f(in_str):
    out_str = in_str.upper()
    return True, out_str # Creates tuple automatically

succeeded, b = f("a") # Automatic tuple unpacking

30voto

Jason Baker Points 56682

Pourquoi ne pas lancer une exception si l'opération n'a pas réussi? Personnellement, j'ai tendance à être d'avis que, si vous avez besoin de retourner plus d'une valeur à partir d'une fonction, vous devriez reconsidérer si vous faites les choses de la bonne façon ou d'utiliser un objet.

Mais plus directement, si vous jetez une exception, vous êtes forçant à faire face au problème. Si vous essayez de retourner une valeur qui indique un échec, c'est très bien possible que quelqu'un puisse pas vérifier la valeur et à la fin avec quelques potentiellement difficiles à déboguer les erreurs.

17voto

rmmh Points 4361

De retour d'un n-uplet.

def f(x):
    # do stuff
    return (True, modified_string)

success, modified_string = f(something)

7voto

Chris Upchurch Points 10484

De retour d'un n-uplet est la manière habituelle de le faire en Python.

3voto

tuxedo Points 299

Lancer une exception pour l'échec est une bonne façon de procéder, et si vous êtes de retour beaucoup de valeurs différentes, vous pouvez retourner un n-uplet. Pour le cas précis que vous êtes en citant, je prends souvent une approche intermédiaire: le retour de la modification de la chaîne de caractères en cas de succès, et Aucun retour en cas d'échec. Je suis assez d'une intouchée programmeur C à vouloir retourner un pointeur NULL char en cas d'échec.

Si j'avais écrit une routine pour être utilisé comme partie d'une grande bibliothèque et consommés par d'autres développeurs, je voudrais lever une exception en cas d'échec. Quand je mange mon propre dogfood, je vais probablement retourner et de types différents test sur le retour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X