我想创建一个装饰器,它可以包含具有不同数量变量的函数。例如,下面我有两个函数abc
和abcd
,分别取2和3个参数。我希望包装器采用可变数量的参数来处理这个问题。但是,当我运行代码时,我得到TypeError: _wrapper() takes exactly 0 arguments (2 given)
,好像忽略了**kwargs
。
为什么会这样,我该如何解决这个问题?
def dec(function):
def _wrapper(**kwargs):
print len(kwargs)
function(**kwargs)
return _wrapper
@dec
def abc(a, b):
return a*b
@dec
def abcd(a, b, c):
return a*b*c
答案 0 :(得分:4)
Python有两个变量参数变量:*args
和**kwargs
。 args
是未指定名称的参数列表(例如func(1,2,3)
),而kwargs
是带名称的参数字典(例如func(x=1, y=2, z=3)
)。
您的代码只接受kwargs,因此您还需要添加未命名的args:
def dec(function):
def _wrapper(*args, **kwargs):
print len(args) + len(kwargs)
return function(*args, **kwargs)
return _wrapper