[Python-3000] replace globals() and global statement with global builtin object

Guido van Rossum guido at python.org
Mon Jul 3 15:57:12 CEST 2006


On 7/3/06, BJörn Lindqvist <bjourne at gmail.com> wrote:
> On 7/1/06, Guido van Rossum <guido at python.org> wrote:
> > On 6/30/06, Steven Bethard <steven.bethard at gmail.com> wrote:
> > > BJörn Lindqvist wrote:
> > > > I have often wanted something similar to that for global
> > > > variables, instead of the global declaration:
> > > >
> > > > cache = None
> > > > def init():
> > > >     if not global.cache:
> > > >         global.cache = init_cache()
> > >
> > > Redirected since this seemed like a Python 3000 kind of request.  I
> > > like the idea, particularly because it coincides well with my usual
> > > uses for global/globals().  Seems like it might require some changes
> > > in things like eval and exec that take locals and globals dicts, but I
> > > don't know how much of a drawback that is.
> >
> > You realize that *reading* a global doesn't need the "global." prefix,
> > do you? So you could have written "if not cache: global.cache =
> > init_cache()" in the function body.
> >
> > I'm not sure I like this asymmetry much.
>
> I think the fix for that is to remove the "scope inheritance." I.e:
>
> cache = None
> def init():
>     if not cache:
>         pass
>
> Throws a NameError because cache is not declared in function init's
> scope. So you would be forced to write:
>
> cache = None
> def init():
>     if not global.cache:
>         global.cache = "foobar"
>
> I like the symmetry with self in classes. YMMV

That can't work because imported names are also globals, as are
classes and functions defined in the same module.

-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-3000 mailing list