Коллега сделал класс, но не реализовал магические методы контекстного менеджера. Мы не можем вносить доработки в его код. Можем ли мы на своей стороне сделать этот класс контекстным менеджером? Есть ли другой способ реализовать контекстный менеджер без наследования?

Да, можно обернуть объект контекстным менеджером без изменения класса и наследования. Генераторная обёртка выполняет подготовку до 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее