【问题标题】:Decorator args and kwargs returned within tuple在元组中返回的装饰器 args 和 kwargs
【发布时间】:2013-05-09 19:17:49
【问题描述】:

我有以下装饰器和类。

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)做一些工作。我肯定错过了一些关于装饰器的东西。

谢谢!

【问题讨论】:

    标签: python methods arguments decorator


    【解决方案1】:

    当您调用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)

    您可以在此here 上查看文档。

    【讨论】:

    • 太棒了,太快了!谢谢。
    【解决方案2】:

    因为您输入的是kwargs 而不是**kwargs

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

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 2013-09-25
      • 1970-01-01
      • 2016-04-20
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2022-06-11
      相关资源
      最近更新 更多