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

发布于 2021-01-29 14:58:06

一个不受欢迎但受支持的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__]
关注者
0
被浏览
119
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

    class MyClass(object):
    
        import os
    
        def check_os(self):
            print(os)
    

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看