(放棄:ないPythonの子供を、とても優しくしてください)開梱機能組成、タプルと
を、私は、以下のものを使用しての機能を構成しようとしています:
のための期待どおりに動作def compose(*functions):
return functools.reduce(lambda acc, f: lambda x: acc(f(x)), functions, lambda x: x)
スカラー関数。私はタプルを返す関数や、複数の引数を取る関数などを使って作業したいと思います。
def dummy(name):
return (name, len(name), name.upper())
def transform(name, size, upper):
return (upper, -size, name)
# What I want to achieve using composition,
# ie. f = compose(transform, dummy)
transform(*dummy('Australia'))
=> ('AUSTRALIA', -9, 'Australia')
dummy
はタプルを返し、transform
は3つの引数を取りますので、私は値を解凍する必要があります。
上記のcompose
機能を使用してこれを行うにはどうすればよいですか?私はこのようにしようとすると、私が手:
f = compose(transform, dummy)
f('Australia')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in <lambda>
File "<stdin>", line 2, in <lambda>
TypeError: transform() takes exactly 3 arguments (1 given)
必要なところ、それは解凍しますcompose
ように変更する方法はありますか?
あなたが例えば_it'll仕事に少し工夫するだけ任意function_を処理しません気にしませんか?どのようにあなたは機能構成を持っていますか?数学的な観点からは、関数の構成はちょうどそのものです:伝統的に_(g o f)(x):= g(f(x))_で表されるマップの構成。したがって、_g_の署名は、_f_のコード領域内の任意の要素でなければなりません。これはHaskellのような型付き言語ではっきりと分かります。 –
私が言ったことは、キーワードargsで動作しないこと、そして、各関数のシグネチャは、前の関数の戻り値と互換性がなければならないことです。私は実際にはかなり明白な何かを言っていたと思う;) –
もちろん、私は_positional_対_keywords_ argsでビットを欠場した。しかし、あなたの命題はスカラー関数では機能しません。 'compose(operator.abs、operator.neg)' _TypeError:abs()の後の*は、int_でなくシーケンスでなければなりません。どちらの場合でも動作する 'compose'関数を作る方法はありますか? (それは本当に私の元の質問の感覚だった)。 –