2015-12-07 3 views
1

Извините, если название недостаточно объяснимо, но это лучшее, что я мог придумать. Это часть моего кода, скрипта python, который переводит файлы из Xilog3 в формат woodWOP (программы cnc).Python: упростить попытку/исключить код?

try: 
    print >>woodWOPfile, 'YA="%s"' %xbo['Y'] 
except KeyError: 
    xbo['Y']=xbo_prev['Y'] 
    print >>woodWOPfile, 'YA="%s"' %xbo['Y'] 

Это печатает элемент словаря слова в выходной файл. Если ключ не существует, я хочу загрузить его из предыдущей версии словаря xbo_prev, которая копируется из xbo перед каждым новым циклом чтения строки.

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

Спасибо :).

+1

Будет ли 'xbo_prev' всегда иметь ключ? –

+0

Вопрос Моргана очень важен, потому что самый простой способ, если 'xbo_prev' всегда имеет ключ, отличается от простейшего способа, если' xbo_prev' может не иметь ключа. – user2357112

+0

Да, словарь предварительно загружен значениями по умолчанию в начале скрипта, поэтому, если ключ не найден в xbo, то значение по умолчанию (обычно 0) будет найдено в xbo_prev, что действительно. Мне нужно иметь возможность получить предыдущий ключ, если он не существует в текущем словаре, потому что некоторые сверления зависят от параметров, уже установленных в предыдущей строке. Например: – stormychel

ответ

8

Вы могли бы просто использовать dict.setdefault:

print woodWOPfile, 'YA="%s"' % xbo.setdefault('Y', xbo_prev['Y']) 

Это получает значение, соответствующее ключ Y, если он присутствует в карте, в противном случае устанавливает его в качестве второго параметра и возвращает его.

1
if not 'Y' in xbo: 
    xbo['Y']=xbo_prev['Y'] 
print >>woodWOPfile, 'YA="%s"' %xbo['Y'] 

Почему бы не проверить его там и установить его первым.

+0

Это похоже на длинный извращенный способ делать то, что делает 'dict.setdefault'. – juanchopanza

+0

Это уже выглядит намного приятнее, спасибо! – stormychel

+0

@juanchopanza Я согласен Мне нравится setdefault, который я только что узнал. Спасибо! – corn3lius

0

Существующие два ответа работают тоже, но альтернатива, если вы знаете, что xbo_prev будет ваш ключ, чтобы воспользоваться .get() «s default параметра:

print >>woodWOPfile, 'YA="%s"' % xbo.get('Y', xbo_prev['Y']) 

Обратите внимание, что это не изменяет xbo, если вы намереваетесь изменить xbo, вы можете использовать .setdefault(), как предлагает juanchopanza, хотя я бы сказал, что положить мутирующие операции в заявлении на печать сбивает с толку и может нанести больше вреда, чем пользы.

+0

Спасибо. Это решение, более подходящее в другой части моей программы! – stormychel

+0

Вам не нужен или с 'get':' xbo.get ('Y', xbo_prev ['Y']) ' – dirn

+0

Хорошая точка, улучшена. – dimo414