如果有一个compose
功能的话- 也许在里面会很可爱functools
。没有,我也不指望会有,唉。用Raymond Hettinger的话来说,
先前已在其他论坛中进行了讨论和拒绝。问题之一是通常的数学顺序是不直观的,并且不能自我证明-即compose(f,g)
与f(g(x))
或g(f(x))
?相同。此外,它已经是污垢容易创建自己构建功能,或者直接做组成: h = lambda x: f(g(x))
。
这里有两个简单的实现方式的compose
一个可调用的类,可能对你有用,但:
# Scott Daniels, http://code.activestate.com/recipes/52902-function-composition/
# Lightly edited for style.
class Compose(object):
'''Compose functions. compose(f,g,x...)(y...) = f(g(y...),x...))'''
def __init__(self, f, g, *args, **kwargs):
self.f = f
self.g = g
self.pending = args[:]
self.kwargs = kwargs.copy()
def __call__(self, *args, **kwargs):
return self.f(self.g(*args, **kwargs), *self.pending, **self.kwargs)
class Starcompose:
'''Compose functions. Starcompose(f,g,x...)(y...) = f(*g(y...),x...))'''
TupleType = type(())
def __init__(self, f, g, *args, **kwargs):
self.f = f
self.g = g
self.pending = args[:]
self.kwargs = kwargs.copy()
def __call__(self, *args, **kwargs):
mid = self.g(*args, **kwargs)
if isinstance(mid, self.TupleType):
return self.f(*(mid + self.pending), **self.kwargs)
return self.f(mid, *self.pending, **self.kwargs)
另外,请参阅该functional
软件包,它启发compose_many
了我的这个非常简单的功能:
def compose(f1, f2):
def composition(*args, **kwargs):
return f1(f2(*args, **kwargs))
return composition
def compose_many(*funcs):
return reduce(compose, funcs)