python: исключение внутри понимания: могу ли я получить значения переменных цикла? - PullRequest
3 голосов
/ 19 мая 2011

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

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 циклом?

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

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

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()}
0 голосов
/ 19 мая 2011

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

ЭтоЯ почти уверен, недокументированное поведение.

...