2

假设我想动态修补tkinter.Tk以使窗口保持在顶部。如果我确定以下代码确实使用了 Tkinter,那么我可以import tkinter在其余代码之前执行必要的更新。

但是如何设置模块按需修补,即。只有当其余代码真正导入模块时?

我知道sys.path_hooksand sys.meta_path,但我希望有更简单的东西。我不想更改查找或加载机制,我只想在将导入的模块对象传递给导入模块之前获取它。

我不需要支持早于 3.5 的 Python 版本。

4

1 回答 1

0

我选择了包装builtins.__import__

该函数由 import 语句调用。它可以被替换(通过导入内置模块并分配给 builtins.__import__)以更改导入语句的语义

import builtins
original_import = builtins.__import__

def custom_import(*args, **kw):
    module = original_import(*args, **kw)

    if (module.__name__ == "interesting_module" 
        and not getattr(module, "patch_is_performed", False)):
        patch(module)
        module.patch_is_performed = True

    return module

builtins.__import__ = custom_import
于 2018-07-07T05:33:24.110 回答