Unexpected side-effects of assigning to sys.modules[__name__]

2009-08-06 Thread Steven D'Aprano
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?



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


Re: Unexpected side-effects of assigning to sys.modules[__name__]

2009-08-06 Thread Jean-Michel Pichavant

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


Re: Unexpected side-effects of assigning to sys.modules[__name__]

2009-08-06 Thread Steven D'Aprano
On Thu, 06 Aug 2009 20:01:42 +0200, Jean-Michel Pichavant wrote:


  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.

By Jove, I think you've got it! How obvious in hindsight. Thank you.





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