【问题标题】:how to use an arbitrary function in a wrapper function in Python如何在 Python 的包装函数中使用任意函数
【发布时间】:2013-12-06 14:50:43
【问题描述】:

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

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) 中使用任意函数是否合理?感谢您的帮助。

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

【问题讨论】:

    标签: python function wrapper keyword-argument


    【解决方案1】:

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

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

    输出:

    12
    

    正如@svk 在 cmets 中指出的那样,functionWrapper 的文档字符串说:

    这个函数需要一个函数和一个名为的字典作为输入 该函数的参数。

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

    def functionWrapper(function, kwargs):
    

    并修正 dict 中的错字,否则你会得到 0 作为答案:

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

    '

    【讨论】:

    • 并注意将第二个被乘数更改为multiplicand2
    • 这似乎与functionWrapper 的文档字符串不一致,这似乎是说functionWrapper 应该采用两个参数:一个可调用的和一个字典,而不是可调用的和任意的关键字参数的数量。
    【解决方案2】:

    只需在函数定义中将**kwargs更改为kwargs即可:

    def functionWrapper(function, kwargs):
    

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

    【讨论】:

      【解决方案3】:

      我觉得这个问题的精神也在乞求这个答案,使其成为更通用的包装。

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-31
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-02
        • 2021-10-05
        相关资源
        最近更新 更多