Python方法采用一个位置参数,但给出了两个

Bha*_*gav 3 python dictionary function keyword-argument

我遇到了一个我不太明白的错误.如果我有以下代码段:

class Test(object):
  def __init__(self):
    self.data = {}

  def update_data(self, **update):
    self.data = update

t = Test()

t.update_data(test='data') #  Works
t.update_data({'test':'data'}) #  TypeError: update_data() takes 1 positional argument but 2 were given
Run Code Online (Sandbox Code Playgroud)

所以根据我的理解,**update语法是字典破坏语法,当你将dict传递给函数时,它会被转换为关键字参数.

我在这里不正确地理解了什么?

MSe*_*ert 8

如果您只是传入字典,它将被视为任何其他变量.在你的情况下,你作为位置参数传递它,因此它将被视为位置参数.但是,该方法不接受任何位置参数(除了self那是另一个故事),因此它会抛出错误.

如果要将字典内容作为关键字参数传递,则需要将其解压缩(**在字典前面):

t.update_data(**{'test':'data'})
Run Code Online (Sandbox Code Playgroud)

如果你想将字典作为字典传入,你也可以将其作为关键字参数传递(不进行解包!):

t.update_data(funkw={'test':'data'})
Run Code Online (Sandbox Code Playgroud)