Ist es möglich, innerhalb der __exit __ () -Methode eines Kontextmanagers auf das Kontextobjekt (Codeblock) zuzugreifen?

Ich möchte das Codeobjekt in der erneut aufrufenAusfahrt() -Methode, wenn eine Ausnahme ausgelöst wird (möglicherweise mehrmals, möglicherweise mit Verzögerung). Ich weiß, dass es mit einem Dekorateur sehr einfach ist, aber meine Motivation ist, dass ich manchmal nur ein Codefragment wiederholen möchte, das ich nicht in eine separate Funktion extrahieren und dekorieren möchte. Ich suche nach etwas in dieser Richtung:

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

Es würde so verwendet:

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

und die erwartete Ausgabe wäre:

0
1  

Ich könnte einen Weg finden, an das Code-Objekt heranzukommen. Keines der Context Manager-Attribute scheint darauf zu verweisen (ich denke, es wird nicht wirklich benötigt, da es nur darum geht, Dinge vorher und nachher zu erledigen).

Ist es möglich, es zu tun?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage