我正在尝试建立一个词典列表。
from functools import partial
def build_list():
lst = []
lst.append(join_function({
'terms': {'field_name': ['a', 'b']}
}))
return lst
def join_function(query):
return partial(special_join_fn, kind='Case')
def special_join_fn(query, kind):
return {
'must': [query, {'term': {'findings.kind': kind}}]
}
当我致电build_list()
时,我希望返回值为:
[
{'must': [
{'terms': {'field_name': ['a', 'b']}},
{'term': {'findings.kind': 'Case'}}
]}
]
但我回来的只是
[<functools.partial object at 0x7fa60be63260>]
为什么会这样?我错误地使用偏见吗?
答案 0 :(得分:0)
是的:functools.partial
会给你一个可调用的(你可以调用的函数),但是你没有调用它。
def build_list():
lst = []
lst.append(join_function({
'terms': {'field_name': ['a', 'b']}
})())
return lst
(这里的差异是调用()
后的额外join_function
,以便调用它返回的函数。
此外,您需要通过query
通过:
def join_function(query):
return partial(special_join_fn, query, kind='Case')
我使用pprint.pprint
:
if __name__ == '__main__':
import pprint
pprint.pprint(build_list())
$ python bard.py
[{'must': [{'terms': {'field_name': ['a', 'b']}},
{'term': {'findings.kind': 'Case'}}]}]
(我假设你主要只是在这里试验partial
,因为对于这个用例,它只是模糊了一些东西。)
答案 1 :(得分:0)
你错误地使用它们;我不知道你在示例代码中使用它们的原因。
部分应用的功能如下:
def add(a,b):
return a+b
add3 = partial(add, a=3)
print add3(b=4)
在我的示例中,add3
已部分应用 - 它已预设a=3
并等待仅使用b
值再次调用。
所以你的代码:
def build_list():
lst = []
# here you call join_function with one parameter. join_function returns a partially
# applied function, which you never call.
lst.append(join_function({
'terms': {'field_name': ['a', 'b']}
}))
return lst
# here, join_function takes a 'query' parameter, which you throw away
# and don't use, so what you sent in is lost.
def join_function(query):
return partial(special_join_fn, kind='Case')
# here, the query is missing so it can't be put in
def special_join_fn(query, kind):
return {
'must': [query, {'term': {'findings.kind': kind}}]
}
之后,返回build_list
您指定了kind
的函数,等待query
,因为您的query
参数无处可去。你永远不会调用你得到的功能,只需将它直接添加到列表中即可。
这是一个可以正常工作的返工版本:
from functools import partial
def build_list():
lst = []
f = join_function()
query = {
'terms': {'field_name': ['a', 'b']}
}
lst.append(f(query))
return lst
def join_function():
return partial(special_join_fn, kind='Case')
def special_join_fn(query, kind):
return {
'must': [query, {'term': {'findings.kind': kind}}]
}
print build_list()
虽然这似乎是一种令人费解的方式来做它所做的事情。