I thought what to do
@f
def g():
print 'hello'
exactly matches
def g():
print 'hello'
g=f(g)
But I had this code that uses contextlib.contextmanager:
@contextlib.contextmanager
def f():
print 1
yield
print 2
with f:
print 3
which works and gives 1 3 2
And when I tried to change it to
def f():
print 1
yield
print 2
f=contextlib.contextmanager(f)
with f:
print 3
I get AttributeError: 'function' object has no attribute '__exit__'
What am I missing? Is there any kind of black magic specially in contextlib.contextmanager, or am I misunderstanding how decorators in general work?
source
share