2012-06-20 10 views
7

Bardzo proste pytanie:Preferowany styl w Pythonie (lub w jakimkolwiek innym języku): Powinien być użyty, gdy zwraca?

szczególności w Pythonie (od Pythona faktycznie ma „zaleca” wytyczne styl określony w PEP 8, ale tak naprawdę to ma zastosowanie do każdego języka), należy funkcję z klauzulą ​​if że zawsze zwraca mają alternatywę kod w klauzuli else czy nie? Innymi słowy, func_style_one() i func_style_two() w następujący kawałek kodu są (oczywiście) dokładnie równoważne:

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() 

Oczywiście, najlepszym i najbardziej czytelny styl zależy od sytuacji i opinie będą się znacznie różnić, w którym jest lepiej, ale pytam, który jest szczególnie preferowany przez rdzenną społeczność Pythona. (np. Które jest używane częściej w standardowej bibliotece, wszystkie inne rzeczy są równe?)

+2

Mam tendencję do wybierania drugiego –

+1

Myślę, że drugi jest bezpieczniejszy. Mniej podatne na zmianę in elif podczas refaktora i przypadkowe utworzenie ścieżki kodu bez wartości zwrotnej. –

+0

Jeśli wszystko, co jest równoważne z innym, jest zwracane, to pierwsze. Jeśli drugi wykonuje dodatkowe obliczenia - drugi. –

Odpowiedz

3

Jako ogólną zasadę należy zawsze unikać niepotrzebnego skomplikowania kodu, niezależnie od języka. Często dobrym pomysłem jest również próba podzielenia kodu na semantycznie podłe podsekcje.

Biorąc pod uwagę te heurystyki, nie ma jednoznacznej odpowiedzi. To naprawdę sprowadza się do tego, co próbujesz osiągnąć.

Pokażę to na przykładach.

Jeśli mamy funkcję, która sprawdza różne warunki błędach przed postępowaniem, może to sensu pisać je bez else:

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

To jest lepsze jak często kończy się sprawdzanie kilka błędów w podobny sposób w sekwencja:

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

jeśli jednak funkcja zamiast oddziałów na dwie równe oddziałów, może to więcej sensu semantycznie wam innego:

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

To dlatego, że często kończy się dodając kilka innych opcji z elif:

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

Podsumowując: myślę o semantyce kodzie i wybierz odpowiednio składnię.

+1

Dzięki za odpowiedź. Zwykle robię to, zastanawiałem się tylko, czy istnieje konsensus, np. WWGD (co by zrobił Guido?). Ale dobrze jest wiedzieć, że inni programiści myślą podobnie. –

+0

Przynajmniej tak myślę. Naprawdę doceniam to, że obejmujesz PEP 8 - ludzie zbyt często czytają przewodniki po stylu. Jednak przewodnicy stylu zawsze są łagodnymi zasadami - jeśli problem w ręku wymaga od ciebie odejścia, powinieneś. Na przykład, jeśli rozszerzasz aplikację Python o konwencje nazewnictwa podobne do języka Java, lepiej będzie użyć tej konwencji zamiast tego, co sugeruje tylko metoda PEP 8. – jsalonen

+1

Dla trywialnych zwrotów warunkowych, jakie tutaj podajesz, myślę, że mechanizm odwzorowania ('options = ['opt1', 'opt'2] opcje zwracania [opt]') jest zarówno bardziej przejrzysty, jak i łatwiejszy w utrzymaniu. W przypadku bardziej złożonych warunków, szczególnie w przypadku dalszych warunków zagnieżdżonych w warunkach, szybko może stać się trudne, aby zapewnić, że każda ścieżka kodu ma wartość zwracaną, a zatem dlaczego ostatnia linia metody jest domyślnym zwrotem, który ułatwia zarządzanie w długim okresie. biegać. Oczywiście, jeśli domyślnie nie ma sensu kontekstualnie, nie powinieneś go mieć, ale "inny" też nie ma sensu. –

Powiązane problemy