2015-06-24 3 views
5

Welcher der drei ist Ihrer Meinung nach ein besserer Codierungsstil oder besser lesbar? foo sollte auf die Elemente aus beiden Wörterbücher ausgeführt werden, aber mydict2 kann NoneCode style - for with if

Option 1:

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

Option 2:

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

Option 3:

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

Sie wissen, iterating über 'mydict2.items()' wird nur nichts tun, wenn es leer ist? Der ternäre Ausdruck ist vollständig redundant. – jonrsharpe

+0

@jonsharpe Aber das OP sagt, es könnte 'None' sein. Wenn Sie versuchen, über "None" zu iterieren, wird ein Fehler ausgegeben. – Sam

+0

@Sam dann sollten sie nach Identität testen - 'wenn mydict2 nicht None' ist – jonrsharpe

Antwort

2

Ich mag die dritte Option, weil die einzelne Schleife die Absicht macht das Programm klarer. Wenn ich es wäre, würde ich einen Helfer-Generator machen, um die Interessen zu trennen.

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

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

die Seiten Fall frühzeitig erkennen und es mit einem leeren dict ersetzen - das ist die null object pattern ist:

if mydict2 is None: 
    mydict2 = {} 

Dies ist identisch mit einem gemeinsamen Muster verwendet wandelbar Standardargumente zu vermeiden. Dann können Sie immer eine (sehr einfach) Schleife haben:

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

Wenn Sie den entsprechenden Code zu steuern, sollten Sie die Dinge zu ändern, so dass mydict2 nicht None in erster Linie sein kann.