Работа с содержимым файла, несмотря на ошибку в блоке 'with' - PullRequest
0 голосов
/ 16 сентября 2010

Я только что написал утилиту на Python, чтобы сделать то, что мне нужно (не имеет значения, но это генерировать ctags-совместимый файл тегов для внутреннего DSL).

В любом случае - я открываюи чтение файла в контексте оператора with, и мне любопытно, как люди склонны обрабатывать сбои в этом процессе?

Мое решение -

with open(filename, 'rt') as f:
    content = f.read()

matches = re.findall(REGEX, content)

if len(matches) > 0:
    # do more stuff...
    pass

Iпоставьте проверку соответствия вне оператора with, потому что мне нравится, когда файл закрывается и делается с.Однако, если content никогда не будет создан, это не получится.

Мое решение состояло в том, чтобы инициализировать content пустой строкой чуть выше этого бита кода, но у меня возникает ощущение, что я бы хотелфункция просто до конца;исключение выдается из функции или чего-то в этом роде.

В этом случае я мог бы поместить остальную часть функции в блок with, но это расширяет область действия открытого файла.Я могу создать content перед блоком with, чтобы он существовал в свете сбоя.Мне любопытно, однако, какие другие решения люди хотели бы видеть (предполагая, что вопрос имеет какой-то смысл в первую очередь)?

Полагаю, мне бы хотелось что-то вроде этого:

with open(filename, 'rt') as f:
    content = f.read()
else:
    content = ''

matches = re.findall(REGEX, content)

Я приму идею, что мне просто нужно разобраться с этим, и оставлю файл открытым для остальной части функции, если это общий консенсус.:)

1 Ответ

1 голос
/ 16 сентября 2010

Что бы я сделал, как вы сказали:

content = ''
with open(filename, 'rt') as f:
    content = f.read()

matches = re.findall(REGEX, content)

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

Тем не менее, немедленное закрытие файла не так важно, если оно закрыто в конце, при условии, что вы не используете его повторно.

...