雖然試圖做類似什麼是由亞歷克斯·馬爾泰利題爲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