把** kwargs的参数传给** kwargs的另一个函数

我不明白下面的例子,可以说我有这些function:

# python likes def save(filename, data, **kwargs): fo = openX(filename, "w", **kwargs) # <- #1 fo.write(data) fo.close() # python doesnt like def save2(filename, data, **kwargs): fo = openX(filename, "w", kwargs) # <- #2 fo.write(data) fo.close() def openX(filename, mode, **kwargs): #doing something fancy and returning a file object 

为什么#1是正确的解决scheme,#2是错误的? **kwargs基本上是一个字典,所以如果我想传递给openX的参数,我认为正确的方法是没有** ,只是给字典。 但python显然不喜欢第二个,并告诉我,我给了3而不是2个参数。 那么这背后的原因是什么?

在第二个例子中,您提供了3个参数:文件名,模式和字典( kwargs )。 但是Python期望:2个forms参数和关键字参数。

通过以'**'作为词典的前缀,你可以将字典kwargs解开为关键字参数。

字典(typesdict )是包含键值对的单个variables。

“关键字参数”是键值方法参数。

任何字典可以通过在函数调用期间用**作为前缀来解压缩到关键字参数。

**语法告诉Python将关键字参数收集到字典中。 save2将其作为非关键字参数(字典对象)传递。 openX没有看到任何关键字参数,所以**args没有被使用。 而是得到第三个非关键字参数(字典)。 修复这个改变了openX函数的定义。

 def openX(filename, mode, kwargs): pass 

因为字典是一个单一的值。 如果要将其作为一组关键字parameter passing,则需要使用关键字扩展。

对于#2参数将只是一个forms参数与字典值,而不是关键字types参数。

如果你想将关键字typesparameter passing给关键字参数,你需要在你的字典之前指定**,这意味着**参数

检查这个了解更多关于使用** kw的细节

http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/