Динамически создавать модули внутри __init__, если они не существуют.Python

Программы на Python
Ответить
Anonymous
 Динамически создавать модули внутри __init__, если они не существуют.

Сообщение Anonymous »

Я хотел бы динамически создавать и импортировать модули внутри внутреннего файла __init__.py, если один или несколько из набора индексированных подмодулей не существуют.
Скажем, у меня есть набор слоев модуля;

Код: Выделить всё

top_module/
__init__.py
sub_module/
__init__.py
a1/
__init__.py
n1.py
b1/
__init__.py
b1.py
b2/
__init__.py
b2.py
b3/
__init__.py
b3.py
a2/
__init__.py
a2.py
b*/...
a*/...
Где top_module/__init__.py выполняет импорт из .sub_module *.
Из top_module/ sub_module/__init__.py, скажем, у меня есть несколько папок a*, которые индексируются итеративно. Я знаю, что могу сделать что-то подобное, чтобы итерировать импорт по индексу для тех модулей, которые существуют;

Код: Выделить всё

from importlib import import_module

for a in range(some_max_a):
import_module(f'.a{a}', package='top_module.sub_module')
И что я могу сделать что-то подобное, чтобы просто игнорировать модули, которые еще не существуют;

Код: Выделить всё

from importlib import import_module

for a in range(some_max_a):
try:
import_module(f'.a{a}', package='top_module.sub_module')
except ModuleNotFoundError:
pass
Я хотел бы иметь возможность динамически создавать и импортировать эти модули, если они не существуют.
Что у меня есть на данный момент это

Код: Выделить всё

from importlib import import_module
from sys import modules
from types import ModuleType

PKG = 'top_module.sub_module'

for a in range(some_max_a):
try:
import_module(f'.a{a}', package=PKG)
except ModuleNotFoundError:
modules[f'{PKG}.a{a}'] = ModuleType(f'{PKG}.a{a}')
for b in range(some_max_b):
modules[f'{PKG}.a{a}.b{b}'] = ModuleType(f'{PKG}.a{a}.b{b}')
def function_all_should_have(*args, **kwargs):
raise NotImplementedError
modules[f'{PKG}.a{a}.b{b}'].function_all_should_have = function_all_should_have
import_module(f'{PKG}.a{a}')
Я пробовал с {PKG и без него в вызове import_module и/или вызове ModuleType.
Если я импортирую созданный пакет, я вижу, что все модули, которые я ожидаю создать, существуют в sys.modules, но пытаюсь получить доступ к любому из них с помощью вызова чего-либо нравиться top_module.sub_module.a3.b3.function_all_should_have() выдает ошибку типа

Код: Выделить всё

AttributeError: module 'top_module.sub_module' has no attribute 'a3'.
Тем не менее, я вижу, что существует модуль top_module.sub_module.a3 вместе со всеми модулями top_module.sub_module.a3.b*.
Я не совсем понимаю, почему модули создаются и существуют в sys.modules, но становятся недоступными после импорта.
Если нет простой ответ, я мог бы просто вернитесь к моему второму примеру и передайте, если модули не существуют, но мне все равно хотелось бы понять, что здесь происходит. Единственный вопрос, наиболее близкий к этому, — это создание динамических модулей.

Подробнее здесь: https://stackoverflow.com/questions/793 ... dont-exist
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»