我有以下装饰和课程 .
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 回答
当你调用
fn(self, args, kwargs)
时,你传递两个位置参数:args
的元组和kwargs
的字典 . 因此,如果您致电work(1, x=2)
,您将致电func(self, (1,), {'x': 2})
. 要将origianl args和kwargs扩展为单独的参数,您需要这样做这意味着当你调用
work(1, x=2)
时,你也会调用fn(self, 1, x=2)
.您可以在此here上查看文档 .
因为你把
kwargs
而不是**kwargs
.