TypeError: function (self, item, ** kwargs) принимает ровно 2 аргумента (3 данных)

У меня есть функция, которая помещает данные в базу данных, называемую 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) 

Fur debugging Я печатаю это заявление непосредственно перед тем, как вызвать функцию 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'} 

    Поэтому, если вы хотите передать содержимое словаря в **optional аргумент **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 }) 

    Если вы хотите передать аргументы ключевого слова, вам нужно указать имя аргумента во время вызова функции.

    Эта ссылка содержит больше информации о ключевых словах 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) 

    Надеюсь это поможет!

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