Код 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
stack.enter_context(cm)входит в контекст и регистрирует выход.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.