2012-01-19 7 views
6

ho il seguente codice (meno alcune altre operazioni):modo consigliato per inizializzare variabile nel blocco if

def foobar(): 
    msg=None 
    if foo: 
     msg='foo' 
    else: 
     msg='bar' 
    return msg 

è la seguente pratica migliore per la variabile msg?

def foobar(): 
    if foo: 
     msg='foo' 
    else: 
     msg='bar' 
    return msg 

Mi rendo conto che avrei potuto semplificare le funzioni di cui sopra per le espressioni ternari, tuttavia ci sono operazioni in ciascun blocco if-else che ho lasciato fuori.

+0

Io voto per il secondo. –

risposta

5

O dovrebbe andare bene, ma avrei probabilmente fare:

def foobar(): 
    msg='bar' 
    if foo: 
     msg='foo' 
    return msg 
0

Se ciò che hai mostrato è tutto ciò che è coinvolto in msg, quindi inizializzarlo non fa nulla per te, e la seconda soluzione è migliore.

3

In Python non è un grande vantaggio inizializzare prima di un condizionale come nel primo esempio. Devi solo essere sicuro che la variabile sia inizializzata prima di essere restituita. Ciò presuppone (in base ai tuoi esempi) che stai usando il paradigma "punto di uscita singolo". In alcuni casi in Python è appropriato, ma altre volte si ottiene un codice più pulito uscendo presto quando possibile.

def earlyReturn(mycheck): 
    if not mycheck: 
    return 'You forgot something.' 

    # code here if the test passes without needing an extra level of indentation. 
1

Direi sicuramente che più tardi è meglio. Non vi è alcun suggerimento per Python per inizializzare le variabili. Perciò deve essere evitato se non aggiunge qualcosa di valore al codice come un valore di riserva o rende il codice più leggibile, cosa che non è in questo caso.

Modifica: per valore di fallback intendo lo stesso come suggerito da thagorn e mikebabcock.

0

Se questo è tutta la logica, perché non fare:

def foobar(): 
    msg='bar' 
    if foo: 
     msg='foo' 
    return msg 
2

mi rendo conto che ci sono alcune cose lasciate fuori, ma se non hai effettivamente bisogno di manipolare il messaggio, immagino che potresti semplicemente restituire il contenuto previsto, senza mai aver bisogno di una variabile; return 'foo'

4

Solo per completezza, qui alcune alternative a una linea a se/blocchi else:

msg = 'foo' if foo else 'bar' 
msg = foo and 'foo' or 'bar' 
msg = ('bar', 'foo')[bool(foo)] 

Il primo di questi è sicuramente il più chiaro, se non ti piace l'one-liner I suggerirei di usare il secondo metodo o la risposta di Thagorn. La chiamata bool() è necessaria solo nell'ultima se foo non è già un bool (o 0/1).

Ovviamente nella funzione esempio si potrebbe semplicemente restituire questo immediatamente senza nemmeno utilizzando una variabile msg:

def foobar(): 
    return 'foo' if foo else 'bar' 
+0

Consiglio buono e completo nel complesso, ma hanno affermato che c'è più elaborazione nei blocchi condizionali rispetto a questo. – DigitalMan

Problemi correlati