2010-06-19 57 views
3

我認爲做是Python中的裝飾器,就像調用函數上的函數一樣?

@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

而當我試圖陳GE入

def f(): 
    print 1 
    yield 
    print 2 
f=contextlib.contextmanager(f) 
with f: 
    print 3 

我得到AttributeError: 'function' object has no attribute '__exit__'

我缺少什麼?在contextlib.contextmanager中是否存在一些黑魔法,還是我誤解了裝飾者的工作原理?

回答

5

是,裝飾是調用函數和分配給返回的值

在這種情況下,錯誤出現,因爲你沒有通話功能完全相同,所以正確的代碼將

def f(): 
    print 1 
    yield 
    print 2 

f=contextlib.contextmanager(f) 
with f(): 
    print 3 

還我不知道你是否因同樣的原因測試的代碼,因爲你給了裝飾代碼將失敗

@contextlib.contextmanager 
def f(): 
    print 1 
    yield 
    print 2 
with f: 
    print 3 

錯誤:

with f: 
AttributeError: 'function' object has no attribute '__exit__' 
+0

謝謝!理性的瞬間失效:) – olamundo 2010-06-19 07:47:29