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

时间:2014-06-16 09:17:43

标签: python flask kwargs

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

def new_item(self, item, **optional):

发送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})

但是我收到了这个错误:

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

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

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

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

3 个答案:

答案 0 :(得分:15)

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

  1. 隐式self参数Market;
  2. 列表,item;和
  3. 字典,导致问题。
  4. **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
    

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

    >>> demo('foo', **{'y': 'bar', 'z': 'baz'})
    x: foo
    y: bar
    kwargs: {'z': 'baz'}
    

    因此,如果要将字典的内容传递给**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 })
    

答案 1 :(得分:2)

Market.new_item(
    [request.form['title'], session.get('user_id'), request.form['category']], 
    optional={
        'desc': request.form['desc'],
        'place': request.form['place'],
        'price': request.form['price'],
        'ono': ono 
    }
)

答案 2 :(得分:2)

如果要传递关键字参数,则需要在调用函数时指定参数名称。

link有关于关键字args的更多信息

您可能需要将代码修改为以下内容。然后它会工作

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)

希望这有帮助!