2015-06-24 15 views
5

Quale dei tre secondo te è uno stile di codifica migliore o più leggibile? foo dovrebbe essere eseguito sulle voci di entrambi i dizionari, ma mydict2 può essere NoneCodice stile - per con se

Opzione 1:

for a,b in mydict1.items(): 
    foo(a,b) 
if mydict2: 
    for a,b in mydict2.items(): 
     foo(a,b) 

Opzione 2:

for a,b in mydict1.items(): 
    foo(a,b) 
for a,b in mydict2.items() if mydict2 else dict().items(): 
    foo(a,b) 

Opzione 3:

for a,b in chain(mydict1.items(), mydict2.items() if mydict2 else dict().items()): 
    foo(a,b) 
+0

Sapete che iterare su 'mydict2.items()' non farà nulla se è vuoto? L'espressione ternaria è completamente ridondante. – jonrsharpe

+0

@jonsharpe Ma l'OP dice che potrebbe essere "Nessuno". Cercando di scorrere su 'Nessuno' genera un errore. – Sam

+0

@Sam quindi dovrebbero essere testati per identità - 'se mydict2 non è None' – jonrsharpe

risposta

2

Mi piace la terza opzione, perché il loop singolo ne fa l'intenzione il programma più chiaro. Se fossi in me, farei un generatore ausiliario, nell'interesse di separare le preoccupazioni.

def mydictitems(*dicts): 
    for d in dicts: 
     if d: 
       yield from d.items() 

for a,b in mydictitems(mydict1, mydict2): 
    foo(a,b) 
6

rilevare il carter laterale nella fase iniziale, e sostituirlo con un dict vuoto - questo è il null object pattern:

if mydict2 is None: 
    mydict2 = {} 

Questo è identico a un modello comune usata per evitare argomenti predefiniti mutevoli. Poi si può sempre avere uno (molto semplice) ciclo:

for a, b in chain(mydict.items(), mydict2.items()): 

Se controlli il relativo codice, potresti cambiare le cose in modo che non può essere mydict2None, in primo luogo.

Problemi correlati