使用类对象替换 sys.modules 中的当前模块后,导入的模块变为 None。

9
一个不太受欢迎但“支持”的Python技巧(参见Guido:https://mail.python.org/pipermail/python-ideas/2012-May/014969.html),它使得可以在模块属性上使用__getattr__,具体方法如下:
import os, sys

class MyClass(object):

    def check_os(self):
        print os

sys.modules[__name__] = MyClass()

导入时,被导入的模块成为一个类实例:

>>> import myModule
>>> myModule
<myModule.MyClass object at 0xf76def2c>

然而,在Python-2.7中,原始模块中引入的所有其他模块都设置为None。
>>> repro.check_os()
None

在Python-3.4中,一切都能正常工作:
>>> repro.check_os()
<module 'os' from '/python/3.4.1/lib/python3.4/os.py'>

这似乎与运行函数时导入的模块变成None有关,但是,有人知道这种情况在内部为什么会发生吗?
如果您存储原始模块(而不是在Python-2中完全替换它),则似乎一切都可以正常工作:
sys.modules[__name__+'_bak'] = sys.modules[__name__]      
1个回答

7
你遇到的问题是在Python 3.4之前的版本中,当一个模块被销毁时(例如你用一个类替换它并且没有更多的引用),该模块中的__dict__中的项目会被强制设置为None。
如果需要支持Python 3.4之前的版本,则解决方法是在将要替换模块的类中使用import语句。
class MyClass(object):

    import os

    def check_os(self):
        print(os)

更多信息请参见有关解释器关闭的此答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接