Да, можно обернуть объект контекстным менеджером без изменения класса и наследования. Генераторная обёртка выполняет подготовку до yield и освобождение ресурса в finally.
Коллега сделал класс, но не реализовал магические методы контекстного менеджера. Мы не можем вносить доработки в его код. Можем ли мы на своей стороне сделать этот класс контекстным менеджером? Есть ли другой способ реализовать контекстный менеджер без наследования?
Да, можно обернуть объект контекстным менеджером без изменения класса и наследования. Генераторная обёртка выполняет подготовку до yield и освобождение ресурса в finally.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Да, можно обернуть объект контекстным менеджером без изменения класса и наследования. Генераторная обёртка выполняет подготовку до yield и освобождение ресурса в finally.
from contextlib import contextmanager
@contextmanager
def managed(factory):
resource = factory()
try:
yield resource
finally:
resource.close()
Здесь предполагается, что объект имеет корректный метод close. Если у него другая операция завершения, используйте её; универсально угадать cleanup нельзя. Для одного close подходит contextlib.closing, для набора динамических ресурсов — ExitStack. Ошибки тела не следует подавлять без явного требования.
Источник: peps.python.org.