2011-07-26 35 views
0

我使用decorator模塊來裝點一些功能。我想裝飾相當普遍,所以我允許它有任意數量的參數和關鍵字參數(只要有兩個以上參數):問題與裝飾和關鍵字參數

from decorator import decorator 

def wrap(f): 
    return decorator(_wrap, f) 

def _wrap(function, t, f, *args, **kwargs): 

    print 't=', t 
    print 'f=', f 
    print 'args=', args 
    print 'kwargs=', kwargs 

@wrap 
def read(a, b, c=False, d=True): 
    pass 

read(1, 2, d=True) 

的問題是,上述回報率:

t= 1 
f= 2 
args= (False, True) 
kwargs= {} 

FalseTrue來自c=d=,所以不宜他們在kwargs,即:

t= 1 
f= 2 
args= (,) 
kwargs= {'c':False, 'd':True} 

回答

2

cd位置參數。他們的名字都包含在函數對象的元數據(因爲你用decorator,它也保留在包裝),因此你可以在調用函數時參考他們的名字,但他們還是位置參數,並通過他們的名字只會招致指定它們他們被置於args的正確位置。它按預期工作,爲什麼它是一個問題?

+0

說我包兩個函數,''高清讀取(A,B,C =假d = True):''和def'read read2(a,b,d = False,c = True):'',你在說我無法知道c和d在_wrap裏面嗎?想象一下,如果''d =''是''verbose ='',並且我想只在verbose = True的情況下打印出_wrap中的信息 - 我可以這樣做嗎? – astrofrog

+0

@astrofrog:你可以(如果你真的需要的話)從argspec中推斷出來(參見'inspect' stdlib模塊)。但是如果它是封裝器的信息,封裝器應該明確地將它作爲參數(並可能將它傳遞給封裝的函數)? – delnan

相關問題