在Python函数中正确使用kwargs

在Python函数中正确使用kwargs,python,function,keyword-argument,Python,Function,Keyword Argument,我正在试验在Python中的函数中使用kwargs,但我无法正确使用它 以下是我的尝试: def f_add(x, y, a): return(x + y + a) def f_add_wrapper(f_, b, **kwargs): return(f_add(x,y,a**b)) f_add_wrapper(f_ = f_add, b = 2, **{'x' : 2, 'y' :3, 'a' : 2}) --------------------------------

我正在试验在Python中的函数中使用kwargs,但我无法正确使用它

以下是我的尝试:

def f_add(x, y, a):

    return(x + y + a)

def f_add_wrapper(f_, b, **kwargs):

    return(f_add(x,y,a**b))

f_add_wrapper(f_ = f_add, b = 2, **{'x' : 2, 'y' :3, 'a' : 2})
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-236-b37777c914bd> in <module>()
----> 1 f_add_wrapper(f_ = f_add, b = 2, kwargs = [2, 3,  2])

<ipython-input-229-5e01b9db8974> in f_add_wrapper(f_, b, **kwargs)
      1 def f_add_wrapper(f_, b, **kwargs):
      2 
----> 3     return(f_add(x,y,a**b))

NameError: name 'x' is not defined

f_add_wrapper(f_ = f_add, b = 2, **{x : 2, y :3, a : 2})
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-248-b862f2191e7b> in <module>()
----> 1 f_add_wrapper(f_ = f_add, b = 2, **{x : 2, y :3, a : 2})

NameError: name 'x' is not defined

如果我答对了你的问题,解决办法可能是: 您必须更改f_add_包装器方法,并将kwargs传递给内部方法

def f_add_wrapper(f_, b, **kwargs):
    return f_add(**kwargs)
但我现在还没用过参数f和b。 如果你想使用f_u作为方法,你必须写:

def f_add_wrapper(f_, b, **kwargs):
    return f_(**kwargs) 
如果您还想使用变量a,我会在参数列表中添加一个显式变量:

def f_add_wrapper(f_, b, a, **kwargs):
    a_to_power_of_b = a**b
    return f_(a=a_to_power_of_b , **kwargs) 

使用此解决方案,包装器参数列表中未明确提及的每个变量都会传递给内部函数。显式列出的变量可以在包装器中访问。

此错误与kwargs无关,而是与x未定义有关。显然,您是否正在尝试实现装饰器?kwargs的使用是动态的。你不能指望dict中有一个x。从函数的角度来看:它不知道x是什么,也不能指望用户传入kwargsInside包装函数,kwargs是一个字典。为了更好地理解它是如何工作的,我建议在不使用包装器的情况下调用函数,像在那里一样传递dict。会帮助你了解发生了什么