函数_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}}
我无法理解为什么会发生以及如何纠正它。
答案 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):
或者,在传递时不要在字典中包含查询。