【问题标题】:Override the "from <my_object> import <name>" functionality?覆盖“从 <my_object> 导入 <name>”功能?
【发布时间】:2018-08-01 15:20:59
【问题描述】:

假设我有一个自定义类和它的一个实例:

class Container:
    def __init__(self):
        self._modules = {}

container = Container()

是否可以覆盖 from X import Y 功能,以便我可以执行以下操作:

>>> container._modules['foo'] = 'bar'
>>> from container import foo
>>> foo
'bar'

【问题讨论】:

    标签: python python-3.x overriding python-import


    【解决方案1】:

    有一些使用导入钩子的解决方案,在PEP 302 中定义(类似问题:https://stackoverflow.com/a/3074701/5764588),但这里有一个解决方案覆盖内置的__import__-function 与一个检查本地命名空间的@ 987654324@from x import y:

    不过,我不建议在任何实际场景中使用它,因为它很hackish,因为它插入了python的核心功能,并且可能会产生一些令人困惑的代码,例如,当你有一个同名的模块时作为局部变量。不过,您的用例可能是有效的,在这种情况下,别有用心!

    class Container:
    
        def __init__(self):
            self._modules = {}
    
        def __getattr__(self, name):
            if name in self._modules:
                return self._modules[name]
            return super().__getattr__(name)
    
    container = Container()
    container._modules["foo"] = "bar"
    
    
    prev_import = __import__
    
    def new_import(name, globals=None, locals=None, fromlist=(), level=0):
        if level == 0 and fromlist and name in locals:
            return locals[name]
    
        return prev_import(name, globals, locals, fromlist, level)
    
    __builtins__.__import__ = new_import
    
    
    from container import foo
    
    print(foo)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多