繁体   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