Вопрос проверяет умение создавать собственные контекстные менеджеры для управления ресурсами.
Собственный контекстный менеджер можно реализовать через класс с методами __enter__ и __exit__. В __enter__ инициализируется ресурс. В __exit__ ресурс освобождается. Также можно использовать декоратор contextlib.contextmanager. Это упрощает код и делает его более читаемым.
Python предоставляет два основных способа создания собственных контекстных менеджеров: через класс и через генератор.
Этот способ подходит для сложной логики и хранения состояния.
class FileManager:
def __init__(self, filename):
self.filename = filename
self.file = None
def __enter__(self):
self.file = open(self.filename)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
if self.file:
self.file.close()
Использование:
with FileManager("data.txt") as f:
f.read()
contextlib.contextmanagerОпределение: contextmanager — это декоратор, который позволяет создавать контекстные менеджеры с помощью генератора.
from contextlib import contextmanager
@contextmanager
def file_manager(filename):
file = open(filename)
try:
yield file
finally:
file.close()
Код до yield — аналог __enter__
Код после yield — аналог __exit__
Выбор зависит от сложности задачи.
Класс — для сложного состояния и логики
contextmanager — для простых сценариев
Собственные контекстные менеджеры полезны, когда нужно централизованно управлять ресурсами и гарантировать их корректное освобождение.