TypeError:function(self,item,**kwargs)正好取2个参数(给定3个)

Ekn*_*oes 3 python kwargs flask

我有一个函数,它将数据放入数据库,称为new_item():

def new_item(self, item, **optional):
Run Code Online (Sandbox Code Playgroud)

发送Web表单后,函数应检查用户输入,然后使用此函数将用户输入放入数据库(我使用Flask,函数名称为add_item()):

Market.new_item([request.form['title'], 
                 session.get('user_id'), 
                 request.form['category']], 
                {'desc': request.form['desc'], 
                 'place': request.form['place'], 
                 'price': request.form['price'], 
                 'ono': ono})
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

File X, line 99, in add_item
'ono': ono})
TypeError: new_item() takes exactly 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)

毛发调试我在调用函数之前打印此语句add_item.控制台输出是:

([u'iPhone 5', '791465667539154', u'2'], 
 {'price': u'99', 'place': u'Bossental', 'ono': True, 'desc': u'My brand new iPhone'})
Run Code Online (Sandbox Code Playgroud)

我真的不知道出了什么问题.我以前从未和之合作**kwargs过; 这与问题有关吗?

jon*_*rpe 16

您正在为函数提供三个参数:

  1. 隐含的self论点,Market;
  2. 列表,将是item; 和
  3. 字典,导致问题.

**optional是一个特殊的参数,它将所有尚未指定的关键字参数打包到字典中,可以在函数中访问optional(按照惯例,通常称为kwargs).

快速演示:

>>> def demo(x, y=None, **kwargs):
    print 'x: {0}'.format(x)
    print 'y: {0}'.format(y)
    print 'kwargs: {0}'.format(kwargs)


>>> demo('foo', y='bar', z='baz')
x: foo # 'x' positional argument
y: bar # 'y' keyword argument
kwargs: {'z': 'baz'} # unspecified keyword arguments
Run Code Online (Sandbox Code Playgroud)

您也可以将字典解压缩为关键字参数**:

>>> demo('foo', **{'y': 'bar', 'z': 'baz'})
x: foo
y: bar
kwargs: {'z': 'baz'}
Run Code Online (Sandbox Code Playgroud)

因此,如果要将字典的内容传递给**optional参数,可以使用相同的语法将字典解压缩为关键字参数:

Market.new_item([request.form['title'], 
                 session.get('user_id'), 
                 request.form['category']], 
                **{'desc': request.form['desc'],
              # ^ note asterisks
                   'place': request.form['place'],
                   'price': request.form['price'],
                   'ono': ono })
Run Code Online (Sandbox Code Playgroud)