TypeError:函数(self, item, **kwargs) 需要2个参数(给了3个)

3 投票
3 回答
12596 浏览
提问于 2025-04-18 09:55

我有一个函数,负责把数据放进数据库,叫做 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;这和问题有关吗?

3 个回答

2

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,如果你想要在用户输入的数字大于10时,程序就显示一个消息。这种情况下,我们就会用到“条件语句”。

条件语句就像是一个判断的开关,它会根据你设定的条件来决定接下来要做什么。简单来说,就是“如果……那么……否则……”这样的逻辑。

举个例子,假设你有一个程序,它会检查用户输入的数字。如果这个数字大于10,程序就会告诉用户“你输入的数字很大!”;如果小于或等于10,程序就会说“你输入的数字不大。”

这样,程序就能根据用户的输入做出不同的反应,这就是条件语句的基本用法。

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

如果你想传递关键字参数,那么在调用函数的时候,你需要指定参数的名字。

这个 链接 有更多关于关键字参数的信息。

也许你需要把你的代码修改成下面这样。这样就能正常工作了。

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)

希望这对你有帮助!

18

你给这个函数提供了三个参数:

  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'}

所以如果你想把字典里的内容传递给 **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 })

撰写回答