Этот вопрос проверяет понимание механизма автоматического управления ресурсами в Python.
Конструкция with используется для работы с контекстными менеджерами. Она автоматически вызывает __enter__ при входе в блок и __exit__ при выходе. Это происходит даже если внутри блока возникает ошибка. with помогает избежать утечек ресурсов. Чаще всего применяется при работе с файлами и соединениями.
Конструкция with упрощает работу с ресурсами и делает код безопаснее за счет автоматического управления их жизненным циклом.
Когда Python встречает with, он выполняет несколько шагов.
Вызывает метод __enter__
Выполняет код внутри блока
Вызывает метод __exit__ при выходе из блока
Этот порядок сохраняется даже при возникновении исключения.
with open("data.txt") as file:
content = file.read()
Что происходит под капотом:
open() возвращает объект файла
Вызывается file.__enter__()
Выполняется чтение файла
Вызывается file.__exit__() и файл закрывается
Если внутри блока возникает исключение:
Python передает информацию об ошибке в __exit__
Контекстный менеджер может обработать исключение
Ресурс все равно будет освобожден
Использование with улучшает качество кода.
Меньше шаблонного кода
Защита от забытых close()
Повышение читаемости
Конструкцию with стоит использовать всегда, когда объект управляет ресурсами и требует явного освобождения.