2015-06-24 80 views
5

您認爲哪三種編碼風格更好,或者更具可讀性? foo應當從兩個字典中的項目來運行,但mydict2可以None代碼樣式 - 用於if

選項1:

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

選項2:

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

選項3:

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

你知道迭代'mydict2.items()'只是不會做任何事情,如果它是空的?三元表達式是完全多餘的。 – jonrsharpe

+0

@jonsharpe但是OP說它可能是'None'。嘗試遍歷'None'會引發錯誤。 – Sam

+0

@Sam然後他們應該通過身份測試 - 「如果mydict2不是None」 – jonrsharpe

回答

2

我喜歡第三種選擇,因爲單個循環的意圖是程序更清晰。如果是我,我會製造一個助手發電機,以分散顧慮。

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

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

檢測側情況下的早期,並且用空字典代替它 - 這是null object pattern

if mydict2 is None: 
    mydict2 = {} 

這等同於用來避免可變默認參數的通用模式。然後,你總是可以有一個(很簡單)循環:

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

如果你控制相關的代碼,考慮改變的東西,這樣mydict2不能None擺在首位。