Можно ли получить доступ к объекту контекста (блоку кода) внутри метода __exit __ () менеджера контекста?

Я хотел бы снова вызвать объект кода вВыход() метод, если он вызывает исключение (возможно, несколько раз, может быть, с задержкой). Я знаю, что это очень легко сделать с декоратором, но моя мотивация заключается в том, что иногда я хочу повторить какой-то фрагмент кода, который не хочу извлекать в отдельную функцию, и украсить его. Я ищу что-то вроде этого:

class again(object):
    def __enter__(self):
        pass

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is not None:
            ????        # Invoke the code object again
            return True # eat exception

Было бы так:

x = 0
with again():
    print x
    x += 1
    if x == 1:
         raise Exception('I hate 1')

и ожидаемый результат будет:

0
1  

Я мог бы найти способ получить объект кода. Кажется, что ни один из атрибутов менеджера контекста не ссылается на него (я полагаю, что он на самом деле не нужен, потому что его задача - просто делать вещи до и после).

Возможно ли это сделать?

Ответы на вопрос(1)

Ваш ответ на вопрос