import overwrites __name__
Peter Otten
__peter__ at web.de
Sun May 10 13:59:18 EDT 2009
Piet van Oostrum wrote:
>>>>>> Peter Otten <__peter__ at web.de> (PO) wrote:
>
>>PO> $ cat x.py
>>PO> import sys
>>PO> globals().update(zip(*(range(110),)*2))
>>PO> y = 42
>>PO> print __name__
>>PO> if __name__ == "__main__":
>>PO> a = b = 42
>>PO> print len(dir())
>>PO> from x import y as z
>>PO> try:
>>PO> print my_name
>>PO> except NameError, e:
>>PO> print 'unhandled NameError: "%s"' % e
>>PO> sys.exit()
>
>>PO> $ python x.py
>>PO> __main__
>>PO> 119
>>PO> x
>>PO> 117
>>PO> unhandled NameError: "name 'my_name' is not defined"
>
> This is perfectly normal.
I'm not 100% sure of that.
Just in case you didn't notice: I'm not the OP. The above piece of junk code
was my attempt to keep as close to the code he posted while producing the
same output that he got.
> python x.py command runs normally (although
> the globals().update is a very weird thing to do), until the from x
> import y command. Then x.py is loaded again but now as the module 'x'
> instead of '__main__'. Python doesn't know it's the same file, and
> actually it doesn't want to know. It only knows it when you do import
> twice on the same file. Not when you run it as a main script first and
> then imports it. **This is a thing you shouldn't do**.
> There are now two namespaces: one for __main__ and one for x. These are
> distinct and have no relationship.
>
> The reason that the first number is 119 and the second is 117 is that
> while importing x the variables a and b are not created.
Your explanation is of course between 119 and 117% correct while I was only
99% serious...
Cheers,
Peter
More information about the Python-list
mailing list