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

5

我正在尝试使用Google应用程序引擎搜索库的新Python代码,但我遇到了一种奇怪的语法。它是这样的:

cls_createDocument(**params)

params是一个字典类型的参数。

所指的函数为:

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

我的问题是,params表示什么意思,对对象有什么影响?

谢谢! Jon

2个回答

12

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

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)

最后,这里是文档链接


非常感谢,特别是提供文档链接。我有一些Python的经验,但大部分时间都在使用Java编程。你有什么书推荐吗? - Jon
文档和教程(http://docs.python.org/tutorial/)非常好。我实际上从来没有读过任何书……Python对于基本的东西来说读起来相当不错。更复杂的东西我是边学边摸索的。 - mgilson

3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,