更优雅的方式来处理多个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:
内将停止一旦第一个丢失的字典键引发错误影响值。
答
只需使用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)
Thx为你的答案你们俩!我会在稍后测试。我真的很喜欢get()解决方案,因为它正是我的问题......正如文档所示: >如果键在字典中,则返回键的值,否则为默认值。如果未给出默认值,则默认为None,以便此方法不会引发KeyError。 –