Unexpected side-effects of assigning to sys.modules[__name__]
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__]
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__]
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