python - TypeError : function(self, item, **kwargs) 正好需要 2 个参数(给定 3 个)

标签 python flask keyword-argument

我有一个函数,它将数据放入数据库,称为 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;这与问题有关吗?

最佳答案

您为函数提供了三个参数:

  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

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

>>> 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/

相关文章:

python - 将具有多个自变量和多个参数的函数传递给 scipy optimize minimize

python - 在 Python 中更改函数的关键字默认值

python - 读取库方法定义

python - 如何在 Kivy 中一次启动多个动画?

Python Regex Split 以一种奇怪的方式进行交互

python - 将字典的字符串表示形式转换为真正的字典

python-3.x - 如何在笔记本电脑的浏览器中显示正在服务器本地主机中运行的Webapp

python - Pandas Dataframe 到 HTML 删除索引

jquery - Flask:在 jQuery ajax $.post 调用后渲染页面

python 3 : Best practice way to validate/parse **kwargs?