L-R*_*L-R 2 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')
Run Code Online (Sandbox Code Playgroud)
哪个输出:
> checking headers...
> auth passed
> (('arg',), {'kw': 'kwarg'})
> {}
Run Code Online (Sandbox Code Playgroud)
但我期待这个吗:
> checking headers...
> auth passed
> ('arg',)
> {'kw': 'kwarg'}
Run Code Online (Sandbox Code Playgroud)
当原始方法 (work()) 运行时,装饰后,为什么 args/kwargs 被放入一个元组中?
我知道把它简化为
def auth(fn):
return fn
Run Code Online (Sandbox Code Playgroud)
正确返回参数,但在返回之前我需要对工作实例(自身)做一些工作。我肯定错过了一些关于装饰器的事情。
谢谢!
当您调用 时fn(self, args, kwargs),您将传递两个位置参数: 的元组args和 的字典kwargs。所以,如果你打电话work(1, x=2),你就会打电话func(self, (1,), {'x': 2})。要将原始参数和 kwargs 扩展为单独的参数,您需要执行以下操作
fn(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这将意味着当你打电话时work(1, x=2),你也会打电话fn(self, 1, x=2)。
您可以在此处查看相关文档。