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

More elegant way to deal with multiple KeyError Exceptions

提问人:Stéphane 提问时间:7/5/2016 最后编辑:Dimitris Fasarakis HilliardStéphane 更新时间:7/24/2020 访问量:2416

问:

我有以下函数,它读取 a 并影响局部变量的一些值,然后这些值作为元组返回。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:

json python-3.x RDAP

评论

0赞 Stéphane 7/5/2016
谢谢你俩的回答!我稍后会测试一下。我真的很喜欢 get() 解决方案,因为这正是我的问题......正如文档所代表的那样: >如果 key 在字典中,则返回 key 的值,否则为 default。如果未给出 default,则默认为 None,因此此方法永远不会引发 KeyError。

答:

1赞 Dimitris Fasarakis Hilliard 7/5/2016 #1

相反,您可以遍历键,对于每个键,在成功时将其附加到列表中,在失败时附加:trykey" "

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

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

return tuple(ret)

如果有必要的话。

6赞 ShadowRanger 7/5/2016 #2

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

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

可以等效地替换为:

country = data.get('country', '')
0赞 Stéphane 7/5/2016 #3

谢谢 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)