Как пропатчить модуль Python 3 при первом импорте?
Допустим, я хочу динамически исправлять tkinter.Tk
чтобы окна оставались на вершине. Если я уверен, что следующий код действительно использует Tkinter, то я могу import tkinter
перед остальным кодом и выполните необходимые обновления.
Но как настроить исправление модуля по требованию, т.е. только когда весь код действительно импортирует модуль?
Я знаю о sys.path_hooks
а также sys.meta_path
Надеюсь, есть что-то попроще. Я не хочу менять механизм поиска или загрузки, я просто хочу заполучить импортированный объект модуля, прежде чем он будет передан в модуль импорта.
Мне не нужно поддерживать версии Python старше 3.5.
1 ответ
Я выбрал упаковку 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