2013-08-29 19 views
6

Po prostu chcę wiedzieć, który sposób jest bardziej preferowany w python. Wyobraźmy sobie dwie funkcje:Która z tych dwóch funkcji jest bardziej "pythonic"?

1 funkcja:

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 Funkcja:

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 

Jak widać jedyną różnicą jest else stwierdzenie. Pytanie brzmi, czy w jakiś sposób wpłynie to na wydajność. Czy są jakieś powody, aby włączyć else w tego typu funkcje?

+1

Zakładając, że pasek jest "dyktando", co powiesz na 'return bar.get (key, something)'? – ixe013

+1

Raczej oparte na opiniach i nie sądzę, że jest to specyficzne dla Pythona lub "pytonowe". Z tego, co słyszałem, pierwsza opcja jest bardziej czytelna, ja też wybieram tę wersję. – BartoszKP

+5

Nie jest; użyj 'if key in bar: return bar [key]'; nie trzeba używać 'get()' i 'has_key()'. –

Odpowiedz

7

Jeśli wybór jest pomiędzy tymi dwoma podejściami, wybrałbym pierwszy. return jest dość jednoznaczne, że wykonanie kończy się w tym momencie. Z tego powodu uważam, że if x { return y } else { ... } jest anty-wzorcem (nie tylko w Pythonie - widzę to w kodzie C/C++ i też mnie to irytuje).

Jeśli wracasz, blok else jest zupełnie niepotrzebny i powoduje bezsensowne wcięcie bloku kodu, który może być dość duży. Im więcej masz struktur zagnieżdżonych, tym trudniej jest utrzymać właściwy kontekst w głowie podczas czytania kodu. Z tego powodu wolę mniejsze zagnieżdżanie, gdy nie zakłóca to logiki, aw tym przypadku nie sądzę, by tak było.

+2

[Tak, tysiąc razy tak.] (Http://programmers.stackexchange.com/q/18454/7043) – delnan

+0

Dziękuję bardzo! To naprawdę pomogło – Vor

4

pythonic sposób:

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

W zależności od tego, ile czasu zajmuje obliczenie wartości "coś", tak. Jeśli zajmie to niezauważalny czas, można wstępnie przetworzyć wartość, która nigdy nie jest używana. – cdhowie

+1

Cóż, co jeśli muszę coś zrobić, powiedzmy, zadzwoń do DB, aby pobrać ten klucz, a następnie zaktualizować dict? – Vor

+0

Następnie pierwszy. –

4

Chociaż to pytanie jest trochę opinia opiera się, powiedziałbym, drugi jest bardziej pythonowy o przyczynie „wyraźny jest lepszy niż niejawny”. Druga funkcja wyraźnie mówi: "jeśli ten warunek, zrób to, w przeciwnym razie rób to". Z drugiej strony, pierwsza funkcja implikuje część "Inaczej".

Powiązane problemy