<br><br><div class="gmail_quote">On Wed, Jun 1, 2011 at 1:21 PM, Steven D'Aprano <span dir="ltr"><<a href="mailto:steve@pearwood.info">steve@pearwood.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">


Currently, the rule is simple: any assignment tells the compiler to treat x as local. If you want nonlocal or global, you have to declare it as such. Nice and simple. What actual real-world problem are you trying to solve that you want to change this behaviour?</blockquote>

<div><br></div><div>The best counter-arguments I've heard so far are Nick's (it would be a pain to go into the guts and change this, and you also need to think about PyPy, Jython, IronPy, etc., etc.) and this one. </div>

<div><br></div><div>In terms of "real world problems" this solves, it makes the solution to the Paul Graham language challenge problem (build a function that returns an accumulator) one line shorter. Which is a bit silly, but so far as I can tell, nonlocal was created just to say we have an answer to the Paul Graham question. ;-)</div>

<div><br></div><div>I think the benefit of saving that one line is probably outweighed by the brittleness that this would create (ie. changing x +=  1 to x = x + 1 could break code), so I withdraw the proposal, at least for now.</div>

<div><br></div><div>One additional problem that I ran into is this:</div><div><br></div><div><div>>>> def f(): </div><div>...  nonlocal count</div><div>...  return count</div><div>... </div><div>SyntaxError: no binding for nonlocal 'count' found</div>

</div><div><br></div><div>Nonlocal fails at the compilation stage if the variable isn't found. On the other hand, attribute lookup is delayed until runtime, so if by accident you did</div><div><br></div><div>def f():</div>

<div><meta charset="utf-8">    count = 0</div><div>    def g():</div><div><meta charset="utf-8">        cont += 1 #oops typo.</div><div><meta charset="utf-8">        return cont</div><div><meta charset="utf-8">    return g</div>

<div><br></div><div>it's not clear when the function should fail: compile time or runtime.</div><div><br></div><div>-- Carl</div><meta charset="utf-8"><meta charset="utf-8"></div>