1

所以我正在为谷歌应用引擎搜索库尝试新的 python 代码,我遇到了一个奇怪的语法。这是:

cls_createDocument(**params)

其中 params 是一本字典。

这指的功能是:

    @classmethod
  def _createDocument(
      cls, pid=None, category=None, name=None, description=None,
      category_name=None, price=None, **params)

我的问题是,**params 表示什么,这对对象有什么作用?

谢谢!乔恩

4

2 回答 2

7

考虑一个带有默认参数的函数:

def func(foo=3):
    print(foo)

参数的结构(原则上)非常类似于字典。函数 foo (本质上)有一个默认参数的字典(在这种情况下{'foo':3})。现在,假设您不想在函数调用中使用关键字,但您想使用字典来代替 - 然后您可以调用foo

d = {"foo":8}
func(**d)

这使您可以动态更改传递给函数的参数func

如果您尝试以下操作,这会变得更有趣:

d = {"foo":8, "bar":12}
func(**d)

这不起作用(它等效于foo(foo=8, bar=12),但由于bar不是有效参数,因此失败)。

您可以通过将这些额外的参数放在foo.

def func( foo=3, **kwargs ):
    print(foo,kwargs)

现在,尝试:

d = {"foo":8, "bar":12}
func(**d)  #prints (8, {'bar':12})

所有额外的关键字参数都进入函数内部的 kwargs 字典。

这也可以称为:

func(foo=8, bar=12)

结果相同。

如果 funcA 调用 funcB 并且您希望 funcA 接受 funcB 的所有关键字(加上一些额外的关键字),这通常很有用,这在处理类和继承时很常见:

def funcA(newkey=None,**kwargs): 
    funcB(**kwargs)

最后,这是文档的链接

于 2012-08-01T03:09:07.097 回答
2

**params 参数表示作为字典传递给函数的所有关键字参数。

于 2012-08-01T03:09:25.433 回答