[英]asterisk in tuple, list and set definitions, double asterisk in dict definition
[英]Passing dict with boolean values to function using double asterisk
我有这样的事情:
def x(**kwargs):
y(**kwargs)
def y(**kwargs):
print(kwargs)
d = {
'a': 1,
'b': True,
'c': 'Grace'
}
x(d)
使用调试器,我看到的行为是y()
中的kwargs
等于以下内容:
{
'kwargs': {
'a': 1,
'c': 'Grace'
}
}
我对双星号的理解显然是错误的,因为它应该打包和解压缩键值对的字典,从而使您可以将字典作为关键字参数传递给方法。 但是,有两件事使我感到困惑:
kwargs
键下? 理想情况下,我想避免这两种行为,但显然缺少有关这种双星号行为的详细信息的信息。
我不确定您的代码的行为是什么,但是对我来说它会引发错误。 我们可以通过一个较小的示例得到相同的错误:
def x(**kwargs):
pass
d = {"a": 1, "b": 2}
x(d)
抛出:
TypeError: x() takes 0 positional arguments but 1 was given
问题很简单,这不是**
语法的工作原理。 def x(**kwargs)
表示可以接受任意数量的命名变量的函数,如下所示:
def x(**kwargs):
print(kwargs)
x(a = 1, b = 2)
版画
{'a': 1, 'b': 2}
但是,您将对象d
传递给它,换句话说,您将一个位置变量传递给函数-没有命名变量。 因此,例外。
**
在语法上的另一种独特用法是将kwargs字典拆包成一个函数,该函数已经以通常的方式定义为接受命名参数,例如:
def f(a, b):
print(a, b)
d = {"a": 1, "b": 2}
f(**d)
版画
1 2
要完全掌握这一点,您应该在以下位置查看Python文档中的教程:
https://docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.