首页 文章

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

提问于
浏览
1

我有以下装饰和课程 .

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

  • 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上查看文档 .

  • 2

    因为你把 kwargs 而不是 **kwargs .

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

相关问题