Czy można uzyskać dostęp do obiektu kontekstowego (bloku kodu) wewnątrz metody __exit __ () menedżera kontekstu?

Chciałbym ponownie wywołać obiekt kodu wwyjście() metoda, jeśli wywołuje wyjątek (może kilka razy, może z opóźnieniem). Wiem, że bardzo łatwo jest to zrobić z dekoratorem, ale moją motywacją jest to, że czasami chcę powtórzyć tylko fragment kodu, którego nie chcę wyodrębniać do osobnej funkcji i dekorować. Szukam czegoś podobnego:

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

Użyłoby to tak:

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

a oczekiwany wynik to:

0
1  

Mogłem znaleźć sposób na zdobycie obiektu kodu. Żaden z atrybutów menedżera kontekstu nie odnosi się do niego (chyba nie jest to naprawdę potrzebne, ponieważ jego zadaniem jest po prostu robić rzeczy przed i po).

Czy można to zrobić?

questionAnswers(1)

yourAnswerToTheQuestion