gpt4 book ai didi

python - lambda self : do 是什么意思

转载 作者:太空狗 更新时间:2023-10-29 22:16:38 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com