В exit возвращайте True только тогда, когда тип возникшего исключения входит в заданные классы или наследуется от них. Возврат False оставляет исключение неподавленным.
Контекстный менеджер, подавляющий указанные исключения
В __exit__ возвращайте True только тогда, когда тип возникшего исключения входит в заданные классы или наследуется от них. Возврат False оставляет исключение неподавленным.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать контекстный менеджер suppress, который игнорирует заданные типы исключений.
Пример 1:
with suppress(ValueError):
raise ValueError
print("OK")
Ожидаемый вывод: "OK"
Пример 2:
with suppress(ValueError):
raise TypeError
Ожидаемый результат: TypeError будет проброшен наружу.
Ответ
В exit возвращайте True только тогда, когда тип возникшего исключения входит в заданные классы или наследуется от них. Возврат False оставляет исключение неподавленным.
Минимальная реализация для обычных исключений:
class suppress:
def __init__(self, *exceptions):
self.exceptions = exceptions
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
return exc_type is not None and issubclass(exc_type, self.exceptions)
Первый пример продолжит выполнение и выведет OK, второй пробросит TypeError. Подавление не возобновляет выполнение внутри блока после строки с ошибкой: управление переходит за with. Это учебный вариант без специальной обработки частей ExceptionGroup; в прикладном коде предпочтителен стандартный contextlib.suppress.