Steven D'Aprano wrote:
Given this module:

#funny.py
import sys
print "Before:"
print "  __name__ =", __name__
print "  sys.modules[__name__] =", sys.modules[__name__]
sys.modules[__name__] = 123
print "After:"
print "  __name__ =", __name__
print "  sys =", sys


when I run it I get these results:


[st...@sylar python]$ python2.6 funny.py
Before:
  __name__ = __main__
  sys.modules[__name__] = <module '__main__' from 'funny.py'>
After:
  __name__ = None
  sys = None



I'm completely perplexed by this behaviour. sys.modules() seems to be a regular dict, at least according to type(), and yet assigning to an item of it seems to have unexpected, and rather weird, side-effects.

What am I missing?



Maybe when you assign 123 to sys.modules[__name__], you've removed the last reference on <module '__main__' from 'funny.py'> and it is garbaged. You are then loosing all your initial namespace.


try this one:
#funny.py
import sys
print "Before:"
print "  __name__ =", __name__
print "  sys.modules[__name__] =", sys.modules[__name__]
foo = sys.modules[__name__] # backup ref for the garbage collector
sys.modules[__name__] = 123
print "After:"
print "  __name__ =", __name__
print "  sys =", sys

Jean-Michel


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to