2012-06-20 8 views
7

domanda molto semplice:Stile Python preferito (o qualsiasi lingua, in realtà): se si desidera utilizzare diversamente quando restituisce?

In particolare in Python (dal Python ha in realtà linee guida dello stile "fortemente raccomandato" specificati in PEP 8, ma in realtà questo vale per qualsiasi lingua), devono una funzione con una clausola if che restituisce sempre avere l'alternativa codice in una clausola else o no? In altre parole, func_style_one() e func_style_two() nel seguente pezzo di codice sono (ovviamente) esattamente equivalente:

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

Ovviamente, lo stile migliore e più leggibile dipende dalla situazione, e opinioni varia notevolmente sul quale è meglio, ma sto chiedendo quale sia specificamente preferito dalla core community Python. (Ad esempio, che viene utilizzato più spesso nella libreria standard, a parità di altre condizioni?)

+2

Io tendo a scegliere il secondo –

+1

Penso che il secondo sia più sicuro. Meno incline a cambiare un altro a un elif durante un refactoring e a creare accidentalmente un percorso di codice senza alcun valore di ritorno. –

+0

Se restituisce tutto l'equivalente del resto, quindi il primo. Se il resto fa calcoli aggiuntivi - il secondo. –

risposta

3

Come regola generale, è sempre consigliabile evitare l'aggiunta di complessità non necessaria al codice, qualunque sia la lingua. Spesso è anche una buona idea provare a suddividere il tuo codice in sottosezioni semanticamente banali.

Data questa euristica, non esiste una risposta definitiva. Si riduce davvero a ciò che stai cercando di ottenere.

Lo dimostrerò con esempi.

Se abbiamo una funzione che verifica la presenza di diverse condizioni di errore prima di procedere, che potrebbe dare un senso a scrivere senza else:

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

Questo è meglio, come spesso si finisce per controllare diversi errori in modo simile a una sequenza:

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

Tuttavia, se la funzione invece rami a due rami uguali, potrebbe semanticamente più senso a voi il resto:

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

Questo perché spesso si finisce per aggiungere diverse altre opzioni con elif:

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

Per riassumere: pensate la semantica di codice e scegliere la sintassi di conseguenza.

+1

Grazie per la risposta. Questo è tipicamente quello che faccio, mi stavo chiedendo se ci fosse un consenso, ad es. WWGD (cosa farebbe Guido?). Ma è bello sapere che altri programmatori la pensano allo stesso modo. –

+0

Almeno io la penso così. Inoltre apprezzo molto il fatto che tu stia abbracciando PEP 8 - le persone leggono le guide di stile troppo poco. Tuttavia, le guide di stile sono sempre regole morbide - se il problema in questione richiede di deviare da loro, allora dovresti. Ad esempio, se si sta estendendo un'app Python con convenzioni di denominazione simili a Java, potrebbe essere preferibile utilizzare tale convenzione anziché quello che PEP 8 suggerisce rigorosamente. – jsalonen

+1

Per i rendimenti condizionali banali come si danno qui, penso che un meccanismo di mappatura ('options = ['opt1', 'opt'2] opzioni di ritorno [opt]') sia più chiaro e più mantenibile. Con condizioni condizionali più complesse, specialmente con condizioni nidificate più all'interno delle condizioni, può diventare rapidamente difficile garantire che ogni percorso di codice abbia un valore di ritorno, quindi perché avere l'ultima riga del metodo è un ritorno predefinito di catchall rende le cose più facili da gestire nel lungo correre. Ovviamente, se un default non ha senso contestualmente, non dovresti averne uno, ma neanche "else" non ha senso. –

Problemi correlati