Реализуйте контекстный менеджер, который будет игнорировать переданные типы исключений, возникающие внутри блока with. Если выкидывается "не ожидаемый" тип исключения, то он прокидывается (слово мне это мало знакомо, что оно в реале значит, можно лишь предполагать) выше.
Терпеть не могу непонятные формулировки.
Внезапно, ответ, на "прокинуть", нашелся в англо-русском переводчике:
Далее по задаче идет несколько примеров выполнения кода, и какие-то другие объяснения, но мне стало ясно, что ничего не ясно...
Чтобы определить, является ли вызванное исключение дочерним по отношению к переданным классам ошибок, воспользуйтесь функцией issubclass. Вторым аргументом она может принимать кортеж классов.
Прилагается шаблон программы из которой нужно реализовать этот "контекстный менеджер":
А раз задача мне толком не понятна, то пойду почитаю чат в "телеге", попытаюсь понять что другие люди поняли о задаче, которую предстоит выполнить...
Да, что-то я там нашел, немногим ясней стала цель работы. Я совершенно забыл как толком работает контекстный менеджер with... Изучал я это более полутора лет назад и осталось только образное представление о том как это работает.
Немного теории о создании контекстных менеджеров:
Чтобы создать свой контекстный менеджер в Python, вам необходимо определить класс, который содержит методы __enter__() и __exit__().
Метод __enter__ вызывается при входе в контекстный блок (после оператора with). В данном случае, он открывает файл и возвращает его. Это значение можно использовать внутри контекстного блока, как показано выше.
Метод __exit__ вызывается при выходе из контекстного блока, не зависимо от того, произошла ли ошибка или нет. Он обычно используется для освобождения ресурсов или закрытия файлов. В данном случае, он закрывает файл.
Важно отметить, что метод __exit__ принимает три аргумента: type, value и traceback. Эти аргументы используются для обработки исключений, возникающих внутри контекстного блока. Если внутри блока with произошло исключение, Python передает его тип, значение и след (объект traceback) в метод __exit__. Это позволяет обрабатывать исключения прямо внутри метода __exit__.
В общем, методы __enter__ и __exit__ позволяют управлять ресурсами более эффективно и безопасно, минимизируя вероятность утечек ресурсов и обеспечивая корректное завершение операций, даже в случае возникновения исключений..
Повторили теорию, приступим к практике:
Собственно сам контекстный менеджер написать было не трудно, тут кода почти нет, верней, в шаблоне не много изменилось:
В метод __init__ передаются те ошибки которые нужно игнорировать, __enter__ остается без изменений а в __exit__ добавляем проверку является ли исключение дочерним по отношению к базовому классу BaseException.
Ну теперь осталось написать тесты для данного контекстного менеджера. И тут я попал в ступор, я не понял, для каких ситуаций нужно писать тесты. Какой то хитрый программер написал вот такие условия для тестов:
- Ошибка игнорируется.
- Ошибка прокидывается выше.
- Ошибка прокидывается выше во внутреннем блоке и игнорируется во внешнем.
- Дочерние ошибки игнорируются.
Вроде бы на русском языке написано а что делать - я так и не понял.
Признаюсь честно, я скопировал тесты с гитхаб Мирона Аносова. Не все конечно, но добрую половину. Ибо надо отправлять работу на проверку, а я сижу и занимаюсь прокрастинацией...
То что я тему тестов плохо понимаю - это факт! Но как правило все темы со временем начинают в голове складываться в общую картину и как по щелчку пальцев становится всё понятно. В общем отправлю это задание как есть, и посмотрим что скажет куратор.