You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数,直接就能替代你的自定义实现,通用性更强:

  1. 先安装toolz:
pip install toolz
  1. 直接调用使用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:05:27