如何将参数绑定到Python函数,以便以后可以在没有参数的情况下调用它(或使用更少的附加参数)?
例如:
def add(x, y):
return x + y
add_5 = magic_function(add, 5)
assert add_5(3) == 8
这里需要的magic_function
是什么?
在框架和库中,当人们试图给回调函数给予参数时,经常会意外地立即调用函数:例如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。如果您试图设置自己的API,请参阅How can I write a simple callback function?。
显式绑定参数也是一种避免使用闭包时后期绑定引起的问题的方法。例如,for
循环或列表解析中的lambda
会产生计算相同结果的单独函数。参见What do lambda function closures capture?和Creating functions (or lambdas) in a loop (or comprehension)。
7条答案
按热度按时间m0rkklqb1#
functools.partial
返回一个可调用对象,该对象 Package 了一个函数,并冻结了部分或全部参数。上面的用法相当于下面的
lambda
。eagi6jfj2#
使用
functools.partial
:6qqygrtg3#
如果
functools.partial
不可用,则可以轻松模拟:或者
aurhwmvo4#
lambda
s允许您创建一个新的未命名函数,并使用更少的参数调用该函数:你也可以使用
functools.partial
。如果你打算在函数调用中使用命名参数绑定,这也是适用的:注意,如果你从左边绑定参数,你需要通过名字来调用参数。如果你从右边绑定,它会像预期的那样工作。
f87krz0w5#
这也会起作用:
af7jpaap6#
在Python中,函数可以这样定义,它们是可调用的对象,“绑定”只是设置参数值。
你可以做一些事情
rekjcdws7#
这个问题通常询问绑定参数,但所有的答案都是关于函数的。如果你想知道,
partial
也可以使用类构造函数(即使用类而不是函数作为第一个参数),这对工厂类很有用。你可以这样做: