Namespace Problem with global declaration in module

Gordon McMillan gmcm at hypernet.com
Thu Apr 27 09:23:52 EDT 2000


spex66 at my-deja.com wrote:

> hmm, deja is not so fast as my newsreader :), so here is a reply
> of Gordons message
> 
> >spex66 at my-deja.com wrote:
> >
> >> Hi,
> >> it seemed very simple but don't worked like expected:
> >>
> >> #FILE: test.py
> >> dd = None #INIT a shadow instance for automated access
[snip]
> >>
> >> >>> from test import *
> >
> >There's your problem. "from test import *" copies names from
> >test to your namespace. Now dd is another name for None. yy()
> >affects the dd in test's namespace, not yours.
> >
> >- Gordon
> 
> I see the point, but I like the from statement :)

Tough :-). import * is mostly a shortcut for interactive work. Look at the 
top of Tkinter.py to see what a module needs to do to make import * 
safe.

> Is it a bug? 

No.

> It's not the way I expected this code to work... and
> I cannot find a hook in the documentation that explicit explained
> this misbehaviour.

It's there, in 6.11 of the Language Ref:

The from form does not bind the module name: it goes through the 
list of identifiers, looks each one of them up in the module found in 
step (1), and binds the name in the local namespace to the object 
thus found. If a name is not found, ImportError is raised. If the list 
of identifiers is replaced by a star ("*"), all names defined in the 
module are bound, except those beginning with an underscore ("_"). 

No, the implications of that statement are not immediately obvious.

> Any idea for a workaround (I need the from-statement for further
> code readability)?

No, you want it for type-ability. Come back to it in a few months and 
you'll wish you'd spelled out where all those names came from.

- Gordon




More information about the Python-list mailing list