Контекстный менеджер, подавляющий указанные исключения

В __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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее