2017-03-18 63 views
-1

的功能我有这样的事情:与布尔值传递字典使用双星号

def x(**kwargs): 
    y(**kwargs) 

def y(**kwargs): 
    print(kwargs) 

d = { 
    'a': 1, 
    'b': True, 
    'c': 'Grace' 
} 
x(d) 

我看到的行为,使用调试器,是kwargsy()等于这样的:

{ 
    'kwargs': { 
    'a': 1, 
    'c': 'Grace' 
    } 
} 

我明显错误地理解双星号是因为它应该打包和解压缩键值对的字典,允许您将字典作为关键字参数传递到方法中。然而,有两件事让我困惑:

  • 为什么包装嵌套字典在kwargs键?
  • 为什么布尔值被丢弃?

我理想上喜欢避免这两种行为,但我明显错过了这个双星号行为的细节。

+2

再次检查您的问题...您应该得到TypeError:x()需要0个位置参数,但给出1个。 – pbuck

+2

我在3.5看不到你的行为。首先,我得到一个错误'x()需要0个位置参数',所以改成'x(** d)'不能嵌套在'kwargs'下,显然'x(kwargs = d)'给出了嵌套的字典,但是没有时间''b''消失。 – AChampion

+0

这应该被关闭/删除:当我调试我的情况时,我有严重的困惑,而且这太急了。道歉并感谢所有看着它的人​​! –

回答

2

我不确定你的代码的行为是什么,但对我来说它会抛出一个错误。我们可以用一个小例子得到同样的错误:

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

+0

对不起,赶快编辑吧。 – Denziloe