Оператор with в Python реализует протокол контекстного менеджера, гарантируя правильное получение и освобождение ресурсов — даже если во время выполнения произойдет исключение.
Протокол контекстного менеджера полагается на два специальных метода:
__enter__: вызывается при входе в блок with; обычно получает ресурс и опционально возвращает его через as__exit__: вызывается при выходе из блока with; отвечает за очистку — например, закрытие файлов или освобождение блокировокwith open("file.txt") as f:
data = f.read()
open("file.txt") возвращает объект контекстного менеджера__enter__, возвращая объект файла, который присваивается f__exit__ вызывается автоматическиМетод __exit__ получает информацию об исключении в виде аргументов:
True, исключение подавляетсяFalse или None, исключение распространяется дальшеТы можешь реализовать собственный контекстный менеджер, определив __enter__ и __exit__ в классе, или использовать декоратор contextlib.contextmanager для более простого подхода:
from contextlib import contextmanager
@contextmanager
def my_resource():
print("Acquiring")
yield
print("Releasing")
Оператор with гарантирует детерминированную очистку, что делает его предпочтительным способом управления ресурсами — файлами, подключениями к базам данных, блокировками — вместо громоздких блоков try/finally.
Метод __exit__ гарантированно будет вызван даже если внутри блока with возникнет исключение, что делает его подходящим для детерминированных операций очистки.
Новый — ещё не проверен сообществом
Вы