[英]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
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.