我试图从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'] = '_'
谢谢
答案 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)
例如:
ret_dict = dict(
foo=data.get('foo', '-'),
bar=data.get('bar', '-')
)
return ret_dict
答案 2 :(得分:2)
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']) # '_'