Python方法定义中的"**params"语法是什么?

Jon*_*Jon 1 python syntax

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

cls_createDocument(**params)
Run Code Online (Sandbox Code Playgroud)

params是一本字典.

这涉及的功能是:

    @classmethod
  def _createDocument(
      cls, pid=None, category=None, name=None, description=None,
      category_name=None, price=None, **params)
Run Code Online (Sandbox Code Playgroud)

我的问题是,**params表示什么以及它对该对象有什么作用?

谢谢!乔恩

mgi*_*son 6

考虑具有默认参数的函数:

def func(foo=3):
    print(foo)
Run Code Online (Sandbox Code Playgroud)

参数的结构(原则上)非常类似于字典.函数foo(基本上)具有默认参数的字典(在本例中{'foo':3}).现在,假设你不想在函数调用中使用关键字,但是你想要使用字典 - 那么你可以调用foo:

d = {"foo":8}
func(**d)
Run Code Online (Sandbox Code Playgroud)

这允许您动态更改要传递给函数的参数func.

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

d = {"foo":8, "bar":12}
func(**d)
Run Code Online (Sandbox Code Playgroud)

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

你可以通过给那些额外的参数提供一个可以进入定义的地方来解决这个问题foo.

def func( foo=3, **kwargs ):
    print(foo,kwargs)
Run Code Online (Sandbox Code Playgroud)

现在,尝试:

d = {"foo":8, "bar":12}
func(**d)  #prints (8, {'bar':12})
Run Code Online (Sandbox Code Playgroud)

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

这也可以称为:

func(foo=8, bar=12)
Run Code Online (Sandbox Code Playgroud)

结果相同.

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

def funcA(newkey=None,**kwargs): 
    funcB(**kwargs)
Run Code Online (Sandbox Code Playgroud)

最后,这是文档链接