更优雅的方式来处理多个KeyError异常

问题描述:

我有以下函数,它读取一个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。 –

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

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

可以与等效替代:

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

您可以通过为每个key键和try,而不是重复,成功将其追加到一个列表,失败时追加" "

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

然后在函数的最后返回一个元组:

return tuple(ret) 

如果这是必要的。

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)