2017-03-18 19 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