使用装饰器包装使用可变数量参数的函数

时间:2016-01-08 17:46:40

标签: python python-decorators

我想创建一个装饰器,它可以包含具有不同数量变量的函数。例如,下面我有两个函数abcabcd,分别取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

1 个答案:

答案 0 :(得分:4)

Python有两个变量参数变量:*args**kwargsargs是未指定名称的参数列表(例如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