Как пропатчить модуль 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
Другие вопросы по тегам