装饰师args和kwargs在元组内返回

时间:2013-05-09 19:17:50

标签: python methods arguments decorator

我有以下装饰器和类。

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

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

谢谢!

2 个答案:

答案 0 :(得分:4)

当你致电fn(self, args, kwargs)时,你传递了两个位置参数:args的元组和kwargs的字典。因此,如果您致电work(1, x=2),则会致电func(self, (1,), {'x': 2})。要将origianl args和kwargs扩展为单独的参数,您需要执行

fn(self, *args, **kwargs)

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

您可以查看有关此here的文档。

答案 1 :(得分:2)

因为您将kwargs代替**kwargs

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