Как пропатчить модуль Python 3 при первом импорте? - PullRequest
0 голосов
/ 05 июля 2018

Допустим, я хочу динамически исправить tkinter.Tk, чтобы окна оставались на вершине. Если я уверен, что следующий код действительно использует Tkinter, тогда я могу import tkinter перед остальным кодом и выполнить необходимые обновления.

Но как настроить исправление модуля по требованию, т.е. только когда весь код действительно импортирует модуль?

Я знаю о sys.path_hooks и sys.meta_path, но я надеюсь, что есть что-то попроще. Я не хочу менять механизм поиска или загрузки, я просто хочу заполучить импортированный объект модуля, прежде чем он будет передан в модуль импорта.

Мне не нужно поддерживать версии Python старше 3.5.

1 Ответ

0 голосов
/ 07 июля 2018

Я выбрал упаковку 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...