2013-08-29 11 views
6

Ich möchte nur wissen, welcher Weg in Python vorzuziehen ist. zwei Funktionen Stellen Sie sich vor:Welche dieser beiden Funktionen ist mehr "pythonisch"?

1 Funktion:

def foo(key): 
    if bar.has_key(key): 
     return bar.get(key) 
    # do something with bar 
    # this will be executed if bar_key(key) is False 
    ... 
    return something 

2 Funktion:

def foo(key): 
    if bar.has_key(key): 
     return bar.get(key) 
    else: 
     # do something with bar 
     # this will be executed if bar_key(key) is False 
     ... 
     return something 

Wie Sie den einzigen Unterschied sehen können, ist else Aussage. Die Frage ist also, ob es die Leistung irgendwie beeinflusst. Oder gibt es Gründe, else in diese Art von Funktionen aufzunehmen?

+1

Angenommen, bar ist ein 'dict', wie wäre es mit' return bar.get (key, something) '? – ixe013

+1

Eher auf Meinung basiert und ich denke nicht, dass es spezifisch für Python ist oder "Python" ist. Von dem, was ich gehört habe, ist die erste Option lesbarer, und ich wähle auch diese Version. – BartoszKP

+5

Weder ist; Verwenden Sie 'if Schlüssel in bar: return bar [key]'; keine Notwendigkeit, 'get()' und 'has_key()' zu verwenden. –

Antwort

7

Wenn die Wahl zwischen diesen beiden Ansätzen ist, würde ich die erste wählen. return ist ziemlich explizit, dass die Ausführung an diesem Punkt endet. Ich finde if x { return y } else { ... } ein Anti-Muster aus diesem Grund (nicht nur in Python - ich sehe das in C/C++ Code und es ärgert mich auch dort).

Wenn Sie zurückgeben, ist ein else Block völlig unnötig und verursacht sinnlose Einrückung eines Blocks von Code, der ziemlich groß sein kann. Je mehr verschachtelte Strukturen Sie haben, desto schwieriger ist es, beim Lesen des Codes den richtigen Kontext in Ihrem Kopf beizubehalten. Aus diesem Grund bevorzuge ich weniger Verschachtelung, wenn sie Logik nicht verschleiert, und in diesem Fall glaube ich nicht, dass es würde.

+2

[Ja, tausend mal ja.] (Http://programmers.stackexchange.com/q/18454/7043) – delnan

+0

Vielen Dank! Es hat wirklich geholfen – Vor

4

Die pythonic Weg:

def foo(key): 
    return bar.get(key, something) 
+1

Je nachdem, wie lange es dauert, den Wert von "etwas" zu berechnen, ja. Wenn es eine nicht zu vernachlässigende Menge an Zeit benötigt, würde man einen Wert vorberechnen, der niemals verwendet wird. – cdhowie

+1

Nun, was ist, wenn ich etwas tun muss, sagen wir, rufen Sie die DB, um diesen Schlüssel abzurufen, und dann dict aktualisieren? – Vor

+0

Dann der erste. –

4

Während diese Frage ein wenig Meinung basiert, würde ich sagen, die zweite mehr Pythonic ist für den Grund der „explicit ist besser als implizite“. Die zweite Funktion sagt klar: "Wenn diese Bedingung, tue dies. Ansonsten tue dies". Auf der anderen Seite bedeutet die erste Funktion der "Sonst" Teil.

Verwandte Themen