module - 分配给 sys.modules [__name__] 后,python 为什么是__name__更改值?

  显示原文与译文双语对照的内容
60 0

,我在 sys.modules 中遇到的unexpected 常量titled类似于下面代码 fragment ( 这会破坏配方中的部分代码) 所示的代码,在中,我遇到了意外副作用:


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 !

时间: 原作者:

58 0

因为 did sys.modules[__name__] = _test() overwrite模块,所以模块被删除,但同时又在模块中返回 None,所以这个模块仍然会被删除。


class _test(object): pass



import sys


print sys.modules['__main__']


# <module '__main__' from 'test.py'> < <<the test.py is the name of this module


sys.modules[__name__] = _test()


# Which is the same as doing sys.modules['__main__'] = _test() but wait a


# minute isn't sys.modules['__main__'] was referencing to this module so


# Oops i just overwrite this module entry so this module will be deleted


# it's like if i did:


#


# import test


# __main__ = test


# del test


# __main__ = _test()


# test will be deleted because the only reference for it was __main__ in


# that point.



print sys, __name__


# None, None



import sys # i should re import sys again.


print sys.modules['__main__']


# <__main__._test instance at 0x7f031fcb5488> < <<my new module reference.



编辑:

修复将是这样做的:


class _test(object): pass



import sys


ref = sys.modules[__name__] # Create another reference of this module.


sys.modules[__name__] = _test() # Now when it's overwritten it will not be


 # deleted because a reference to it still


 # exists.



print __name__, _test


# __main__ <class '__main__._test'>



希望这能解释。

原作者:
90 1

如果我给 sys.modules['__main__'] 分配了任何东西,就会得到严重破坏的环境。 虽然不是这样的行为但我的全局和构建都消失了。

sys.modules 没有在写入时以任何特殊方式进行文档化,只有模糊地用于"重新加载技巧"( 即使使用了它) 。

我不会为它写一个模块,除了痛苦。 我认为这个配方是完全误导的。

原作者:
...