Когда-то в Python файлы открывали вот так:
Код короткий, выглядит понятно, но есть проблема: если между open() и close() что-то упадёт, файл может остаться незакрытым.
Поэтому приходилось руками оборачивать всё в try / finally, следить за закрытием ресурса и не забывать cleanup на ошибках.
Потом в Python появился with, и этот бытовой ад стал намного чище:
with open(path, 'w') as f_obj:
f_obj.write(some_data)
Теперь файл закроется автоматически, даже если внутри блока случится исключение.
Это одна из тех фич Python, которые выглядят мелко, но сильно меняют стиль кода. with убирает ручное управление ресурсами и делает намерение очевидным: вот ресурс, вот область, где он нужен, после выхода из блока его надо корректно закрыть.
Используется не только для файлов:
- соединения с базой
- lock'и
- временные файлы
- сетевые подключения
- транзакции
- любые объекты с контекстным менеджером
Хороший Python-код часто начинается с простого правила: если ресурс надо открыть и потом закрыть, почти всегда нужен with.
#python
f_obj = open(path, 'w')f_obj.write(some_data)f_obj.close()Код короткий, выглядит понятно, но есть проблема: если между open() и close() что-то упадёт, файл может остаться незакрытым.
Поэтому приходилось руками оборачивать всё в try / finally, следить за закрытием ресурса и не забывать cleanup на ошибках.
Потом в Python появился with, и этот бытовой ад стал намного чище:
with open(path, 'w') as f_obj:
f_obj.write(some_data)
Теперь файл закроется автоматически, даже если внутри блока случится исключение.
Это одна из тех фич Python, которые выглядят мелко, но сильно меняют стиль кода. with убирает ручное управление ресурсами и делает намерение очевидным: вот ресурс, вот область, где он нужен, после выхода из блока его надо корректно закрыть.
Используется не только для файлов:
- соединения с базой
- lock'и
- временные файлы
- сетевые подключения
- транзакции
- любые объекты с контекстным менеджером
Хороший Python-код часто начинается с простого правила: если ресурс надо открыть и потом закрыть, почти всегда нужен with.
#python
❤6👍5🥰1👌1