0

让我们创建一个简单的元组、字典和函数。

>>> tup = (7, 3)
>>> dic = {"kw1":7, "kw2":3}
>>> def pr(a, b):
...    print a, b

下面显示了*在元组和字典作为参数之前所做的事情。

>>> pr(tup)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pr() takes exactly 2 arguments (1 given)

>>> pr(*tup)  
7 3   

>>> pr(*dic)
kw1 kw2

现在让我们**在争论之前尝试一下。

>>> pr(**tup)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pr() argument after ** must be a mapping, not tuple

好的,似乎 ** 仅在将字典用作参数时才有效。那么让我们用字典来试试吧。

>>> pr(**dic)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pr() got an unexpected keyword argument 'kw1'

什么?谁能给我看一个不会产生错误的最后一种情况的例子?

4

3 回答 3

3

要添加到其他答案,您可以使用*args**kwargs到您的函数定义来支持任意参数。这可能会使代码不那么明确。但出于调试目的、灵活性和开发速度,采用以下方法可能是有意义的:

(函数定义中的*/**符号类似于函数调用时参数解包操作的“逆”操作。)

def foo(*args, **kwargs): 
    for v in args: 
        print v
    for v in kwargs: 
        print v, "->", kwargs[v]

dic = {"kw1":7, "kw2":3}

foo(dic)
# prints:
# {'kw1': 7, 'kw2': 3}

foo(**dic)
# prints:
# kw1 -> 7
# kw2 -> 3

文档的一些相关链接:

于 2012-06-25T09:54:25.260 回答
2

**dict符号意味着您的字典被转换为关键字参数。如果该函数没有必要的关键字,那么它将返回一个错误,正如您所经历的那样。

在您的情况下,如果您将函数定义如下

>>> def pr(kw1, kw2):
...    print kw1, kw2
于 2012-06-25T09:43:47.103 回答
2

您的pr函数接受参数aand b,而不是kw1and kw2

>>> def pr(a, b):
...   print a, b
... 
>>> 
>>> d = {'a': 1, 'b':2}
>>> pr(**d)
1 2
于 2012-06-25T09:44:13.063 回答