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

StackOverflow https://stackoverflow.com/questions/38508

  •  09-06-2019
  •  | 
  •  

Question

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.

Question connexe: Est-il pythonic pour fonction de renvoyer plusieurs valeurs?

Était-ce utile?

La solution

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

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

Autres conseils

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.

De retour d'un n-uplet.

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

success, modified_string = f(something)

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

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:de 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top