Próbuję napisać menedżera kontekstów, który używa innych menedżerów kontekstów, więc klienci nie muszą znać całego przepisu, tylko interfejsu, który prezentuję. Nie mogę tego zrobić, używając @contextmanager
- kod po yield
nie zostanie wykonany, jeśli przerwie ci wyjątek, więc muszę użyć menedżera opartego na klasach.Pisanie menedżera kontekstu w Pythonie, który sam używa instrukcji o numerze
Oto mały przykład skrypt:
from contextlib import contextmanager
import pprint
d = {}
@contextmanager
def simple(arg, val):
print "enter", arg
d[arg] = val
yield
print "exit", arg
del d[arg]
class compl(object):
def __init__(self, arg, val):
self.arg=arg
self.val=val
def __enter__(self):
with simple("one",1):
with simple("two",2):
print "enter complex", self.arg
d[self.arg] = self.val
def __exit__(self,*args):
print "exit complex", self.arg
del d[self.arg]
print "before"
print d
print ""
with compl("three",3):
print d
print ""
print "after"
print d
print ""
która wyprowadza to:
before
{}
enter one
enter two
enter complex three
exit two
exit one
{'three': 3}
exit complex three
after
{}
Chcę go do wyjścia to:
before
{}
enter one
enter two
enter complex three
{'one': 1, 'three': 3, 'two': 2}
exit complex three
exit two
exit one
after
{}
Czy istnieje jakiś sposób, aby powiedzieć klasę oparty menedżer kontekstu, aby otoczyć się innymi menedżerami kontekstów?
Byłoby przydatne do określenia wersji Pythona. –
Przepraszam, ale dlaczego miałbyś to zrobić? Wydaje mi się to naturalne, że menedżer kontekstowy oparty na klasach powinien zakończyć działanie na końcu, po wyczyszczeniu jego zależności. –
Kierowanie na python 2.7, przepraszam –