#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. Почему это было изменено? И почему, интересно, это было недокументированное поведение? Кажется довольно полезным и простым в реализации.