Python 参数绑定器

新手上路,请多包涵

如何将参数绑定到 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 的参数,使用此处描述的技术之一。参见例如 如何在 Tkinter 中将参数传递给 Button 命令?在 Python 中使用字典作为 switch 语句

但是,某些 API 允许您单独传递要绑定的参数,并会为您进行绑定。值得注意的是,标准库中的线程 API 以这种方式工作。 在调用 Thread.start 之前查看线程开始运行。如果您尝试像这样设置自己的 API,请参阅 如何编写简单的回调函数? .

显式绑定参数也是一种避免在使用闭包时因延迟绑定引起的问题的方法。这就是问题所在,例如, lambda 循环或列表推导中的 for 循环或列表理解会产生计算相同结果的单独函数。请参阅 lambda 函数闭包捕获什么?在循环(或理解)中创建函数(或 lambda)

原文由 Dustin Getz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 570
2 个回答

functools.partial 返回一个可调用的包装函数,其中一些或所有参数被冻结。

 import sys
import functools

print_hello = functools.partial(sys.stdout.write, "Hello world\n")

print_hello()

 Hello world

以上用法等同于以下 lambda

 print_hello = lambda *a, **kw: sys.stdout.write("Hello world\n", *a, **kw)

原文由 Jeremy 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 functools.partial

 >>> from functools import partial
>>> def f(a, b):
...     return a+b
...
>>> p = partial(f, 1, 2)
>>> p()
3
>>> p2 = partial(f, 1)
>>> p2(7)
8

原文由 Matthew Trevor 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏