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ć?