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、常规函数或类的情况下实现组合。
第一个直觉是将调用lambda acc, f: f(acc)
中的定义替换为,但不幸的是,这会以相反的顺序获取参数:functools.reduce
operator.call
>>> (lambda acc, f: f(acc))(1, str) # What we want to replace.
>>> '1'
>>> import operator
>>> operator.call(str, 1) # Incorrect argument order.
>>> '1'
我有一种预感,使用functools.reduce
仍然是完成组合的方法,但在我的一生中,我无法找到摆脱用户定义的 lambda 的方法。
一些开箱即用的方法让我接近:
import functools, operator
# Curried form, can't figure out how to uncurry.
functools.partial(operator.methodcaller, '__call__')(1)(str)
# The arguments needs to be in the middle of the expression, which does not work.
operator.call(*reversed(operator.attrgetter('args')(functools.partial(functools.partial, operator.call)(1, str))))
已查看所有现有问题,但它们完全不同,并且依赖于使用用户定义的函数和/或 lambda。