Python函数式编程:能否用标准库/第三方库替代自定义uncurry函数?
问题描述
我正在Python中进行函数式编程实验,经常需要对函数执行uncurry操作。我目前通过以下自定义代码解决该需求:
from typing import Callable, TypeVar T = TypeVar("T") R = TypeVar("R") def uncurry(function: Callable[[T], Callable[[T], R] | R]) -> Callable[[T], R]: def uncurry_step(*args: T) -> R: result = function for arg in args: result = result(arg) return result return uncurry_step
示例如下:
def addition(a: float) -> Callable[[float], float]: def inner(b: float) -> float: return a + b return inner assert addition(5)(5) == 10 assert uncurry(addition)(5, 5) == 10
请问是否可以使用Python标准库或toolz等第三方库提供的工具替代这个自定义的uncurry函数?注:此为学习用途,性能因素无关紧要。
解决方案
可以通过标准库或第三方库实现uncurry操作,以下是具体方案:
一、使用Python标准库
Python标准库中没有直接提供uncurry函数,但可以利用functools.reduce复刻你自定义函数的核心逻辑:
from functools import reduce from typing import Callable, TypeVar T = TypeVar("T") R = TypeVar("R") def uncurry_std(function: Callable[[T], Callable[[T], R] | R]) -> Callable[..., R]: def wrapper(*args: T) -> R: return reduce(lambda f, arg: f(arg), args, function) return wrapper # 测试验证 def addition(a: float) -> Callable[[float], float]: def inner(b: float) -> float: return a + b return inner assert uncurry_std(addition)(5,5) == 10
这个实现和你的自定义代码逻辑完全一致,只是用reduce替代了手动循环的写法。
二、使用第三方库toolz
toolz库内置了uncurry函数,直接就能替代你的自定义实现,通用性更强:
- 先安装toolz:
pip install toolz
- 直接调用使用:
from toolz import uncurry def addition(a: float) -> Callable[[float], float]: def inner(b: float) -> float: return a + b return inner assert uncurry(addition)(5,5) == 10
toolz的uncurry支持处理任意层数的柯里化函数,无需额外适配不同的函数结构。
内容的提问来源于stack exchange,提问作者Ezequiel Castaño
相关产品推荐
相关产品推荐

