<h2>python中使用<a href="http://docs.python.org/library/functools.html#functools.partial" rel="nofollow">functools.partial</a>的闭包</h2>
<pre><code>from functools import partial
i = 0
f0 = partial(callback, i)
i = 1
f1 = partial(callback, i)
f0()
# 0
f1()
# 1
</code></pre>
<p>{cdda>在这个时刻,就像是一个<cdda>的值。当它被调用时不评估它。在</p>
<h3>仅包装部分参数</h3>
<p>Yes partial将允许您包装任意数量的参数,剩余的arg和kwarg可以传递给结果partial对象,这样它的行为就像调用原始包装函数一样。。。在</p>
^{2}$
<p>实际上,您已经将<code>callback(val1, val2)</code>包装成<code>callback(val2)</code>,其中<code>val1</code>已经作为闭包包含。在</p>
<h3>使用lambda</h3>
<p>如果您真的想知道如何使用lambda闭包来实现这个目的,那么您可以看到为什么它变得难看并且更倾向于使用部分闭包。。。在</p>
<pre><code>f0 = (lambda val1: lambda val2: callback(val1, val2))(i)
</code></pre>
<p>必须将scope变量包装到外部函数作用域中,然后在内部lambda函数中引用该范围。大笑。在</p>
<h3>异常的回溯:部分函数与lambda函数与嵌套函数</h3>
<p>内因与外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因。请记住,我指的是函数闭包。functools.partial修复了当包装函数引发异常时将得到的回溯。。。在</p>
<p>考虑一下这个版本,它将除法提高到零:</p>
<pre><code>def callback(val1, val2):
return val1 / val2
</code></pre>
<p><em>正常外部/内部关闭</em></p>
<pre><code>def wrapper(fn, val1):
def wrapped(val2):
return fn(val1, val2)
return wrapped
f0 = wrapper(callback, i)
f0(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in wrapped
File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero
</code></pre>
<p><em>lambda闭包</em></p>
<pre><code>f0 = (lambda val1: lambda val2: callback(val1, val2))(i)
f0(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero
</code></pre>
<p>现在是functools.partial</em></p>
<pre><code>f0 = partial(callback, i)
f0(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero
</code></pre>