把** 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/