Gostaria de usar o decorador deco
para remodelar os métodos de instância __enter__
e __exit__
. O código é executado, mas o wrapper não é executado na with
seção. Veja abaixo a saída real, seguida pela saída esperada e, por fim, o código.
Saída de corrente:
In __init__
-------------------
In __enter__
-------------------
In wrapper
Blah, blah, blah
-------------------
In __exit__
Saída esperada:
In __init__
-------------------
In wrapper
In __enter__
-------------------
In wrapper
Blah, blah, blah
-------------------
In wrapper
In __exit__
class contMgr():
def __init__(self):
print("In __init__")
pass
def __enter__(self):
print("In __enter__")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("In __exit__")
pass
def __call__(self, *args, **kwargs):
print("In __call_")
def brol():
print("brol")
def deco(func):
def wrapper(*args,**kwargs):
print("In wrapper")
result = func(*args, **kwargs)
return result
return wrapper
@deco
def test():
print("Blah, blah, blah")
mgr = contMgr()
mgr.__enter__ = deco(mgr.__enter__)
mgr.__exit__ = deco(mgr.__exit__)
print("------------------------")
with mgr:
print("------------------------")
test()
print("------------------------")