Модули Python, заменяющие себя во время загрузки

#python-3.x #python-import

#python-3.x #python-импорт

Вопрос:

Недавно я наткнулся на некоторый код, в котором используется трюк, который заставляет меня нервничать. Система, на которую я смотрю, имеет Moo.so файл расширения Python, хранящийся вне пути, и разработчик хочет импортировать его с помощью just import Moo . По разным причинам ни расположение файла, ни sys.path может быть изменен, и расширение должно быть загружено в ExtensionFileLoader любом случае.

Итак, что было сделано, так это иметь a Moo.py в пути, который загружает модуль расширения, а затем заменяет себя sys.modules модулем расширения, в следующих строках:

 ' Moo.py '

from importlib.machinery import ExtensionFileLoader

loader = ExtensionFileLoader('AnotherNameForMoo', '/path/to/Moo.so')
module = loader.load_module()
sys.modules['Moo'] = module
 

Теперь это действительно работает. (У меня есть несколько довольно подробных тестов в этом репозитории, если вы хотите взглянуть.) Похоже, что, по крайней мере, в CPython с 3.4 по 3.7, import Moo не привязывается к Moo модулю, который он загрузил и вставил sys.modules['Moo'] , а вместо этого привязывает текущее значение sys.modules['Moo'] после возврата скрипта верхнего уровня модуля, независимо от того, было ли это то, что он изначально туда вставил.

Я не могу найти ничего ни в одной документации Python, что указывало бы, что это требуемое поведение, а не просто случайность реализации.

Насколько это безопасно? Каковы другие способы, которыми можно было бы попытаться достичь аналогичного эффекта «начальной загрузки»?