関数構成対別の関数に作用する関数
-
14-11-2019 - |
質問
私はすべて同じ署名を持つすべての再利用可能な機能を持っています(それらはrecord
を取り、float
を返します)。私はしばしば関数を新しい関数に組み合わせる必要があります。
record
を取り、f
を適用する関数を作成したいとしましょう。結果が負にそれをゼロに変換します。私には2つの方法があります。構成と機能の変更各アプローチの長所と短所は何ですか?
組成:
def non_negative(value):
return max(0, value)
g = compose(non_negative, f)
# from functional module by Collin Winter
def compose(func_1, func_2, unpack=False):
"""
compose(func_1, func_2, unpack=False) -> function
The function returned by compose is a composition of func_1 and func_2.
That is, compose(func_1, func_2)(5) == func_1(func_2(5))
"""
if not callable(func_1):
raise TypeError("First argument to compose must be callable")
if not callable(func_2):
raise TypeError("Second argument to compose must be callable")
if unpack:
def composition(*args, **kwargs):
return func_1(*func_2(*args, **kwargs))
else:
def composition(*args, **kwargs):
return func_1(func_2(*args, **kwargs))
return composition
.
修飾:
def non_negative(func):
def new_func(record):
return max(0, func(record))
return new_func
g = non_negative(f)
. 解決
compose
をライブラリで利用できると仮定して、この例ではそのスタイルを好みます。
主な理由は、値を負の値にクランプするという懸念を分離し、ある関数の結果を別の関数に供給するということです。「修正」スタイルで、関数の結果ではなく値にnon_negative
を実行したいと思ったことがある場合は、non_negative(lambda x: x)(value)
のような歪みを終えます。そして、あなたが作成したいと思うすべてのものに対して別の機能を書く必要があります。そのうちの1つの1つは、その関数のコードに組み合わされたコンポジションロジックを含みます。
この例では、負担はあなたがそれをする方法のどちらかの些細なことです。しかし、一般的に、あなたがあなたの複合コードを作るためにあなたが一緒に接着する小さな独立した部分を作るのは簡単であるならば、それはそれをする良い方法です。
他のヒント
あなたの2つの例は、1つのケースでは、あなたがポイントフリースタイルを使用し、もう一方の場合を使用しています。
唯一の考慮事項は、あなた(そしてあなたのコードを読む人)が最も読みやすいものを見つけるのです。場合によっては、ポイントフリースタイルが最も自然なものを見つけます。これはそれらの場合の1つです。