关于python:Decorator args和kwargs在元组内返回

Decorator args and kwargs returned within tuple

我有以下装饰和课程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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')

哪个输出:

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

但我期待这个:

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

为什么在运行原始方法(work())后,args / kwargs会被置于元组中?

我知道剥离它

1
2
def auth(fn):
    return fn

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

谢谢!


当你调用fn(self, args, kwargs)时,你传递两个位置参数:args的元组和kwargs的dict。 因此,如果您拨打work(1, x=2),则会拨打func(self, (1,), {'x': 2})。 要将origianl args和kwargs扩展为单独的参数,您需要这样做

1
fn(self, *args, **kwargs)

这意味着当你拨打work(1, x=2)时,你也会打电话给fn(self, 1, x=2)

您可以在此处查看相关文档。


因为你把kwargs而不是**kwargs

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