如何在具有相同条件的一个try/except块中对单个和循环操作进行分组?

2024-04-19 19:43:23 发布

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

我想知道是否有任何方法可以将下面的操作分组到一个try/except块中。我在这两种情况下使用相同的异常。我试图缩短这段代码,但没想到有什么好处。下面是示例代码:

def cast_values(values):
    try:
        values['Price'] = float(values['Price'])
    except KeyError:
        pass

    for field in ('Pages', 'Quantity', 'Discount'):
        try:
            values[field] = int(values[field])
        except KeyError:
            pass

我希望所有的密钥都被检查,不管会发生多少异常


2条回答

您可以通过分解键与特定类型的配对来概括代码。在那里,您可以有一个包含单个try语句的单个循环,该语句容纳所有键/类型对

def cast_values(values):
    type_map = {
        'Price': float,
        'Pages': int,
        'Quantity': int,
        'Discount': int,
    }

    for key, type_ in type_map.items():
        type_ = types.get(key, int)
        try:
            values[key] = type_(values[key])
        except KeyError:
            pass

在这种情况下,我可能会完全去掉try语句,只需检查键是否位于values

for key, type_ in type_map.items():
    if key not in values:
        continue
    values[key] = type_(values[key])

如果您真的想要一个try块,您可以尝试像这样重构(这太过分了):

def cast_dict(dict_, key, type_):
    try:
        dict_[key] = type_(dict_[key])
    except KeyError:
        pass

def cast_values(values):
    cast_dict(values, 'Price', float)
    for field in ('Pages', 'Quantity', 'Discount'):
        cast_dict(values, field, int)

相关问题 更多 >