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

Контекстный менеджер не может подменить результат выражения 1 / 0. Он может подавить исключение, сохранить default в своём поле и отдельно напечатать его, как в примере.

Короткий ответ

Что ответить на собеседовании

Контекстный менеджер не может подменить результат выражения 1 / 0. Он может подавить исключение, сохранить default в своём поле и отдельно напечатать его, как в примере.

Подробный разбор

Ответ с пояснениями

Условие

Создайте контекстный менеджер suppress, который перехватывает исключения указанного типа, фиксирует их в лог и вместо проброса ошибки возвращает значение, переданное через параметр default. Реализацию выполните в виде обычного класса.

Пример 1:

with suppress(ZeroDivisionError, default=0):
    1 / 0

Вывод программы: 0

Ответ

Контекстный менеджер не может подменить результат выражения 1 / 0. Он может подавить исключение, сохранить default в своём поле и отдельно напечатать его, как в примере.

import logging

class suppress:
    def __init__(self, *exceptions, default=None):
        self.exceptions = exceptions
        self.default = default
        self.value = None

    def __enter__(self):
        return self

    def __exit__(self, kind, error, traceback):
        if kind is None or not issubclass(kind, self.exceptions):
            return False
        logging.warning('Подавлено исключение: %s', kind.__name__)
        self.value = self.default
        print(self.default)
        return True

Печать добавлена явно ради указанного вывода 0. При with suppress(...) as state значение затем доступно как state.value. Возвращаемое значение __exit__ означает подавление ошибки, а не результат вычисления; возврат default=0 сам по себе ошибку не подавил бы.

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

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

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

Подробнее