Я думал, что делает
@f
def g():
print 'hello'
точно так же, как
def g():
print 'hello'
g=f(g)
Но у меня был этот код, который использует contextlib.contextmanager:
@contextlib.contextmanager
def f():
print 1
yield
print 2
with f:
print 3
, который работает и дает 1 3 2
И когда я попытался изменить его на
def f():
print 1
yield
print 2
f=contextlib.contextmanager(f)
with f:
print 3
Я получаю AttributeError: 'function' object has no attribute '__exit__'
Что мне не хватает? Есть ли какая-то черная магия специально в contextlib.contextmanager, или я неправильно понимаю, как работают декораторы в целом?