虽然试图做类似什么是由亚历克斯·马尔泰利题为Constants in Python的ActiveState的配方什么的,我遇到了意想不到的副作用(在Python 2.7),在sys.modules
指定一个类实例的条目 - 即这样做显然改变,如下面的代码片段所示的__name__
到None
值(它打破了代码的一部分在配方):为什么赋值给sys.modules [__ name__]后__name__的值发生了变化?
class _test(object): pass
import sys
print '# __name__: %r' % __name__
# __name__: '__main__'
sys.modules[__name__] = _test()
print '# __name__: %r' % __name__
# __name__: None
if __name__ == '__main__': # never executes...
import test
print "done"
我想明白为什么会这样。我不相信这是Python 2.6和更早版本的方式,因为我有一些旧代码,显然if __name__ == '__main__':
条件在分配之后按预期工作(但不再是)。
FWIW,我也注意到名字_test
在分配后也从类对象反弹到None
。这似乎很奇怪,我认为他们是反弹None
,而不是完全消失......
更新:
我想补充一点,对于实现if __name__ == '__main__':
效果的任何变通办法,给什么发生将不胜感激。 TIA!
而“用None覆盖所有内容”行为来自模块析构函数故意清除模块中定义的函数与模块__dict__'之间的引用循环。 – ncoghlan 2011-03-20 00:03:21
很好的答案和优秀的解决方法。我从来没有考虑过删除一个'sys。由于引用计数为零(特别是考虑到模块本身由代码完成),所以对模块的引用可能会导致其立即销毁。谢谢! – martineau 2011-03-20 18:31:49
根据您的解决方法建议,我用'_ref,sys.modules [__ name__] = sys.modules [__ name__],_test()'替换了'sys.modules [__ name__] = _test()',好吧。 – martineau 2011-03-20 19:14:39