如何在Python中的包装函数中使用任意函数

时间:2013-12-06 14:50:43

标签: python function wrapper keyword-argument

我想创建一个类似于以下内容的包装函数:

def functionWrapper(function, **kwargs):
    """
        This function requires as input a function and a dictionary of named arguments for that function.
    """
    results=function(**kwargs)
        print results

def multiply(multiplicand1=0, multiplicand2=0):
    return multiplicand1*multiplicand2

def main():
    functionWrapper(
        multiply,
        {
            'multiplicand1': 3,
            'multiplicand2': 4,
        }
    )

if __name__ == "__main__":
    main()

我遇到了这个实现的困难:

TypeError: functionWrapper() takes exactly 1 argument (2 given)

我该如何解决这个问题?我在包装函数function(**kwargs)中使用任意函数是否合理?谢谢你的帮助。

编辑:字典规范中的修正错误

3 个答案:

答案 0 :(得分:3)

将dict项目传递给该函数时使用**;

**{
   'multiplicand1': 3,
   'multiplicand2': 4,
  }

<强>输出:

12

正如@svk在评论中指出的那样,functionWrapper的doctstring说:

  

此函数需要输入一个函数和一个named的字典   该函数的参数。

因此,在这种情况下,您需要将函数定义更改为:

def functionWrapper(function, kwargs):

并修复字典中的拼写错误,否则你会得到0作为答案:

'multiplicand1': 3,
'multiplicand1': 4,  #Change this to 'multiplicand2

答案 1 :(得分:2)

只需在功能保护中将**kwargs更改为kwargs

def functionWrapper(function, kwargs):

What does ** (double star) and * (star) do for parameters?

答案 2 :(得分:1)

我觉得这个问题的精神也在乞求这个答案,让它成为一个更普遍的包装。

def functionWrapper(func, *args, **kwargs):

    results = func(*args, **kw)

    print results 

def multiply(multiplicand1=0, multiplicand2=0):
    return multiplicand1*multiplicand2

if __name__ == "__main__":

    functionWrapper(multiply, multiplicand1=3, multiplicand2=4)
    # 12

    functionWrapper(multiply, 3, 4)
    # 12

    functionWrapper(multiply, 3)
    # 0

    functionWrapper(multiply)
    # 0

    functionWrapper(multiply, 5, multiplicand2=4)
    # 20