É possível acessar o objeto de contexto (bloco de código) dentro do método __exit __ () de um gerenciador de contexto?
Gostaria de chamar o objeto de código novamente noSaída() se gerar uma exceção (talvez várias vezes, talvez com atraso). Sei que é muito fácil fazer com um decorador, mas minha motivação é que às vezes quero repetir apenas um fragmento de código que não quero extrair para uma função separada e decorá-lo. Estou procurando algo nesse 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
Seria usado assim:
x = 0
with again():
print x
x += 1
if x == 1:
raise Exception('I hate 1')
e o resultado esperado seria:
0
1
Eu poderia encontrar uma maneira de se apossar do objeto de código. Nenhum dos atributos do gerenciador de contexto parece referenciá-lo (acho que não é realmente necessário, porque seu trabalho é apenas fazer as coisas antes e depois).
É possível fazê-lo?