2

次のデコレータとクラスがあります。

def auth(fn):

    def check_headers(self):
        print 'checking headers...'
        #self.headers work done here

    def inner(self, *args, **kwargs):
        check_headers(self)
        fn(self, args, kwargs)

    return inner

class Worker(object):

    @auth
    def work(self, *args, **kwargs):
        print 'auth passed'
        print args
        print kwargs


worker_obj = Worker()
worker_obj.work('arg', kw='kwarg')

どの出力:

> checking headers...
> auth passed
> (('arg',), {'kw': 'kwarg'})
> {}

しかし、私はこれを期待していますか:

> checking headers...
> auth passed
> ('arg',)
> {'kw': 'kwarg'}

元のメソッド (work()) が実行されているときに、装飾後に args/kwargs がタプルに入れられるのはなぜですか?

私はそれを取り除くことを知っています

def auth(fn):
    return fn

パラメータは正しく返されますが、返す前にワーカー インスタンス (自己) でいくつかの作業を行う必要があります。私は確かにデコレータについて何かを見逃していました。

ありがとう!

4

2 に答える 2

5

を呼び出すときは、 のタプルと の辞書fn(self, args, kwargs)という 2 つの位置引数を渡します。したがって、 を呼び出すと、 が呼び出されます。元の引数と kwargs を別々の引数に展開するには、次のようにする必要があります。argskwargswork(1, x=2)func(self, (1,), {'x': 2})

fn(self, *args, **kwargs)

work(1, x=2)これは、 を呼び出すと、 も呼び出すことを意味しますfn(self, 1, x=2)

これに関するドキュメントはこちらでご覧いただけます

于 2013-05-09T19:20:50.127 に答える
2

kwargsの代わりに置くからです**kwargs

def inner(self, *args, **kwargs):
    check_headers(self)
    fn(self, *args, **kwargs)
于 2013-05-09T19:20:24.803 に答える