Класс как контекст-менеджер. Методы enter и exit. Помогите с решением задачи

Помогите с решением задачи

Задача 2. Пример

На одном собеседовании вам дали такой основной код:

my_obj = Example()
with my_obj as obj:
    print('Код внутри первого вызова контекст менеджера')
    with my_obj as obj2:
        raise Exception('Выброс исключения во вложенном (втором) вызове контекст менеджере')
    print('Я обязательно выведусь...')

Также вместе с этим кодом выдали результат его выполнения:

Вызов init

Вызов enter

Код внутри первого вызова контекст менеджера

Вызов enter

Вызов exit

Тип ошибки: <class 'Exception'>

Значение ошибки: Выброс исключения во вложенном (втором) вызове контекст-менеджера

"След" ошибки: <traceback object at 0x00000234E54CE4C0>

Вызов exit

Тип ошибки: <class 'Exception'>

Значение ошибки: Выброс исключения во вложенном (втором) вызове контекст-менеджера

"След" ошибки: <traceback object at 0x00000234E54CE4C0>

. . . . (тут сама ошибка красным цветом) . . . .

Исходя их этих входных данных, реализуйте класс «Контекст-менеджер», который будет выдавать такой же результат.

После этого поправьте класс так, чтобы сработала последняя строчка основного кода. Сам основной код редактировать нельзя.

Результат с последней строчкой:

Вызов init

Вызов enter

Код внутри первого вызова контекст-менеджера

Вызов enter

Вызов exit

Тип ошибки: <class 'Exception'>

Значение ошибки: Выброс исключения во вложенном (втором) вызове контекст-менеджера

"След" ошибки: <traceback object at 0x00000258ACA4F5C0>

Я обязательно выведусь...

Вызов exit

Вот мой код:

class Example:

    def __init__(self):
        print('Вызов __init__')

    def __enter__(self) -> 'Example':
        print('Вызов __enter__')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Вызов __exit__')
        if Exception:
            print('Тип ошибки: ', exc_type)
            print('Значение ошибки: ', exc_val)
            print('"След" ошибки: ', exc_tb)
        else:
            return True

my_obj = Example()

with my_obj as obj:
    print('Код внутри первого вызова контекст менеджера')
    with my_obj as obj2:
        raise Exception('Выброс исключения во вложенном (втором) вызове контекст менеджере')
    print('Я обязательно выведусь...')

Не могу выполнить последнюю строчку!


Ответы (1 шт):

Автор решения: Бимба
class Example:
    def __init__(self) -> None:
        print('Вызов __init__')

    def __enter__(self):
        print('Вызов __enter_')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb) -> bool:
        print('Вызов __exit__')
        if Exception and not exc_type is None:
            print('Тип ошибки: ', exc_type)
            print('Значение ошибки: ', exc_val)
            print('"След" ошибки: ', exc_tb)
        return True

my_obj = Example()

with my_obj as obj:
    print('Код внутри первого вызова контекст менеджера')
    with my_obj as obj2:
        raise Exception('Выброс исключения во вложенном (втором) вызове контекст менеджере')
    print('Я обязательно выведусь...')
→ Ссылка