Evitare due istruzioni if per la stessa condizione con codice comune tra [chiuso]

1

Questo è un problema in cui mi imbatto spesso e sto cercando la soluzione migliore. Avrò un codice come questo (python):

def func(var, opt):
    if opt:
        var = var.set_opt(opt)

    result = var.get_result()

    if opt:
        return [r[0] for r in result] # arbitrary
    else:
        return result

Che cosa è una buona pratica generale, un modo per evitare questa dichiarazione double if?

    
posta shane 07.08.2017 - 21:26
fonte

3 risposte

3

In questo caso, penso che quanto segue abbia più senso. Il tuo bisogno dei due if è basato sul tentativo di riutilizzare la stessa variabile non necessaria in due distinti percorsi di esecuzione.

def func(var, opt):
    if opt:
        return [r[0] for r in var.set_opt(opt).get_result()]
    else:
        return var.get_result()

Non so se esiste una regola generale, ma tende ad essere un odore. Preferisco vedere blocchi di codice indipendenti con qualche ripetizione rispetto al codice in cui i percorsi separati sono intrecciati insieme in questo modo.

    
risposta data 07.08.2017 - 21:46
fonte
3

Possiamo risolvere prima else , che a mio parere è il problema. Non ho visto alcun motivo per lasciarlo per la fine.

def func(var, opt):
    if opt is None:
        return var.get_result()

    result = var.set_opt(opt).get_result()
    return [r[0] for r in result] # arbitrary

Temo di non poterti dare una risposta più sofisticata perché dipenderebbe dal codice reale e se l'ordine di if / else può essere modificato per una rapida risoluzione del la funzione.

Non ho familiarità con Python. Ho cercato un po 'e sono giunto alla conclusione che if opt is None è l'opposto di if opt . Sentiti libero di correggermi se sbaglio.

    
risposta data 07.08.2017 - 22:24
fonte
0

Se questa è l'intera funzione, puoi suddividerla in due parti:

def func(var):
    return result = var.get_result()

e

def funcWithOpt(var, opt):
    var = var.set_opt(opt)
    result = var.get_result()
    return [r[0] for r in result]

Se è più lungo, puoi utilizzare le sottofunzioni per le diverse parti.

Tuttavia , dovresti iniziare chiedendo a te stesso se questo è un problema. Le prestazioni non sono un problema, controllare se opt esiste è poco costoso. Se hai una funzione booleana che devi controllare, puoi semplicemente chiamare quella funzione una volta e "memorizzarla" in una variabile. La funzione potrebbe essere leggermente più lunga con questa doppia dichiarazione if , ma è leggibile e sicuramente conta qualcosa.

    
risposta data 07.08.2017 - 21:40
fonte

Leggi altre domande sui tag