簡體   English   中英

將帶有布爾值的字典傳遞給使用雙星號的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM