将**kwargs参数传递给另一个带有**kwargs的函数

2024-10-06 11:42:28 发布

您现在位置: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, "w", kwargs) # <- #2
    fo.write(data)
    fo.close()

def openX(filename, mode, **kwargs):
    #doing something fancy and returning a file object

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


Tags: 功能closedatasavedef解决方案filenamedict
3条回答

因为字典是一个值。如果要将其作为一组关键字参数传递,则需要使用关键字扩展。

**语法告诉Python将关键字参数收集到字典中。save2将其作为非关键字参数(dictionary对象)传递。openX没有看到任何关键字参数,因此不会使用**args。而是得到第三个非关键字参数(字典)。修正了openX函数的定义。

def openX(filename, mode, kwargs):
    pass

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

通过在字典前面加上“**”,可以将字典kwargs解压到关键字参数。

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

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

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

相关问题 更多 >