Python 使用**kwargs将**kwargs参数传递给另一个函数

Python 使用**kwargs将**kwargs参数传递给另一个函数,python,Python,我不理解以下示例,假设我有以下函数: # 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, &q

我不理解以下示例,假设我有以下函数:

# 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
#python喜欢
def保存(文件名、数据,**kwargs):

fo=openX(文件名,“w”,**kwargs)#,因为字典是一个值。如果要将其作为一组关键字参数传递,则需要使用关键字扩展。

For#2 args将只是具有dict值的形式参数,而不是关键字类型参数

如果要将关键字类型参数传递到关键字参数中 您需要在字典之前指定**,这意味着**参数

有关使用**kw的更多详细信息,请查看此项


语法告诉Python将关键字参数收集到字典中。
save2
将其作为非关键字参数(字典对象)传递。
openX
没有看到任何关键字参数,因此无法使用
**args
。它得到了第三个非关键字参数(字典)。要修复此问题,请更改
openX
函数的定义

def openX(filename, mode, kwargs):
    pass

在第二个示例中,您提供了3个参数:filename、mode和dictionary(
kwargs
)。但是Python需要:2个形式参数加上关键字参数

通过在字典前面加“**”前缀,可以将字典
kwargs
解包为关键字参数

字典(type
dict
)是包含键值对的单个变量

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


任何字典都可以通过在函数调用过程中使用前缀
**
将其解包为关键字参数。

展开@gecco的答案,下面是一个示例,将向您展示其区别:

def foo(**kwargs):
对于kwargs.items()中的条目:
打印(“键:{},值:{}”。格式(条目[0],条目[1]))
#使用普通键呼叫:
foo(a=1,b=2,c=3)
#使用未打包的字典调用:
foo(**{a:1,b:2,c:3})
#使用字典调用失败,因为函数会认为您是
#给它一个位置论点
foo({a:1,b:2,c:3})
#这会产生与任何其他位置参数相同的错误
傅(3)
foo(“字符串”)

在这里,您可以看到解包词典的工作原理,以及为什么发送实际词典会失败

对不起,什么是“关键字扩展”?你的意思是我应该使用dict_var而不是**args,并且只使用def func(参数,dict_var=0)…func(1,{1:“a”,2:“b”})我想知道你为什么在代码中称它为
**args
。这可能是最糟糕的名称,因为人们会把它与
*args
混淆。我从来没有真正使用过*args,所以我使用**args^^,但我可以修改它。所以**kwargs和dict之间有很大的区别?谢谢,我总是喜欢阅读更多关于我不理解的主题。现在我明白了。我认为关键字和dict是一样的。“任何字典都可以通过在函数调用期间使用**前缀扩展为关键字。”另请参见:Python文档打开,实际的代码示例将使这个答案更加清晰。谢谢,但我也希望使用openX而不保存,因此我必须坚持使用关键字。我认为传递关键字与传递dict基本相同,但直到现在我才知道:)@xMRW它们不可能是同一件事,因为你也可以将字典作为参数传递给任何函数。那么你的#1就是正确的。