Ich habe beispielsweise eine Reihe von Modulebenen;
Code: Select all
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*/...
Aus dem top_module/ sub_module/__init__.py, sagen wir, ich habe mehrere dieser a*-Ordner, die einfach iterativ indiziert werden. Ich weiß, dass ich so etwas tun kann, um den Import über einen Index für die vorhandenen Module zu iterieren;
Code: Select all
from importlib import import_module
for a in range(some_max_a):
import_module(f'.a{a}', package='top_module.sub_module')
Code: Select all
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
Was ich bisher habe ist
Code: Select all
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}')
Wenn ich das erstellte Paket importiere, kann ich sehen, dass alle Module, die ich dadurch erstellen möchte, in sys.modules vorhanden sind, aber ich versuche, mit einem Aufruf von etwas auf eines davon zuzugreifen wie top_module.sub_module.a3.b3.function_all_should_have() liefert einen Fehler im Sinne von
Code: Select all
AttributeError: module 'top_module.sub_module' has no attribute 'a3'.
Ich bin mir nicht wirklich sicher, warum die Module erstellt werden und in sys.modules vorhanden sind, aber nach dem Import nicht erreichbar sind.
Wenn nein einfache Antwort, ich könnte einfach zu meiner zurückkehren zweites Beispiel und pass wenn die Module nicht existieren, ich aber trotzdem gerne verstehen würde, was hier passiert. Die einzige Frage, die dieser Frage am nächsten kam, war die dynamische Modulerstellung.