Скажем, у меня есть набор слоев модуля;
Код: Выделить всё
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/ 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}')
Если я импортирую созданный пакет, я вижу, что все модули, которые я ожидаю создать, существуют в sys.modules, но пытаюсь получить доступ к любому из них с помощью вызова чего-либо нравиться top_module.sub_module.a3.b3.function_all_should_have() выдает ошибку типа
Код: Выделить всё
AttributeError: module 'top_module.sub_module' has no attribute 'a3'.
Я не совсем понимаю, почему модули создаются и существуют в sys.modules, но становятся недоступными после импорта.
Если нет простой ответ, я мог бы просто вернитесь к моему второму примеру и передайте, если модули не существуют, но мне все равно хотелось бы понять, что здесь происходит. Единственный вопрос, наиболее близкий к этому, — это создание динамических модулей.
Подробнее здесь: https://stackoverflow.com/questions/793 ... dont-exist
Мобильная версия