python: исключение в пределах понимания: могу ли я получить значения для извлечения переменных цикла?

#python #exception #python-3.x #list-comprehension

#python #исключение #python-3.x #список-понимание

Вопрос:

Предположим, я анализирую файл фиксированной ширины:

 file_format = {'year' : (0, 3, int), 'price' : (4, 10, float)}
for lineno, line in enumerate(input_file):
    try:
        fields = {k : v[2](line[v[0]:v[1]]) for k, v in file_format.items()}
    except ValueError:
        print("cannot parse line {}".format(lineno))
  

Я хотел бы добавить в распечатку исключения информацию о том, какое конкретное поле не удалось проанализировать. Есть ли какой-либо способ, которым я мог бы получить значения k и v без замены понимания dict циклом?

Ответ №1:

Вы могли бы перенести проблемную часть в функцию

 file_format = {'year' : (0, 3, int), 'price' : (4, 10, float)}

def build_value(v):
    try:
        return v[2](line[v[0]:v[1]])
    except ValueError:
        print("cannot parse line {}".format(lineno))

for lineno, line in enumerate(input_file):
    fields = {k : build_value(v) for k, v in file_format.items()}
  

Ответ №2:

Я не знаю о Python 3 и, в частности, о понимании dict, но проверка байт-кода, сгенерированного для понимания списка, показывает, что переменные цикла являются просто локальными переменными и доступны в предложении catch .

Однако я почти уверен, что это недокументированное поведение.

Комментарии:

1. это было изменено при переходе на python 3. Локальные переменные больше не доступны.

2. Почему это было изменено? И почему, интересно, это было недокументированное поведение? Кажется довольно полезным и простым в реализации.