lambda
在尝试使用 a或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
只是放弃它(我不确定是哪个)。
对于我的应用程序,由于许多函数将存储在这样的特定对象中,并且用户选择了不同数量的可选参数,重要的是我返回的带有绑定参数的函数仍然接受用户的参数作为第一个位置参数,而不是强制所有参数都是关键字参数。
这似乎应该很简单。我错过了什么?