¿Es posible acceder al objeto de contexto (bloque de código) dentro del método __exit __ () de un administrador de contexto?

Me gustaría invocar el código de nuevo en elsalida() Método si genera una excepción (tal vez varias veces, tal vez con retraso). Sé que es muy fácil hacerlo con un decorador, pero mi motivación es que a veces quiero repetir solo un fragmento de código que no quiero extraer a una función separada y decorarlo. Estoy buscando algo en este sentido:

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

Se usaría así:

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

y la salida esperada sería:

0
1  

Pude encontrar una manera de obtener el objeto de código. Ninguno de los atributos del administrador de contexto parece referirse a él (supongo que no es realmente necesario, porque el trabajo es hacer cosas antes y después).

¿Es posible hacer lo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta