假设我想动态修补tkinter.Tk
以使窗口保持在顶部。如果我确定以下代码确实使用了 Tkinter,那么我可以import tkinter
在其余代码之前执行必要的更新。
但是如何设置模块按需修补,即。只有当其余代码真正导入模块时?
我知道sys.path_hooks
and sys.meta_path
,但我希望有更简单的东西。我不想更改查找或加载机制,我只想在将导入的模块对象传递给导入模块之前获取它。
我不需要支持早于 3.5 的 Python 版本。
假设我想动态修补tkinter.Tk
以使窗口保持在顶部。如果我确定以下代码确实使用了 Tkinter,那么我可以import tkinter
在其余代码之前执行必要的更新。
但是如何设置模块按需修补,即。只有当其余代码真正导入模块时?
我知道sys.path_hooks
and sys.meta_path
,但我希望有更简单的东西。我不想更改查找或加载机制,我只想在将导入的模块对象传递给导入模块之前获取它。
我不需要支持早于 3.5 的 Python 版本。
我选择了包装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