2015-06-24 13 views
5

Który z tych trzech elementów jest lepszym stylem kodowania lub bardziej czytelny? foo powinien być prowadzony na elementach z obu słowników, ale mydict2 może być NoneStyl kodu - w przypadku, gdy

Wariant 1:

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

Opcja 2:

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

Wariant 3:

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

Wiesz, iteracja nad 'mydict2.items()' po prostu nie zrobi nic, jeśli jest pusty? Trójskładnikowe wyrażenie jest całkowicie zbędne. – jonrsharpe

+0

@jonsharpe Ale OP mówi, że może to być "Brak". Próba powtórzenia "Brak" powoduje błąd. – Sam

+0

@ Sama to powinno być testowanie według tożsamości - 'jeśli mydict2 nie jest żadnym" – jonrsharpe

Odpowiedz

2

Podoba mi się trzecia opcja, ponieważ pojedyncza pętla ma zamiar program jest jaśniejszy. Gdybym to ja zrobiłbym generator pomocniczy, w interesie oddzielania obaw.

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

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

Detect sprawę z boku na początku, i zastąpić go z pustym dict - to null object pattern:

if mydict2 is None: 
    mydict2 = {} 

ten jest identyczny do wspólnego wzorca stosowanego w celu uniknięcia zmienny domyślne argumenty. Wtedy zawsze można mieć jeden (bardzo prosty) pętlę:

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

Jeśli kontrolować odpowiedni kod, rozważyć zmianę rzeczy, tak że nie może być mydict2None w pierwszej kolejności.

Powiązane problemy