Python 处理多个KeyError异常的更优雅的方法
我有以下函数,它读取一个Python 处理多个KeyError异常的更优雅的方法,python,json,python-3.x,rdap,Python,Json,Python 3.x,Rdap,我有以下函数,它读取一个dict,并将一些值影响到局部变量,然后作为元组返回 问题是字典中可能不存在某些所需的键 到目前为止,我有这个代码,它做我想要的,但我想知道是否有一个更优雅的方式来做到这一点 def getNetwork(self, search): data = self.get('ip',search) handle = data['handle'] name = data['name'] try:
dict
,并将一些值影响到局部变量,然后作为元组返回
问题是字典中可能不存在某些所需的键
到目前为止,我有这个代码,它做我想要的,但我想知道是否有一个更优雅的方式来做到这一点
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键出现错误,它就会停止影响值。你可以迭代这些键,然后对每个键进行try
,成功时,将其附加到列表中;失败时,将其附加到”
:
然后在函数末尾返回一个元组:
return tuple(ret)
如果有必要的话。只需使用dict.get
。每次使用:
try:
country = data['country']
except KeyError:
country = ''
可以等效地替换为:
country = data.get('country', '')
Thx ShadowRanger,有了您的回答,我进入了以下代码,这确实更容易阅读:
def 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)
谢谢你们两个的回答!我稍后会测试。我非常喜欢get()解决方案,因为这正是我的问题……正如文档所示:>如果key在字典中,则返回key的值,否则为默认值。如果未给出default,则默认为None,这样该方法就不会引发keyrerror。
def 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)