2013-06-12 3 views
2

Это, вероятно, очень простой вопрос, но я просмотрел документацию python по исключениям и не смог его найти.Обработка исключений без нарушения, Python

Я пытаюсь прочитать кучу определенных значений из словаря и вставить их в другой словарь.

for item in old_dicts: 
    try: 
     new_dict['key1'] = item['dog1'][0:5] 
     new_dict['key2'] = item['dog2'][0:10] 
     new_dict['key3'] = item['dog3'][0:3] 
     new_dict['key4'] = item['dog4'][3:11] 
    except KeyError: 
     pass 

Теперь, если Python встречает ключевую ошибку в [ «dog1»], по-видимому, чтобы прервать текущую итерацию и перейти к следующему пункту в old_dicts. Я бы хотел, чтобы он перешел к следующей строке в цикле. Должен ли я вставлять инструкцию исключения для каждой строки?

+0

Как вы хотите, чтобы конечный результат выглядел? Если у него 'key2' отсутствует, или должен быть« key2 »сопоставлен с некоторым значением по умолчанию (возможно,« Нет »)? – jpmc26

ответ

1

Сделать это функция:

def newdog(self, key, dog, a, b) 
    try: 
     new_dict[key] = item[dog][a:b] 
    except KeyError: 
     pass 

Я не запускали выше код, но что-то подобное, что должно работать, модульность. Или что вы можете сделать, это подготовить, чтобы он проверял все значения и удалял все значения, которые не находятся в словаре, но это, вероятно, будет больше кода, чем исключение для каждой строки.

1
for item in old_dicts: 
    for i, (start, stop) in enumerate([(0,5), (0,10), (0,3), (3,11)], 1): 
     try: 
      new_dict['key' + str(i)] = item['dog' + str(i)][start:stop] 
     except KeyError: 
      pass 
0

Да, это так. Это будет беспорядочно и неприятно смотреть, но вам нужен обработчик исключений для каждого вызова.


Это значит, что вы можете написать свой код немного по-другому, чтобы облегчить жизнь себе. Рассмотрим это:

 
def set_new_dict_key(new_dict, key, item, path): 
    try: 
     for path_item in path: 
      item = item[path_item] 
    except KeyError: 
     pass 
    else: 
     new_dict[key] = item 

for item in old_dicts: 
    set_new_dict_key(new_dict, 'key1', item, ['dog1', slice(0, 5)]) 
    set_new_dict_key(new_dict, 'key2', item, ['dog2', slice(0, 10)]) 
    set_new_dict_key(new_dict, 'key3', item, ['dog3', slice(0, 3)]) 
    set_new_dict_key(new_dict, 'key4', item, ['dog4', slice(3, 11)]) 
0

Да, вы будете. Наилучшая практика заключается в том, чтобы как можно меньше блоков try. Только напишите код, который вы, возможно, ожидаете от исключения, в блоке try. Обратите внимание, что у вас также есть else для заявлений try и except, что только запускается на выполнение, когда попытка создалась без исключения:

try: 
    // code that possibly throws exception 
except Exception: 
    // handle exception 
else: 
    // do stuff that should be done if there was no exception 
1

Предполагая, что вы знаете значения в ключи будут действовать, то почему бы не просто отказываться от исключения вместе и проверить ключи?

for item in old_dicts: 
    if 'dog1' in item: 
     new_dict['key1'] = item['dog1'][0:5] 
    if 'dog2' in item: 
     new_dict['key2'] = item['dog2'][0:10] 
    if 'dog3' in item: 
     new_dict['key3'] = item['dog3'][0:3] 
    if 'dog4' in item: 
     new_dict['key4'] = item['dog4'][3:11] 
+0

Это именно то, что я ищу, хотя я понимаю, что это не совсем то, о чем я просил :) Каков правильный этикет этикета? Примите ответ, который я хотел, или ответ на вопрос, который я задал? –

+0

@BenjaminLindqvist этикета на этом заключается в том, что ваш прием для вас один определяет (так же, как ваше голосование), вы можете принять решение в зависимости от того, какая из ваших предпосылок –

Смежные вопросы