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:
魔法,主要是:
- 此处使用的 lambda 是否执行与
functools.partial()
完全相反的操作(即创建一个带有一个未知的额外参数的包装函数) self
是一个有意义的关键字吗?lambda spam
是否同样有效?- lambda 计算的是什么点?
- 为什么
.check()
在class
es 范围之外就完全没问题了? - 如果没有 lambda,您如何做到这一点? - 如果我理解正确的话,you should be able to do without
lambda
(更不用说我同意 Guido 和 Alex 的观点,即它 很碍眼,我希望没有 :)
最佳答案
首先:lambda 是从函数返回的,以防止稍后使用修改后的 i
和 j
值。
与以下比较:
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 将共享相同的命名空间,并且将在循环结束后使用 i
和 j
的值。如果我们使用单独的函数调用,我们每次都会引入一个新的闭包,它会在调用函数的时间点捕获 i
和 j
的值。
我们可以通过将 i
和 j
的当前值保存为 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/