装饰器args和kwargs在元组中返回

问题描述 投票:0回答: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

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

python methods arguments decorator
2个回答
6
投票

当您调用

fn(self, args, kwargs)
时,您将传递两个位置参数:
args
的元组和
kwargs
的字典。因此,如果您拨打
work(1, x=2)
,您就会拨打
func(self, (1,), {'x': 2})
。要将原始参数和 kwargs 扩展为单独的参数,您需要执行以下操作

fn(self, *args, **kwargs)

这意味着当您拨打

work(1, x=2)
时,您也会拨打
fn(self, 1, x=2)

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


2
投票

因为你把

kwargs
而不是
**kwargs

def inner(self, *args, **kwargs):
    check_headers(self)
    fn(self, *args, **kwargs)
© www.soinside.com 2019 - 2024. All rights reserved.