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
わかりません)。
私のアプリケーションでは、多くの関数がこのような特定のオブジェクトに格納され、ユーザーが選択したさまざまな数のオプション引数を使用して格納されるため、バインドされた引数を使用して返される関数がユーザーの引数を最初の引数として受け入れることが重要です。すべての引数を強制的にキーワード引数にすることに頼ることなく、位置引数。
これは十分に単純であるように思われます。私は何が欠けていますか?