python - lambda self : do 是什么意思

标签 python lambda functional-programming

This answer解释了如何动态创建测试用例。

答案代码:

class Tests(unittest.TestCase):
    def check(self, i, j):
        self.assertNotEquals(0, i-j)

for i in xrange(1, 4):
    for j in xrange(2, 6):
        def ch(i, j):
            return lambda self: self.check(i, j)
        setattr(Tests, "test_%r_%r" % (i, j), ch(i, j))

我已经测试过并且它有效,但我无法弄清楚如何

我无法理解这里发挥的 lambda self: 魔法,主要是:

  1. 此处使用的 lambda 是否执行与 functools.partial() 完全相反的操作(即创建一个带有一个未知的额外参数的包装函数)
  2. self 是一个有意义的关键字吗?lambda spam 是否同样有效?
  3. lambda 计算的是什么点?
  4. 为什么 .check()classes 范围之外就完全没问题了?
  5. 如果没有 lambda,您如何做到这一点? - 如果我理解正确的话,you should be able to do without lambda (更不用说我同意 Guido 和 Alex 的观点,即它 很碍眼,我希望没有 :)

最佳答案

首先:lambda 是从函数返回的,以防止稍后使用修改后的 ij 值。

与以下比较:

for i in xrange(1, 4):
    for j in xrange(2, 6):
        setattr(Tests, "test_%r_%r" % (i, j), lambda self: self.check(i, j))

这不会按预期工作,因为所有 lambda 将共享相同的命名空间,并且将在循环结束后使用 ij 的值。如果我们使用单独的函数调用,我们每次都会引入一个新的闭包,它会在调用函数的时间点捕获 ij 的值。

我们可以通过将 ij 的当前值保存为 lambda 的默认参数来实现相同的目的。作为衡量标准,我们还可以使用 itertools.product 来避免嵌套循环:

from itertools import product
from operator import methodcaller

for i, j in product(range(1, 4), range(2, 6)):
  setattr(Tests, "test_%r_%r" % (i, j),
          lambda self, i=i, j=j: self.check(i, j))

Is the lambda used here to perform the exact opposite of functools.partial() (i.e. to create a wrapper function with one extra parameter that is not yet known)

不是真的。它只是对作为参数给出的任何内容调用 check(i, j) 方法。这用于向 Tests 类动态添加方法。

Is self a meaningful keyword or would lambda spam would work just as well?

spam 也可以。由于约定,他们在这里选择 self,因为 lambda 代表一个方法。

What point is that lambda evaluated?

一旦 test_[i]_[j]()Tests 实例上被调用。

How come the .check() is perfectly fine outside the classes scope?

因为它在 lambda 内部,稍后将仅使用 Tests 的实例作为 self 参数调用。

关于python - lambda self : do 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10346239/

相关文章:

python - 左对齐 Pandas 滚动对象

python - 每列不同的 na_rep

c# - 永远不要在生产代码中使用反射! python 呢?

scala - monad 的一些语言和用途

haskell - 在 Haskell 的无点函数中理解 `ap`

inheritance - F# 和继承建模

python - 如何折叠 Pandas 数据框? (数据透视表)

来自 Leanpub 的 Java 8 lambda 范围示例

.net - C# lambda 分配和收集

群组上的 Python map