【问题标题】:How to ignore KeyErrors for multiple individual lines?如何忽略多行的 KeyErrors?
【发布时间】:2015-08-23 12:02:32
【问题描述】:

我正在字典中查找一些数据。但有时某些信息不存在并且会抛出KeyError。有没有办法我可以说忽略出现的任何错误而不用try/except包围每一行?

我想要类似的东西:

ignore KeyError:
    a = data['foo']
    b = data['bar']
    c = data['fizz']
    d = data['buzz']

代替:

try:
    a = data['foo']
except KeyError:
    pass
try:
    b = data['bar']
except KeyError:
    pass
try:
    c = data['fizz']
except KeyError:
    pass
try:
    d = data['buzz']
except KeyError:
    pass

【问题讨论】:

  • 一般来说这不是一个好主意,但在这种特定情况下,.get 可能是一个不错的选择(您可能必须为abcd 无论如何)。

标签: python python-2.7 exception


【解决方案1】:

您可以使用 .get() ,如果密钥不存在,则返回 None。示例 -

a = data.get('foo')
b = data.get('bar')
c = data.get('fizz')
d = data.get('buzz')

在此之后,如果 keys'foo' 不存在,dict.get() 将返回 None。您还可以指定作为第二个参数的默认值,以防密钥不存在时返回。示例 -

a = data.get('foo','<default value>') #the default value does not have to be a string, it can be anything.

如果密钥不存在,这将返回 '&lt;default value&gt;'

【讨论】:

    【解决方案2】:

    也许您可以使用 for 循环和键列表。

    keys = ['foo', 'bar','fizz', 'buzz']
    values = []
    
    for k in keys:
         v = data.get(k)
         values.append(v)
    

    【讨论】:

      【解决方案3】:

      只有exec才有可能(如果你使用get()方法变量将是None):

      code = """a = data["foo"]
      b = data["bar"]
      c = data["fizz"]
      d = data["buzz"]"""
      for line in code.splitlines():
          try:
              exec(line, globals())
          except Exception:
              pass
      

      【讨论】:

        【解决方案4】:

        也许你可以利用.has_key:

        a = None    
        if data.has_key('foo'):
            a = data['foo']
        print a    
        


        data.keys()的结果 进入 set() 并首先检查

        【讨论】:

        • 可行选项,但 key in data 被认为更 Pythonic。
        【解决方案5】:

        在 try 块中使用所有块而不是单个块,因为您总是使用相同的 except 块。 例如

        try:
          a = data['foo']
          b = data['bar']
          c = data['fizz']
          d = data['buzz']
        except:
          pass
        

        `

        【讨论】:

        • 这行不通。如果没有找到'foo',但有其他人存在,则不会被检索到。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多