我有以下装饰器和类。
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)做一些工作。我肯定错过了一些关于装饰器的东西。
谢谢!
请您参考如下方法:
当您调用 fn(self, args, kwargs) 时,您传递了两个位置参数:args 的元组和 kwargs< 的字典。因此,如果您调用 work(1, x=2),您将调用 func(self, (1,), {'x': 2})。要将 original args 和 kwargs 扩展为单独的参数,您需要做
fn(self, *args, **kwargs)
这意味着当您调用 work(1, x=2) 时,您也会调用 fn(self, 1, x=2)。
您可以查看有关此 here 的文档.
