将部分结果附加到列表中

时间:2015-11-05 06:12:28

标签: python

我正在尝试建立一个词典列表。

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>]

为什么会这样?我错误地使用偏见吗?

2 个答案:

答案 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()

虽然这似乎是一种令人费解的方式来做它所做的事情。