<p>首先:lambda是从函数返回的,以防止以后使用<code>i</code>和<code>j</code>的修改值。</p>
<p>与以下内容进行比较:</p>
<pre><code>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))
</code></pre>
<p>这将无法按预期工作,因为所有lambda将共享同一命名空间,并在循环结束后使用<code>i</code>和<code>j</code>的值。如果使用单独的函数调用,则每次都会引入一个新的闭包,该闭包在调用函数的时间点捕获<code>i</code>和<code>j</code>的值。</p>
<p>我们可以通过将当前值<code>i</code>和<code>j</code>保存为lambda的默认参数来实现相同的目的。为了获得更好的度量,我们还使用<code>itertools.product</code>来避免嵌套循环:</p>
<pre><code>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))
</code></pre>
<blockquote>
<p>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)</p>
</blockquote>
<p>不是真的。它只调用作为参数给定的<code>check(i, j)</code>方法。这里使用它动态地向<code>Tests</code>类添加方法。</p>
<blockquote>
<p>Is self a meaningful keyword or would lambda spam would work just as well?</p>
</blockquote>
<p><code>spam</code>也同样有效。他们在这里选择<code>self</code>是由于约定,因为lambda表示一个方法。</p>
<blockquote>
<p>What point is that lambda evaluated?</p>
</blockquote>
<p>只要对<code>Tests</code>的实例调用<code>test_[i]_[j]()</code>。</p>
<blockquote>
<p>How come the .check() is perfectly fine outside the classes scope?</p>
</blockquote>
<p>因为它在lambda中,稍后只会使用<code>Tests</code>的实例作为<code>self</code>参数调用它。</p>