首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何临时覆盖导入行为?

如何临时覆盖导入行为?
EN

Stack Overflow用户
提问于 2018-06-16 08:04:49
回答 1查看 96关注 0票数 0

我使用的是一个模块module_1,如果系统上安装了module_2,该模块可以使用它,如果没有安装,则可以使用其他实现。它检查module_2是否为:

代码语言:javascript
复制
# module_1.__init__.py

try:
    import module_2
    _MODULE2 = True
except ImportError:
    _MODULE2 = False

我在相同的环境中安装了module_2,但我不希望module_1使用它。

有没有一种方法可以import module_1但覆盖import机制,使module_2import明确地引发一个ImportError

我尝试过的:

代码语言:javascript
复制
import sys
class hide_module_2:
    def __enter__(self):
        class HideModule2(dict):
            def __init__(self, *args, **kwargs):
                self.update(*args, **kwargs)

            def __getitem__(self, key):
                if key == 'module_2':
                    raise ImportError('Module 2 de')
                super().__getitem__(key)
        sys.modules = NoPandas(**sys.modules)

    def __exit__(self, exc_type, exc_value, traceback):
        # revert to regular dictionary
        sys.modules = dict(**sys.modules)

with hide_module_2():
    import module_1

我认为这是可行的,因为sys.modules是当前imported模块的字典,并且我认为它会在import中被引用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-16 08:04:49

我能够设计出一种老生常谈的解决方案,因为如果导入了某个内容,并且sys.modules中有一个None,导入系统就会抛出ImportError:

代码语言:javascript
复制
class hide_module_2:   
    def __enter__(self):
        self.module_2 = sys.modules.get('module_2')
        sys.modules['module_2'] = None

    def __exit__(self, exc_type, exc_value, traceback):
        if self.module_2 is None:
          sys.modules.pop('module_2')
        else:
          sys.modules['module_2'] = self.module_2

with hide_module_2():
    import module_1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50883988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档