我不明白下面的例子,假设我有这些功能:
# 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个参数。
这背后的原因是什么?
因为字典是一个值。如果要将其作为一组关键字参数传递,则需要使用关键字扩展。
**
语法告诉Python将关键字参数收集到字典中。save2
将其作为非关键字参数(dictionary对象)传递。openX
没有看到任何关键字参数,因此不会使用**args
。而是得到第三个非关键字参数(字典)。修正了openX
函数的定义。在第二个示例中,您提供了3个参数:文件名、模式和字典(
kwargs
)。但是Python需要:2个形式参数加上关键字参数。通过在字典前面加上“**”,可以将字典
kwargs
解压到关键字参数。字典(类型
dict
)是包含键值对的单个变量。“关键字参数”是键值方法参数。
任何字典都可以通过在函数调用期间以
**
前缀将其解压缩为关键字参数。相关问题 更多 >
编程相关推荐