[Python-Dev] Explicit Lexical Scoping (pre-PEP?)

Nick Coghlan ncoghlan at gmail.com
Fri Jul 7 12:29:21 CEST 2006


skip at pobox.com wrote:
>     jan-python> So.. are we only thinking about implementing this outer
>     jan-python> scope assignment because there's lots of talk about it on
>     jan-python> the list, ...
> 
> :-)
> 
>     jan-python> ... or are there actually use cases that would become
>     jan-python> clearer if assigning to an outer scope variable was allowed?
> 
> I think full lexical scoping will only be of use to people who use nested
> scopes heavily.  The more typical user will be happy to just refer to values
> in outser scopes without modifying them and rely on classes to save changed
> state across calls.  I think it's almost a YAGNI, but I'm sure others will
> disagree.

I think it falls into the same category as Guido's ultimate acceptance of PEP 
308. There are assorted ways to live *without* conditional expressions, but 
each of the workarounds for its absence had issues. Switching to a statement 
worked properly, but meant you didn't have a single expression any more. Use 
the and-or trick kept the single expression characteristic, but was easy to 
get wrong. Hence, PEP 308: One Obvious Way to do it, assuming you want to do 
it in the first place.

I think writing to outer scopes is similar. You can box the variable, or make 
it an attribute of an object, but either approach requires you to refactor 
*all* uses of the variable, rather than just the one you currently care about. 
Hence, 'nonlocal': One Obvious Way to do it, assuming you want to do it in the 
first place.

That way, when you're *reading* the code of someone who likes to use such 
tricks, you only need to know how to read the one obvious way, rather than 
having to decipher whichever method they've chosen to work around the limitation.

The perennial accumulator example still takes 6 lines, though:

def accumulator(n):
     def increment(i):
         nonlocal n
         n += i
         return n
     return increment

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-Dev mailing list