with вызывает enter контекстного менеджера, выполняет тело блока и затем exit, в том числе при исключении. Так удобно управлять файлами, блокировками и транзакциями.
Как работает `with` и контекстный менеджер?
with вызывает __enter__ контекстного менеджера, выполняет тело блока и затем __exit__, в том числе при исключении. Так удобно управлять файлами, блокировками и транзакциями.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
with вызывает enter контекстного менеджера, выполняет тело блока и затем exit, в том числе при исключении. Так удобно управлять файлами, блокировками и транзакциями.
Значение после as — результат __enter__, не обязательно сам менеджер. __exit__ получает тип, значение и traceback исключения; истинный результат подавляет его. Если __enter__ сам завершился ошибкой, обычный выход для этого менеджера не вызывается, поэтому частичный захват ресурсов нужно обработать внутри входа. Пример with open(path) as file закрывает файл независимо от успешности чтения. Контекстный менеджер не обязательно связан с закрытием: он может временно менять состояние и затем восстанавливать его.