2016-07-04 80 views
0

我有以下函數,它讀取一個dict並影響到局部變量的一些值,然後將其作爲元組返回。更優雅的方式來處理多個KeyError異常

問題是某些所需的鍵可能不存在於字典中。

到目前爲止,我有這個代碼,它做我想要的,但我不知道是否有一個更優雅的方式來做到這一點。

def getNetwork(self, search): 

    data = self.get('ip',search) 
    handle   = data['handle'] 
    name   = data['name'] 
    try: 
     country  = data['country']  
    except KeyError: 
     country = '' 
    try:  
     type   = data['type'] 
    except KeyError: 
     type = '' 
    try:     
     start_addr  = data['startAddress'] 
    except KeyError: 
     start_addr = '' 
    try:     
     end_addr  = data['endAddress'] 
    except KeyError: 
     end_addr = '' 
    try:     
     parent_handle = data['parentHandle'] 
    except KeyError: 
     parent_handle = '' 
    return (handle, name, country, type, start_addr, end_addr, parent_handle) 

我是由無數try: except:種害怕,但如果我把所有的矯揉造作一個try: except:內將停止一旦第一個丟失的字典鍵引發錯誤影響值。

+0

Thx爲你的答案你們倆!我會在稍後測試。我真的很喜歡get()解決方案,因爲它正是我的問題......正如文檔所示: >如果鍵在字典中,則返回鍵的值,否則爲默認值。如果未給出默認值,則默認爲None,以便此方法不會引發KeyError。 –

回答

2

只需使用dict.get。每次使用的:

try: 
    country  = data['country']  
except KeyError: 
    country = '' 

可以與等效替代:

country = data.get('country', '') 
1

您可以通過爲每個key鍵和try,而不是重複,成功將其追加到一個列表,失敗時追加" "

ret = [] 
for key in {'country', 'type', 'startAddress', 'endAddress', 'parentHandle'}: 
    try: 
     ret.append(data[key]) 
    except KeyError: 
     ret.append([" "]) 

然後在函數的最後返回一個元組:

return tuple(ret) 

如果這是必要的。

0

THX ShadowRanger,你回答我去下面的代碼,這確實是更舒適閱讀:

高清getNetwork(self,search):

data = self.get('ip',search) 
handle   = data.get('handle', '') 
name   = data.get('name', '') 
country  = data.get('country','') 
type   = data.get('type','') 
start_addr  = data.get('start_addr','') 
end_addr  = data.get('end_addr','') 
parent_handle = data.get('parent_handle','') 
return (handle, name, country, type, start_addr, end_addr, parent_handle) 
相關問題