小编典典

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

python

一个不受欢迎但受支持的python
hack(请参阅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__]

阅读 275

收藏
2021-01-20

共1个答案

小编典典

您遇到的问题是,在3.4之前的Python中,当一个模块被销毁时(就像您那样,因为您将其替换为一个类,并且没有对其的进一步引用),所以该模块中的项目__dict__被强制设置为None

如果您需要在3.4之前支持Python,则解决方法是import在类中有一条替换该模块的语句:

class MyClass(object):

    import os

    def check_os(self):
        print(os)
2021-01-20