Как я могу сгруппировать одиночные и l oop операции в одном блоке try / Кроме того же условия? - PullRequest
1 голос
/ 06 марта 2020

Интересно, есть ли способ сгруппировать операции ниже в одном блоке try / кроме? Я использую одно и то же исключение в обоих случаях. Я пытался сократить этот код, но ничего хорошего не приходит мне в голову. Вот пример кода:

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 ]

3 голосов
/ 06 марта 2020

Вы можете обобщить свой код, выделив пару ключей для определенного типа. Там вы можете иметь один l oop с одним оператором 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])
1 голос
/ 06 марта 2020

Если вы действительно хотите один пробный блок, вы можете попытаться выполнить рефакторинг следующим образом (это избыточное убийство):

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)
...