Контекстный менеджер не может подменить результат выражения 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 сам по себе ошибку не подавил бы.