Код Senior Исключения и контекстные менеджеры обновлено

Открыть ресурсы и закрыть их при ошибке

Условие

Напишите open_all(names, fail_on), используя contextlib.ExitStack: открывает ресурсы Resource(name) по очереди (класс-контекстный менеджер дан в проверке, он пишет события в журнал); если имя совпало с fail_on, при открытии бросается OSError. После успешного открытия всех ресурсов запишите в журнал "work". Все открытые ресурсы должны закрыться в обратном порядке и при успехе, и при ошибке. Проверка run(names, fail_on) возвращает журнал событий и "OSError", если ошибка вылетела наружу.

Примеры

run(["a", "b"], null) // ["open a", "open b", "work", "close b", "close a"]
run(["a", "b", "c"], "b") // ["open a", "close a", "OSError"]
run([], null) // ["work"]

Как подойти

Подсказки: 1
  1. stack.enter_context(cm) входит в контекст и регистрирует выход.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.