如何仅使用Python标准库实现函数组合?
用Python标准库实现无自定义lambda/函数的函数组合?
Python标准库体量庞大,我直觉里肯定有办法实现函数组合,但始终没找到合适的方式——这纯粹是出于好奇和学习目的。
我有两个简单函数:
def increment(x): return x + 1 def double(x): return x * 2
我想把它们组合成一个新函数double_and_increment。当然可以简单实现:
double_and_increment = lambda x: increment(double(x))
但也可以用一种更复杂但可能更“符合人体工程学且可扩展”的方式实现:
import functools double_and_increment = functools.partial(functools.reduce, lambda acc, f: f(acc), [double, increment])
以上两种方式都能正常运行:
>>> double_and_increment(1) 3
现在的问题是:标准库中是否存在工具,可以完全不用自定义lambda、常规函数或类就能实现这种组合?
我最初想的是用operator.call替换functools.reduce调用里的lambda acc, f: f(acc),但遗憾的是它的参数顺序正好相反:
>>> (lambda acc, f: f(acc))(1, str) # 我们想要替换的逻辑 '1' >>> import operator >>> operator.call(str, 1) # 参数顺序错误 '1'
我觉得用functools.reduce还是实现组合的可行路径,但始终想不出怎么去掉那个自定义lambda。
下面是一些我尝试过的、接近目标但没成功的现成方法:
import functools, operator # 柯里化形式,不知道如何反柯里化 functools.partial(operator.methodcaller, '__call__')(1)(str) # 参数需要放在表达式中间,不可行 operator.call(*reversed(operator.attrgetter('args')(functools.partial(functools.partial, operator.call)(1, str))))
我查了所有相关问题,但它们都依赖自定义函数和/或lambda,和我的需求完全不符。
内容的提问来源于stack exchange,提问作者ruohola
相关产品推荐
相关产品推荐

