如何以编程方式捕获try块

时间:2016-10-02 18:52:41

标签: python

我试图从JSON API获取一些数据。我不想要API返回的所有数据,因此我编写了一个方法来读取所有数据并返回包含相关字段的字典。有时候,有些数据丢失了,我想用下划线替换缺少的字段。该方法的样本就是这样;

return {
    'foo': data['foo'],
    'bar': data['bar']
 }

如果数据中缺少某个字段,则会产生KeyError。是否有可能以编程方式捕获哪个字段产生错误,在一个try-except块中,而不是为每个字段写一个try-except块?

try:
    ret_dict =  {
        'foo': data['foo'],
        'bar': data['bar']
    }
 except KeyError:
    ret_dict[thefailurekey] = '_'

而不是

ret_dict = {}
try:
    ret_dict['foo'] = data['foo']
except KeyError:
    ret_dict['foo'] = '_'
try:
    ret_dict['bar'] = data['bar']
except:
    ret_dict['bar'] = '_'

谢谢

4 个答案:

答案 0 :(得分:3)

您可以从@ for { i <- ListT(x) j <- ListT(y) } yield i + j res20: ListT[Future, Int] = ListT(Success(List(5, 6, 7, 6, 7, 8, 7, 8, 9))) 异常对象的成员那里获取该信息,但更简单的方法是使用KeyError,如果密钥不在那里,将返回默认值。< / p>

get()

这比处理异常更好的另一个原因是你只能处理一个异常。如果缺少两把钥匙怎么办?最重要的是,return { 'foo': data.get('foo', '_'), 'bar': data.get('bar', '_'), } 甚至不会在您的示例中定义,因为代码失败。

答案 1 :(得分:2)

您可以使用dict.get(key, default_val)

,而不是使用try块

例如:

ret_dict = dict(
    foo=data.get('foo', '-'),
    bar=data.get('bar', '-')
)

return ret_dict

答案 2 :(得分:2)

使用.getdict方法:

def get_data(data):
    return {
        # If you want to accept falsy values from API:
        'foo': data.get('foo', '_'),

        # If you want to override falsy values from API:
        'bar': data.get('bar') or '_',
    }
如果dict没有请求密钥,

.get将返回其第二个参数(默认为None),因此在不确定的情况下使用它总是安全的。

示例:

>>> data = {'foo': False, 'bar': False}
>>> get_data(data)
{'bar': '_', 'foo': False}

答案 3 :(得分:1)

如果您想避免为每个键键入.get(attr, '_')的重复性,可以使用defaultdict,将其设置为在尝试访问某个键时丢失_但丢失

from collections import defaultdict

data = {
    'foo': 'foo_value',
}

ret_dict = defaultdict(lambda: '_')
ret_dict.update(data)

print(ret_dict['foo'])  # 'foo_value'
print(ret_dict['bar'])  # '_'