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

正确返回参数,但我需要在返回之前对工作实例(self)做一些工作。我肯定错过了一些关于装饰器的东西。

谢谢!

4

2 回答 2

5

当您调用 时fn(self, args, kwargs),您传递了两个位置参数: 的元组args和 的字典kwargs。所以如果你打电话work(1, x=2),你就会打电话func(self, (1,), {'x': 2})。要将原始 args 和 kwargs 扩展为单独的参数,您需要这样做

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 回答