0

私は、すべて同じ署名を持つ再利用可能な関数を多数持っています (それらは a を取り、 arecordを返します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)    
4

2 に答える 2

2

ライブラリで利用できると仮定するとcompose、この例ではそのスタイルを好むでしょう。

主な理由は、値を非負の値にクランプし、ある関数の結果を別の関数に渡すという懸念を分離することです。non_negative「変更」スタイルでは、関数の結果ではなく値で実行したい場合は、 non_negative(lambda x: x)(value). そして、構成する可能性のあるすべての関数に対して個別の関数を作成する必要があります。そのすべての関数には、その関数のコードと混合された構成ロジックが含まれています。

この例では、どちらの方法でも負担はわずかです。しかし、一般的に、独立した小さなピースを簡単に作成でき、それを接着して複合コードを作成できるのであれば、それが良い方法です。

于 2012-01-26T02:23:32.543 に答える
1

あなたの 2 つの例は、1 つのケースではポイントフリー スタイルを使用し、もう 1 つのケースでは使用しないことを除いて、まったく同じものになります。

唯一の考慮事項は、あなた (およびあなたのコードを読む人) が最も読みやすいと思うものです。場合によっては、ポイント フリー スタイルが最も自然だと思います。これはそれらのケースの 1 つです。

于 2012-01-25T16:52:12.993 に答える