2011-07-26 20 views
0

私はdecoratorモジュールを使用していくつかの機能を装飾しています。 (限り、2つ以上の引数があるので)私は、デコレータはかなり一般的になりたいので、私はそれが引数とキーワード引数の任意の数を持つことができるようにしています:デコレータとキーワード引数の問題

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= (,) 
kwargs= {'c':False, 'd':True} 
:、すなわち

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

が、FalseTruec=d=から来るので、彼らはkwargsにすべきではありません

答えて

2

cおよびdポジション引数です。それらの名前は関数オブジェクトのメタデータに含まれています(decoratorを使用しているため、ラッパーにも保存されています)ので、関数を呼び出すときにその名前を参照できますが、それらは依然として位置引数であり、彼らはargsの正しい位置に置かれています。そしてそれは期待どおりに機能します、なぜそれが問題なのですか?念のため

+0

をd、デフ(A、B、C = Falseを読んで、 ''、私は2つの機能をラップ言います=真): ''と '' def read2(a、b、d = False、c = True): ''あなたはcとdが何の内側にあるのか分からないと言っていますか? '' d = ''が '' verbose = ''だったとし、 '' verbose = True''の場合にのみ_wrapの中に情報を出力したいと考えています。 – astrofrog

+0

@astrofrog:argspecから推論することができます(本当に必要な場合)( 'inspect' stdlibモジュールを参照してください)。しかし、それがラッパーの情報ならば、おそらくラッパーはそれを明示的に引数として取るべきです(そしてラップされた関数に渡す可能性があります)。 – delnan

関連する問題