我有一个函数,它将数据放入数据库,称为 new_item()
:
def new_item(self, item, **optional):
在发送一个网络表单后,一个函数应该检查用户输入,然后使用这个函数将用户输入放入数据库(我使用的是 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
;这与问题有关吗?
最佳答案
您为函数提供了三个参数:
- 隐式
self
参数,Market
; - 列表,将是
item
;和 - 导致问题的字典。
**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'}
因此,如果您想将字典的内容传递到 **可选
参数中,您可以使用相同的语法将字典解压缩到关键字参数中:
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 })
关于python - TypeError : function(self, item, **kwargs) 正好需要 2 个参数(给定 3 个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24240274/