如何以编程方式捕获try b失败的命令

2024-04-19 17:26:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从JSONAPI获取一些数据。我不想要API返回的所有数据,所以我编写了一个方法,读取所有数据并返回一个包含相关字段的字典。但有时会丢失一些数据,我想用下划线替换丢失的字段。方法的一个例子是这样的

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

如果数据中缺少一个字段,这将通过一个键错误来实现。有没有可能在一个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'] = '_'

谢谢


Tags: 数据方法apidata字典foo错误bar
3条回答

使用^{}^{}方法:

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 '_',
    }

.get如果dict没有请求的键,则返回它的第二个参数(None默认情况下),因此在不确定的情况下使用它总是安全的。你知道吗

示例:

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

您可能可以从KeyErrorexception对象的成员处获得该信息,但更简单的方法是只使用get(),如果键不在那里,它将返回一个默认值。你知道吗

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

这比处理异常更好的另一个原因是您只能处理一个异常。如果两把钥匙丢了怎么办?除此之外,您的示例中甚至不会定义ret_dict,因为代码失败了。你知道吗

您可以使用dict.get(key, default_val),而不是使用try块

例如:

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

return ret_dict

相关问题 更多 >