覆盖“从<my_object>导入<名称>”功能吗?

时间:2018-08-01 15:21:00

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

说我有一个自定义类和一个实例:

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

container = Container()

是否可以覆盖from X import Y功能,以便我可以做类似的事情:

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

1 个答案:

答案 0 :(得分:2)

有一些使用导入钩子的解决方案,它们在PEP 302中进行了定义(类似的问题:https://stackoverflow.com/a/3074701/5764588),但这是一种解决方案,它使用检查以下项来覆盖内置的__import__函数xfrom x import y的本地名称空间:

我不建议在任何实际情况下使用此命令,因为它很黑,因为它插入了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)