Python:如何使用lambda或partial来绑定除第一个位置参数之外的参数

ely*_*ely 6 python lambda arguments partial

我在尝试使用a lambdafunctools.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.
Run Code Online (Sandbox Code Playgroud)

我也尝试用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"])
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用(仅举例)时,someObject["my_f"](5.0)它报告第一个参数是True我调试它的时候.

这似乎是绑定的,要么lambda或者partial干脆推后的位置参数,要么只接受你的额外位置参数在年底*args或者仅仅是放弃它(我不知道它).

对于我的应用程序,由于许多函数将存储在这样的特定对象中,并且用户选择了不同数量的可选参数,因此我使用绑定参数返回的函数仍然接受用户的参数作为第一个位置参数,而不是强制所有参数都是关键字参数.

这看起来应该很简单.我错过了什么?

jdi*_*jdi 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)
Run Code Online (Sandbox Code Playgroud)

然后包裹一些东西:

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

c = Caller(test, 2,c=True)
c(1)
# 1 2 True
Run Code Online (Sandbox Code Playgroud)

我确信Caller可以清理它,但这只是一个快速示例,说明如何存储原始 fn 和参数,然后控制何时调用它。