2012-06-20 4 views
7

Sehr einfache Frage:Bevorzugter Python (oder irgendeine Sprache, wirklich) Stil: Sollte sonst verwendet werden, wenn if returns?

Insbesondere in Python (da Python hat eigentlich „dringend empfohlen“ Stil-Richtlinien in PEP 8 angegeben, aber wirklich das gilt für jede Sprache), sollte eine Funktion mit einer if-Klausel, die immer zurückkehrt hat die Alternative Code in einer else Klausel oder nicht? Mit anderen Worten, func_style_one() und func_style_two() im folgenden Code ist (natürlich) genau äquivalent:

def func_style_one(): 
    if some_conditional_function(): 
     do_something() 
     return something() 
    else: 
     do_something_else() 
     return something_else() 

def func_style_two(): 
    if some_conditional_function(): 
     do_something() 
     return something() 
    do_something_else() 
    return something_else() 

Offensichtlich ist der beste und lesbare Stil hängt von der Situation und Meinungen variiert stark, auf dem besser, aber ich frage, was von der Core-Python-Community besonders bevorzugt wird. (z. B. Welche wird häufiger in der Standardbibliothek verwendet, alle anderen Dinge sind gleich?)

+2

Ich neige dazu, die zweite –

+1

Ich denke, die zweite ist sicherer. Weniger anfällig für das Ändern eines Else während eines Refactors und das versehentliche Erstellen eines Codepfads ohne Rückgabewert. –

+0

Wenn all das Äquivalent des else zurückgibt, dann das erste. Wenn das andere zusätzliche Berechnungen durchführt - das zweite. –

Antwort

3

Als Faustregel sollten Sie immer vermeiden, unnötige Komplexität zu Ihrem Code hinzuzufügen, unabhängig von der Sprache. Es ist auch oft eine gute Idee, Ihren Code in semantisch bedeutsame Unterabschnitte aufzuteilen.

Angesichts dieser Heuristiken gibt es keine endgültige Antwort. Es läuft wirklich darauf hinaus, was Sie erreichen wollen.

Ich werde dies mit Beispielen demonstrieren.

Wenn wir eine Funktion haben, die für verschiedene Fehlerbedingungen, bevor Sie fortfahren prüft, könnte es sinnvoll, sie zu schreiben, ohne else:

def do_stuff(): 
    if error1(): 
     return cleanup_and_fail() 
    return ok() 

Das ist besser, als man oft mehrere Fehler in ähnlicher Weise am Ende Einchecken eine Sequenz:

def do_stuff(): 
    if error1(): 
     return cleanup_and_fail() 
    if error2(): 
     return do_different_cleanup_and_fail() 
    return ok() 

Allerdings, wenn Ihre Funktion stattdessen Zweige gleich zwei Zweige, könnte es semantisch mehr Sinn für Sie anders machen:

Dies ist, weil Sie oft mehrere andere Optionen mit elif Zugabe am Ende:

def do_stuff(): 
    if option1(): 
     return do_option1() 
    elif: 
     return do_option2() 
    else: 
     return do_option3() 

Zusammengefasst: Man denke über die Semantik des Codes und wählen Syntax entsprechend.

+1

Danke für die Antwort. Dies ist typischerweise das, was ich tue, ich habe mich nur gefragt, ob es einen Konsens gab, z.B. WWGD (was würde Guido tun?). Aber es ist gut zu wissen, dass andere Programmierer ähnlich denken. –

+0

Zumindest denke ich schon. Außerdem schätze ich es sehr, dass Sie PEP 8 umarmen - die Leute lesen Stilhilfen viel zu wenig. Styleguides sind jedoch immer weiche Regeln - wenn das Problem in der Hand erfordert, dass Sie von ihnen abweichen, dann sollten Sie. Wenn Sie beispielsweise eine Python-App mit Java-ähnlichen Namenskonventionen erweitern, ist es möglicherweise besser, diese Konvention anstelle von PEP 8 zu verwenden. – jsalonen

+1

Für triviale bedingte Returns wie Sie hier geben, denke ich, ein Mapping-Mechanismus ('options = ['opt1', 'opt'2] Rückgabeoptionen [opt]') ist sowohl klarer und wartungsfreundlicher. Bei komplexeren Bedingungen, insbesondere bei weiteren verschachtelten Bedingungen innerhalb von Bedingungen, kann es schnell schwierig werden, sicherzustellen, dass jeder Codepfad einen Rückgabewert hat. Daher ist es einfacher, die letzte Zeile der Methode als Catchall-Standardrückgabe zu verwalten Lauf. Natürlich, wenn ein Standardkontext keinen Sinn ergibt, solltest du keinen haben, aber dann macht 'else' auch keinen Sinn. –