我以为这样做
@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 中是否有一些特别的黑魔法,或者我误解了装饰器的一般工作方式?