使用** kwargs时关键字参数的多个值

时间:2018-02-11 12:30:34

标签: python kwargs

函数_mget_search定义将为,

_mget_search(**search_kwargs)

使用关键字参数调用此函数。

{'count': False, 'min_score': 20, 'end': 49, 'with_scores': False, 'start': 0, 'query': u'ouuuuu', 'max_score': inf, 'record_term': True}

函数参数search_kwargs包含as,

_mget_search() got multiple values for keyword argument 'query'

我收到此错误 -

{{1}}

我无法理解为什么会发生以及如何纠正它。

4 个答案:

答案 0 :(得分:1)

这是因为你正在解包你试图传递的参数。尝试使用:

_mget_search(search_kwargs)

修改

让我们更深入地研究这个问题。我们将定义两个函数,并查看它们在传递各种参数时的行为。

In [1]: def fun1(a, b, c):
   ...:     print('Passed arguments: a={} b={} c={}'.format(a, b, c))
   ...:     

In [2]: def fun2(*args):
   ...:     print('Passed args: {}'.format(args))
   ...: 

In [3]: fun1(1, 2, 3)
Passed arguments: a=1 b=2 c=3

In [4]: fun2(1, 2, 3)
Passed args: (1, 2, 3)

In [5]: fun2([1, 2, 3])
Passed args: ([1, 2, 3],)

In [6]: fun2(*[1, 2, 3])
Passed args: (1, 2, 3)

In [7]: fun1(*[1, 2, 3])
Passed arguments: a=1 b=2 c=3

在第3次调用中,我们分别传递了3个参数,这与我们使用第7次调用时相同,其中调用了解压缩列表。将其与调用fun2时的情况进行比较。

答案 1 :(得分:1)

** kwargs允许您将keyworded变量长度的参数传递给函数。如果要在函数中处理命名参数,则应使用** kwargs。这是一个让你开始使用它的例子:

def greet_me(**kwargs):
    if kwargs is not None:
        for key, value in kwargs.iteritems():
            print "%s == %s" %(key,value)

>>> greet_me(name="yasoob")
name == yasoob

答案 2 :(得分:1)

我敢打赌除了search_kwargs之外,某处某处将参数传递给该函数。如果它是回调函数的一部分,则回调函数很可能会使用某些参数调用它,并且这些参数将被分配给第一个参数query

我能看到你收到错误的唯一方法就是你用一个参数 kwargs来调用你的函数,如下所示:

假设:

def _mget_search(query, with_scores=False, count=False, record_term=True,
**kwargs): 

然后获取该错误消息的方法是:

>>> search_kwargs= {'query': u'ouuuuu', 'count': False, 'min_score': 20, 'end': 49, 'with_scores': False, 'start': 0, 'max_score': inf, 'record_term': True}
>>> _mget_search(some_random_parameter, **search_kwargs)

这是我过去尝试重新创建的错误。

def func(a, b=2, **kwargs):
    return '{}{}{}'.format(a, b, kwargs)

只有最后一个成功获得该错误。

>>> func(**{'a':2, 'b': 3, 'other': 3})
"23{'other': 3}"
>>> func(7, **{'stuff': 5})
"72{'stuff': 5}"
>>> func(2, **{'b': 7})
'27{}'
>>> func(**{'b': 3, 'other': 3, 'a': 5})
"53{'other': 3}"
>>> func(2, **{'a': 5})
TypeError: func() got multiple values for argument 'a'

答案 3 :(得分:1)

我认为问题是因为query被定义为位置arg,所以当你传递**的字典被解包时,第一个条目(不管它的名字)是用来查询,然后查询也出现在字典中,因此query的多个值。

通过将查询命名为arg:

来尝试修复
def _mget_search(query='', with_scores=False, count=False, record_term=True, **kwargs):

或者,在传递时不要在字典中包含查询。