База Hintsage

Функции и декораторы

Замыкания, decorators, callable-объекты и управление контекстом.

Практика

Вопросы: Функции и декораторы

В следующем контекстном менеджере ошибка возникает и в теле блока, и при выходе. Какое исключение в итоге покинет with?

class Resource:
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc, tb):
        if exc_type is not None:
            raise ValueError("cleanup failed")
        return False

with Resource():
    raise KeyError("body failed")
Программирование PythonФункции и декораторыPython-разработчик серверной платформы

Разберите ситуацию: какие методы контекстных менеджеров будут вызваны, если второй менеджер не смог войти в составной блок with?

class M:
    def __init__(self, name, fail=False):
        self.name, self.fail = name, fail

    def __enter__(self):
        print("enter", self.name)
        if self.fail:
            raise RuntimeError(self.name)
        return self

    def __exit__(self, *exc):
        print("exit", self.name)
        return False

with M("A") as a, M("B", True) as b:
    print("body")

Показано 2140 из 50