[Python-Dev] Using and binding relative names (was Re: PEP for Better Control of Nested Lexical Scopes) (original) (raw)

Phillip J. Eby pje at telecommunity.com
Tue Feb 21 21:25:38 CET 2006


At 11:31 AM 2/21/2006 -0800, Josiah Carlson wrote:

Greg Ewing <greg.ewing at canterbury.ac.nz> wrote: > > It seems a bit inconsistent to say on the one hand > that direct assignment to a name in an outer scope > is not sufficiently useful to be worth supporting, > while at the same time providing a way to do it for > one particular scope, i.e. 'global'. Would you > advocate doing away with it?

I didn't conceive of the idea or implementation of 'global', it was before my time. I have found that using global can be convenient (and sometimes even directly manipulating globals() can be even more convenient). However, I believe global was and is necessary for the same reasons for globals in any other language.

Here's a crazy idea, that AFAIK has not been suggested before and could work for both globals and closures: using a leading dot, ala the new relative import feature. e.g.:

def incrementer(val):
    def inc():
        .val += 1
        return .val
    return inc

The '.' would mean "this name, but in the nearest outer scope that defines it". Note that this could include the global scope, so the 'global' keyword could go away in 2.5. And in Python 3.0, the '.' could become required for use in closures, so that it's not necessary for the reader to check a function's outer scope to see whether closure is taking place. EIBTI.

Interestingly, the absence of a name before the dot seems to imply that the name is an attribute of the Unnameable. :) Or more prosaically, it treats lexical closures and module globals as special cases of objects.

You could perhaps even extend it so that '.' by itself means the same thing as vars(), but that's probably going too far, assuming that the idea wasn't too far gone to begin with. I suspect functional folks will love the '.' idea, but also that folks who wanted to get rid of 'self' will probably scream bloody murder at the idea of using a leading dot to represent a scope intead of 'self'. :)



More information about the Python-Dev mailing list