関数があれば素敵でしょうcompose
-おそらくfunctools
。残念ながら、存在しないし、存在するとは思わない。レイモンド・ヘッティンガーの言葉によれば、
これは以前に他のフォーラムで議論され、拒否されました。問題の1つは、通常の数学的順序が直感的ではなく、自己文書化されていないことです。つまり、またはcompose(f,g)
と同じですか?また、独自の合成関数を作成したり、直接合成を実行したりするのは、すでに簡単です 。f(g(x))
g(f(x))
h = lambda x: f(g(x))
呼び出し可能なクラスとしての2つの簡単な実装を次に示します。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)