Załóżmy, że masz klasę o określonych __enter__
i __exit__
metod tak:Jak wywołać metodę __exit__ na wyjątku podczas __init__?
class MyClass:
def f(self):
raise Exception
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
pass
Jeśli wyjątek jest podniesione wewnątrz bloku with
, tak:
with MyClass() as ins:
ins.f()
Sposób __exit__
zostaną niejawnie zwanych , co jest bardzo miłe.
Jednak jeśli klasa jest tak:
class MyClass:
def __init__(self):
self.f()
def f(self):
raise Exception
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
pass
I oznacz ją tak:
with MyClass() as ins:
pass
Gdy jest wyjątek wewnątrz metody __init__
, __enter__
ma jeszcze nazwać, i __exit__
również jest nieuczciwy, co nie jest takie miłe. Jaki jest najlepszy sposób, aby temu zaradzić?
Oprócz uchwycenia wyjątku w '__init __()'? –
Jestem ciekawy, czy mogę uzyskać ładne ukryte przechwytywanie, które trwa, gdy wyjątek zostanie podniesiony po wywołaniu obiektu '__enter__', miejmy nadzieję, że uniknie dodatkowego bloku' try'. Być może właśnie uchwycenie wyjątku w '__init__' jest drogą do zrobienia, po prostu zastanawiam się, czy jest coś bardziej pytonowego, co pozwoli mi uniknąć konieczności duplikowania metody' __exit__'. – qwwqwwq
Python nie może wywołać metody '__exit__'; jest to metoda na instancji, która nigdy nie miała szansy na dokończenie budowy. Bez instancji, bez metody "__exit__". Jedynym wyjściem jest obsłużenie wyjątku wewnątrz '.__ init __()' samemu, aby zapewnić zakończenie budowy instancji. –