将**kwargs传递给取消引用函数



希望标题传达了正确的信息。

我的问题是我不明白为什么呼叫kwarg_function(some_func, a=1, b=2, c=3)失败。我本以为,由于"c"没有用some_func()引用,它会被忽略。有人能解释为什么"c"没有被简单地忽略吗。

def kwarg_function(function, **kwargs):
print(kwargs)
function(**kwargs)
def some_func(a, b):
print(f"type: {type(a)} values: {a}")
print(f"type: {type(b)} values: {b}")

kwarg_function(some_func, a=1, b=2)         # called successfully
kwarg_function(some_func, a=1, b=2, c=3)    # fails with unexpected keyword arg 'c'   

**想象为"将我右边的内容分解为关键字arguments"在这种情况下。

def foo(a,b,**kwargs):
# This will take any number of arguments provided that starting from the 3rd one they are keyword args

# Those are equivalent (and working) calls
foo(1,2, x = 7)
foo(1,2, **{"x":7})
# Those will fail
foo(1,2,7)
foo(1,2, {"x":7})

您声明的函数需要2个参数

def some_func(a, b):

你称之为"三个在引擎盖下",因为这是:

kwarg_function(some_func, a=1, b=2, c=3)    # fails with unexpected keyword arg 'c'   

这样做(在kwarg_function体内):

funtion(a=1,b=2,c=3)

在python中,***用于拆包可迭代项。他们不会考虑里面有什么,只会打开你放进去的东西。

你可以在这个链接中找到更多关于它的信息。

因此,当您将a=1, b=2, c=3, ...作为kwargs传递给kwargs_function时,无论您传递了什么,都将获得它们作为kwargs参数。

然后,当您将**kwargs传递给另一个函数时,所有的数据都将传递给您的另一个功能,而不管其中有什么。

如果你想让你的some_func更灵活地处理你的数据,并接受你传递给它的任何东西,你也可以给它添加**kwargs参数:

def some_func(a, b, **kwargs):
print(f"type: {type(a)} values: {a}")
print(f"type: {type(b)} values: {b}")

最新更新