6

lambdaまたはのいずれかを使用functools.partialして、既存の関数からバインドされた位置引数を持つ新しい関数を作成しようとすると、多くの混乱が生じます。

私はこのようなことをしたいです(これは望みどおりに動作していません):

def addFunction(self, name, in_function, secondary_args=None, secondary_kwargs=None):

        # Assign the function with optional args based on whether any
        # optional args are not None

        if secondary_args is not None and secondary_kwargs is not None:
            func = lambda x: in_function(x, *secondary_args, **secondary_kwargs)
        elif secondary_args is None and secondary_kwargs is not None:
            func = lambda x: in_function(x, **secondary_kwargs)
        elif secondary_args is not None and secondary_kwargs is None:
            func = lambda x: in_function(x, *secondary_args)
        else:
            func = in_function
        ###

        func.__doc__ = in_function.__doc__
        self[name] = func # <-- This method is a class method for something deriving dict.

lambdaまた、すべてのステートメントを同等のステートメントに置き換えてみましたfunctools.partial

問題は、この関数を次のように使用する場合です。

# Assume some_function takes 3 arguments, a float, a Bool, and a String,
# in that order.

someObject.addFunction("my_f", some_function, secondary_args=[True, "Option_A"])

(たとえば)使用しようとするsomeObject["my_f"](5.0)と、最初の引数がTrueデバッグ時のものであると報告されます。

lambda位置引数を使用するか、partial単にプッシュして、最後に追加の位置引数のみを受け入れるか、それ以外の場合はドロップするだけのバインディングのようです(どちらか*argsわかりません)。

私のアプリケーションでは、多くの関数がこのような特定のオブジェクトに格納され、ユーザーが選択したさまざまな数のオプション引数を使用して格納されるため、バインドされた引数を使用して返される関数がユーザーの引数を最初の引数として受け入れることが重要です。すべての引数を強制的にキーワード引数にすることに頼ることなく、位置引数。

これは十分に単純であるように思われます。私は何が欠けていますか?

4

2 に答える 2

0

カスタムタイプの関数ラッパーが必要なようです。

class Caller(object):

    def __init__(self, fn, *args, **kwargs):
        self._fn = fn
        self._args = args 
        self._kwargs = kwargs

    def __call__(self, *uargs, **ukwargs):
        arg = uargs + self._args
        kw =  dict(ukwargs.items() + self._kwargs.items())
        self._fn(*arg, **kw)

そして、何かをラップするには:

def test(a,b,c=None):
    print a,b,c

c = Caller(test, 2,c=True)
c(1)
# 1 2 True

Callerこれはクリーンアップできると確信していますが、これは元のfnとparamsを保存し、いつ呼び出されるかを制御する方法の簡単な例にすぎません。

于 2012-08-06T15:45:03.750 に答える