【问题标题】:More elegant way to deal with multiple KeyError Exceptions处理多个 KeyError 异常的更优雅的方式
【发布时间】:2016-07-04 16:24:32
【问题描述】:

我有以下函数,它读取 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 键引发错误,它就会停止影响值。

【问题讨论】:

  • 谢谢你们俩的回答!我稍后会测试。我真的很喜欢 get() 解决方案,因为这正是我的问题……正如文档所代表的那样:>如果键在字典中,则返回键的值,否则为默认值。如果未给出默认值,则默认为 None,因此此方法永远不会引发 KeyError。

标签: python json python-3.x rdap


【解决方案1】:

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

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

可以等效替换为:

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

【讨论】:

    【解决方案2】:

    您可以改为遍历每个 key 的键和 try,成功时将其附加到列表中,失败时附加 " "

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

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

    return tuple(ret)
    

    如果有必要的话。

    【讨论】:

      【解决方案3】:

      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)
      

      【讨论】:

        猜你喜欢
        • 2015-04-10
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        • 2017-03-04
        相关资源
        最近更新 更多