<div dir="ltr"><div class="gmail_quote">On Wed, Jan 26, 2011 at 12:18 PM, cool-RR <span dir="ltr">&lt;<a href="mailto:cool-rr@cool-rr.com">cool-rr@cool-rr.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div dir="ltr"><div class="gmail_quote"><div class="im">On Fri, Jul 9, 2010 at 1:49 AM, Shai Berger <span dir="ltr">&lt;<a href="mailto:shai@platonix.com" target="_blank">shai@platonix.com</a>&gt;</span> wrote:</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

[...]<div class="im"><br>
<br>
However, if that were the whole story, this code would raise a NameError:<br>
<br>
&gt;&gt;&gt; def f():<br>
...     i=5<br>
...     def g(): return i<br>
...     del i<br>
...     return g<br>
...<br>
&gt;&gt;&gt; f()()<br>
<br>
In fact, the deletion of i in f is a syntax error, complaining about deletion<br>
of a variable. This is done because &quot;If a name binding operation occurs<br>
anywhere within a code block, all uses of the name within the block are<br>
treated as references to the current block&quot;<br>
(<a href="http://docs.python.org/reference/executionmodel.html" target="_blank">http://docs.python.org/reference/executionmodel.html</a>) -- that is, while the<br>
exact object bound to the name is looked up as late as possible, the scope of<br>
the name is set already at function definition (compilation) time.<br>
<br>
Thus, the nested function will only look for the current binding of i in the<br>
local namespace of its containing function; IMHO, this qualifies as a true<br>
variable (though, true, it is not a constant place in memory).<br>
<br>
I hope this is still interesting to people here,<br>
<div><div></div><div><br>
        Shai.</div></div></div></blockquote><div><br></div><div>Hey folks,</div><div><br></div><div>The above syntax error that Shai pointed out really made an impression on me :)</div><div><br></div><div>So it was funny when I saw a couple of days ago that <a href="http://docs.python.org/dev/whatsnew/3.2.html" target="_blank">Python 3.2 removes this syntax error</a>:</div>

<div><br></div><div> </div><p style="margin-top:0px !important;text-align:justify;line-height:20px;font-family:sans-serif;font-size:16px">Previously it was illegal to delete a name from the local namespace if it occurs as a free variable in a nested block:</p>

<div style="font-family:sans-serif;line-height:20px;font-size:16px"><div style="background-color:rgb(238, 255, 204);background-repeat:initial initial">
<pre style="overflow-x:auto;overflow-y:hidden;padding-top:5px;padding-right:5px;padding-bottom:5px;padding-left:5px;background-color:rgb(238, 255, 204);color:rgb(51, 51, 51);line-height:16px;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:rgb(170, 204, 153);border-bottom-color:rgb(170, 204, 153);border-left-style:none;border-left-width:initial;border-left-color:initial;border-right-style:none;border-right-width:initial;border-right-color:initial">
<span style="color:rgb(0, 112, 32);font-weight:bold">def</span> <span style="color:rgb(6, 40, 126)">outer</span><span>(</span><span>x</span><span>):</span>
    <span style="color:rgb(0, 112, 32);font-weight:bold">def</span> <span style="color:rgb(6, 40, 126)">inner</span><span>():</span>
       <span style="color:rgb(0, 112, 32);font-weight:bold">return</span> <span>x</span>
    <span>inner</span><span>()</span>
    <span style="color:rgb(0, 112, 32);font-weight:bold">del</span> <span>x</span>
</pre></div></div><p style="text-align:justify;line-height:20px;font-family:sans-serif;font-size:16px">This is now allowed. Remember that the target of an <a href="http://docs.python.org/dev/reference/compound_stmts.html#except" style="color:rgb(53, 95, 124);text-decoration:none" target="_blank"><tt style="background-color:transparent;padding-top:0px;padding-right:1px;padding-bottom:0px;padding-left:1px;font-size:0.95em;font-weight:bold"><span>except</span></tt></a> clause is cleared, so this code which used to work with Python 2.6, raised a <a href="http://docs.python.org/dev/library/exceptions.html#SyntaxError" title="SyntaxError" style="color:rgb(53, 95, 124);text-decoration:none" target="_blank"><tt style="background-color:transparent;padding-top:0px;padding-right:1px;padding-bottom:0px;padding-left:1px;font-size:0.95em;font-weight:bold"><span>SyntaxError</span></tt></a> with Python 3.1 and now works again:</p>

<div style="font-family:sans-serif;line-height:20px;font-size:16px"><div style="background-color:rgb(238, 255, 204);background-repeat:initial initial">
<pre style="overflow-x:auto;overflow-y:hidden;padding-top:5px;padding-right:5px;padding-bottom:5px;padding-left:5px;background-color:rgb(238, 255, 204);color:rgb(51, 51, 51);line-height:16px;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:rgb(170, 204, 153);border-bottom-color:rgb(170, 204, 153);border-left-style:none;border-left-width:initial;border-left-color:initial;border-right-style:none;border-right-width:initial;border-right-color:initial">
<span style="color:rgb(0, 112, 32);font-weight:bold">def</span> <span style="color:rgb(6, 40, 126)">f</span><span>():</span>
    <span style="color:rgb(0, 112, 32);font-weight:bold">def</span> <span style="color:rgb(6, 40, 126)">print_error</span><span>():</span>
       <span style="color:rgb(0, 112, 32)">print</span><span>(</span><span>e</span><span>)</span>
    <span style="color:rgb(0, 112, 32);font-weight:bold">try</span><span>:</span>
       <span>something</span>
    <span style="color:rgb(0, 112, 32);font-weight:bold">except</span> <span style="color:rgb(0, 112, 32)">Exception</span> <span style="color:rgb(0, 112, 32);font-weight:bold">as</span> <span>e</span><span>:</span>
       <span>print_error</span><span>()</span>
       <span style="color:rgb(64, 128, 144);font-style:italic"># implicit &quot;del e&quot; here</span>
</pre></div></div><p style="text-align:justify;line-height:20px;font-family:sans-serif;font-size:16px">(See <a href="http://bugs.python.org/issue4617" style="color:rgb(53, 95, 124);text-decoration:none" target="_blank">issue 4617</a>.)</p>

<p style="text-align:justify;line-height:20px;font-family:sans-serif;font-size:16px"><br></p>Ram.</div>
</div>
</blockquote></div><br>Also, I&#39;m now reading the rest of the <a href="http://docs.python.org/dev/whatsnew/3.2.html">What&#39;s new in Python 3.2</a> page and it has many gems that I might want to backport and use in my projects. Recommended reading.<br>

<div><br></div><div><br></div><div>Ram.</div></div>