可能没有声明Lambda事件处理程序?

时间:2017-01-10 14:34:23

标签: python lambda

所以在阅读了lambda事件处理程序一段时间后,它真的让我很困惑。例如,我有这两行代码:

b1 = Button(root,text="Show",command=(lambda e=ents :fetch(e)))

root.bind("<Return>",(lambda event, e=ents : fetch(e)))

ents 是一个返回元组列表的函数。让我们说吧 [("a",x),("b",y)] x ytexbox从条目(def fetch(entries): for entry in entries: field = entry[0] text = entry[1].get() print ("%s: %s" %(field,text)) )获得,只是为了说明我的工作。 fetch 是一个打印出元组的简单函数

ents

对于第一行,lambda没有使用事件参数,我们直接给出了上下文(e),而我们在绑定期间使用了事件。那么为什么我们在一个案例中使用一个事件而在另一个案例中却没有?

另一个问题,为什么我们必须将列表分配给变量(在这种情况下为root.bind("<Return>",(lambda event,ents: fetch(ents))))并且不能直接使用它

<lambda>() missing 1 required positional argument: 'ents'

因为如果是这样,它会返回错误:{{1}}

1 个答案:

答案 0 :(得分:2)

调用按钮的command参数时没有参数。

使用一个参数(事件本身)调用事件绑定的处理程序。

两个lambda中的e=ents虽然在技术上是一个参数,但不要求或期望将任何实际参数传递给lambda;它只是一种捕获lambda中使用值的惯用方法。您可以像lambda: fetch(ents)一样轻松编写。两个细微差别:

  1. e=ents在定义lambda时捕获ents的值,忽略对值的任何后续更改。这可能与此有关,也可能没有关系。
  2. 让值一次查找,而不是每次调用lambda时效率稍高一些。这在这里完全无关紧要,但在lambda被调用数百万次的情况下可能是一个有用的优化。