Was ist der beste Weg, um mehrere Werte von einer Funktion in Python zurückzugeben?


74

Ich habe eine Funktion, bei der ich etwas mit einem String machen muss. Ich benötige die Funktion, um einen Booleschen Wert zurückzugeben, der angibt, ob die Operation erfolgreich war oder nicht, und ich muss auch die geänderte Zeichenfolge zurückgeben.

In C # würde ich einen out-Parameter für die Zeichenfolge verwenden, aber in Python gibt es keine Entsprechung. Ich bin noch sehr neu in Python und das einzige, was ich mir vorstellen kann, ist, ein Tupel mit dem booleschen und modifizierten String zurückzugeben.

Verwandte Frage: Ist es für eine Funktion pythonisch, mehrere Werte zurückzugeben?


Ich habe einen Link zu verwandten Fragen hinzugefügt
jfs

Antworten:


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

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

3
Ich möchte hinzufügen, dass der vorliegende Ansatz auch mit Arrays und Matrizen funktioniert
Nicholas

30

Warum nicht eine Ausnahme auslösen, wenn die Operation nicht erfolgreich war? Persönlich bin ich eher der Meinung, dass Sie, wenn Sie mehr als einen Wert von einer Funktion zurückgeben müssen, überlegen sollten, ob Sie die Dinge richtig machen oder ein Objekt verwenden.

Aber direkter auf den Punkt gebracht: Wenn Sie eine Ausnahme auslösen, zwingen Sie sie, sich mit dem Problem zu befassen. Wenn Sie versuchen, einen Wert zurückzugeben, der auf einen Fehler hinweist, ist es sehr gut möglich, dass jemand den Wert nicht überprüfen kann und möglicherweise schwer zu debuggende Fehler auftreten.


1
Einverstanden. Pythonic-Funktionen sollten keine Codes zurückgeben, um "Erfolg / Misserfolg" anzuzeigen, wenn einer weitaus wahrscheinlicher ist als der andere. Im Ausnahmefall einfach eine Ausnahme auslösen. Abgesehen davon, geben Sie bei Bedarf einfach ein Tupel zurück: "return a, b, c"
Dan Lenski

8
Ich mag keine Funktionen, die Ausnahmen für nicht schwerwiegende Fehler auslösen.
Seun Osewa

4
Wenn Fehler häufig auftreten, ist die Rückgabe der Fehlerinformationen in einem Tupel ein guter Ansatz. Beispiel wäre eine Funktion, die Sie mehrmals mit Testwerten aufrufen, um einen "guten" Wert zu finden. Sie erwarten, dass er viele Male fehlschlägt und schließlich einen guten Wert findet. In diesem Fall nur "Ergebnis, Grund zurückgeben", anstatt eine Ausnahme auszulösen.
Graham

17

Gib ein Tupel zurück.

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

success, modified_string = f(something)

Mein Partner argumentiert mit mir über Wetter sollte hinzufügen (und ) wann Multi Werte zurückgeben wollen. Wenn ich Code in Pycharm schreibe, zeigt die Idee das Abnutzen in Zeilen, in denen mehrere Werte zurückgegeben werden (), aber wir können die Codestilregel bei pep8 nicht finden. Wie denkst du darüber? Vielen Dank.
Vi.Ci


3

Das Auslösen einer Fehlerausnahme ist eine gute Möglichkeit, um fortzufahren. Wenn Sie viele verschiedene Werte zurückgeben, können Sie ein Tupel zurückgeben. Für den speziellen Fall, den Sie zitieren, verfolge ich häufig einen Zwischenansatz: Geben Sie die geänderte Zeichenfolge bei Erfolg zurück und bei Fehler keine zurück. Ich bin genug von einem nicht rekonstruierten C-Programmierer, um bei einem Fehler einen NULL-Zeiger auf char zurückgeben zu wollen.

Wenn ich eine Routine schreiben würde, die als Teil einer größeren Bibliothek verwendet und von anderen Entwicklern verwendet werden soll, würde ich bei einem Fehler eine Ausnahme auslösen. Wenn ich mein eigenes Hundefutter esse, werde ich wahrscheinlich verschiedene Arten zurückgeben und bei der Rückkehr testen.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.