Frage

Ich habe eine Funktion, bei der ich etwas mit einer Zeichenfolge tun muss.Ich benötige, dass die Funktion einen booleschen Wert zurückgibt, der angibt, ob der Vorgang erfolgreich war oder nicht, und ich muss außerdem die geänderte Zeichenfolge zurückgeben.

In C# würde ich einen Out-Parameter für die Zeichenfolge verwenden, aber in Python gibt es kein Äquivalent.Ich bin noch sehr neu in Python und das Einzige, was mir einfällt, ist, ein Tupel mit dem booleschen Wert und der geänderten Zeichenfolge zurückzugeben.

Verwandte Frage: Ist es pythonisch, dass eine Funktion mehrere Werte zurückgibt?

War es hilfreich?

Lösung

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

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

Andere Tipps

Warum nicht eine Ausnahme auslösen, wenn der Vorgang nicht erfolgreich war?Persönlich bin ich eher der Meinung, dass man, wenn man mehr als einen Wert von einer Funktion zurückgeben muss, noch einmal darüber nachdenken sollte, ob man die Dinge richtig macht oder ein Objekt verwendet.

Aber um es direkt auf den Punkt zu bringen: 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 konnte und möglicherweise schwer zu debuggende Fehler erhält.

Gibt ein Tupel zurück.

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

success, modified_string = f(something)

Die Rückgabe eines Tupels ist in Python die übliche Vorgehensweise.

Eine gute Vorgehensweise ist das Auslösen einer Ausnahme bei einem Fehler. Wenn Sie viele verschiedene Werte zurückgeben, können Sie ein Tupel zurückgeben.Für den speziellen Fall, den Sie zitieren, verfolge ich oft einen Zwischenansatz:Gibt bei Erfolg die geänderte Zeichenfolge und bei Fehler None zurück.Ich bin ein so unrekonstruierter C-Programmierer, dass ich bei einem Fehler einen NULL-Zeiger auf char zurückgeben möchte.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top