繁体   English   中英

如何以编程方式在try块上捕获哪个命令失败

[英]How to programmatically catch which command failed on a try block

我正在尝试从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'] = '_'

谢谢

您可能可以从KeyError异常对象的成员中获取该信息,但是更简单的方法是只使用get() ,如果键不存在,该方法将返回默认值。

return {
    'foo': data.get('foo', '_'),
    'bar': data.get('bar', '_'),
 }

比处理异常更好的另一个原因是,您只能处理一个异常。 如果缺少两个钥匙会怎样? 最重要的是,由于代码失败, ret_dict甚至不会在示例中定义ret_dict

除了使用try块,还可以使用dict.get(key, default_val)

例如:

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

return ret_dict

使用dict .get方法:

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}

如果要避免重复输入每个键的.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'])  # '_'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM