1

我是编程新手,希望有人可以帮助澄清一些概念以帮助我学习。

我想我理解 ** , ** 将 kwarg 转换为关键字,然后传递给函数。

我不太确定为什么我需要使用 ** 两次。具体来说,当它已经在函数定义中时,为什么我需要显式地传入 **param (而只是 param),我将传入一个 kwarg

class Main(webapp2.RequestHandler):
    def render(self, template, **kwarg):
        blah

class Test(Main):
    params = dict(a=1, b=2)
    self.render(template, params) #this doesn't work

    self.render(template, **params) 
    #this work, but I don't understand why do I need the ** again
    #when its already in the original render function?
4

3 回答 3

3

诀窍在于,尽管符号 ( **) 相同,但运算符不同:

def print_kwargs(**all_args):
    # Here ** marks all_args as the name to assign any remaining keyword args to
    print all_args

an_argument = {"test": 1}

# Here ** tells Python to unpack the dictionary
print_kwargs(**an_argument)

如果我们没有在调用中显式解包我们的参数,print_kwargs那么 Python 将抛出一个TypeError,因为我们提供了一个print_kwargs不接受的位置参数。

为什么 Python 不自动将字典解压成kwargs? 主要是因为“显式优于隐式” - 虽然您可以对 -only 函数进行自动解包**kwarg,但如果该函数有任何显式参数(或关键字参数),Python 将无法自动解包字典。

于 2013-07-12T14:08:27.467 回答
2

假设您有这样的方法...

>>> def fuct(a, b, c):
...   print a
...   print b
...   print c

并且您已将带有所需参数的字典发送到方法

d = {'a': 1, 'b': 2, 'c': 3}

所以通过使用**(双星号)你可以解压字典并发送到函数

>>> fuct(**d)
1
2
3
>>>
于 2013-07-12T14:07:13.640 回答
0

因为*args被非关键字参数使用。一个*将列表或元组解包为元素,两个*将 dict 解包为关键字。

于 2013-07-12T14:08:56.650 回答