在python toolz中使用curry合并

2024-05-16 20:59:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想能够咖喱merge_with

merge_with如我所料

>>> from cytoolz import curry, merge_with
>>> d1 = {"a" : 1, "b" : 2}
>>> d2 = {"a" : 2, "b" : 3}
>>> merge_with(sum, d1, d2)
{'a': 3, 'b': 5}

在一个简单的函数上,curry按我的预期工作:

>>> def f(a, b):
...     return a * b
... 
>>> curry(f)(2)(3)
6

但我无法“手动”制作merge_with的咖喱版本:

>>> curry(merge_with)(sum)(d1, d2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict' object is not callable
>>> curry(merge_with)(sum)(d1)(d2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict' object is not callable

预咖喱版本的作品:

>>> from cytoolz.curried import merge_with as cmerge
>>> cmerge(sum)(d1, d2)
{'a': 3, 'b': 5}

我的错在哪里?你知道吗


Tags: fromimport版本mostwithmergecalld2
1条回答
网友
1楼 · 发布于 2024-05-16 20:59:40

这是因为merge_withdicts作为位置参数:

merge_with(func, *dicts, **kwargs)

因此f是唯一的强制参数,对于空的*args,您将得到一个空字典:

>>> curry(merge_with)(sum)  # same as merge_with(sum)
{}

所以:

curry(f)(2)(3)

相当于

>>> {}(2)(3)
Traceback (most recent call last):
...
TypeError: 'dict' object is not callable

您必须显式地定义helper

def merge_with_(f):
    def _(*dicts, **kwargs):
        return merge_with(f, *dicts, **kwargs)
    return _

可以根据需要使用:

>>> merge_with_(sum)(d1, d2)
{'a': 3, 'b': 5}

或:

def merge_with_(f, d1, d2, *args, **kwargs):
    return merge_with(f, d1, d2, *args, **kwargs)

两者都可以

>>> curry(merge_with_)(sum)(d1, d2)
{'a': 3, 'b': 5}

以及:

>>> curry(merge_with_)(sum)(d1)(d2)
{'a': 3, 'b': 5}

相关问题 更多 >