如何将参数绑定到Python函数,以便以后可以在没有参数的情况下调用它(或使用较少的附加参数)?
例如:
def add(x, y):
return x + y
add_5 = magic_function(add, 5)
assert add_5(3) == 8
我这里需要什么?
在框架和库中经常会发生这样的情况:当人们试图给回调函数提供参数时,会意外地立即调用函数:例如on_event(action(foo))
。解决方案是使用此处描述的技术之一将foo
作为参数绑定到action
上。参见例如How to pass arguments to a Button command in Tkinter?和Using a dictionary as a switch statement in Python。
然而,有些API允许您单独传递待绑定参数,并将为您进行绑定。值得注意的是,标准库中的线程API是这样工作的。参见thread starts running before calling Thread.start。
显式绑定参数也是避免使用闭包时后期绑定导致的问题的一种方法。这就是问题所在,例如,for
循环或列表理解中的lambda
会产生计算相同结果的单独函数。参见What do lambda function closures capture?和Creating functions (or lambdas) in a loop (or comprehension)。
7条答案
按热度按时间x33g5p2x1#
functools.partial
返回一个可调用的 Package 函数,其中冻结了部分或全部参数。上述用法相当于以下
lambda
。lymgl2op2#
使用
functools.partial
:dzhpxtsq3#
如果
functools.partial
不可用,则可以轻松模拟:或
vjrehmav4#
lambda
s允许您使用较少的参数创建一个新的未命名函数并调用该函数:您也可以使用
functools.partial
。如果您计划在函数调用中使用命名参数绑定,这也适用:请注意,如果从左侧绑定参数,则需要按名称调用参数。如果从右边绑定,它会按预期工作。
j2qf4p5b5#
这也会起作用:
mhd8tkvw6#
在Python中可以这样定义函数。它们是可调用的对象。“绑定”只是设置参数值。
你可以这样做
j2cgzkjk7#
这个问题通常是关于绑定参数的,但所有的答案都是关于函数的。如果您想知道,
partial
也可以使用类构造函数(即使用类而不是函数作为第一个参数),这对工厂类很有用。您可以按如下方式进行: