Erstellen Sie dynamisch Module in __init__, wenn sie nicht vorhanden sind
Posted: 27 Dec 2024, 09:59
Ich möchte Module dynamisch in einer inneren __init__.py-Datei erstellen und importieren, wenn eines oder mehrere einer Reihe indizierter Submodule nicht vorhanden sind.
Ich habe beispielsweise eine Reihe von Modulebenen;
Wo das top_module/__init__.py einen from .sub_module-Import ausführt *.
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;
Und dass ich so etwas tun kann, um Module, die noch nicht existieren, einfach zu ignorieren;
Was ich gerne tun könnte, ist, diese Module dynamisch zu erstellen und zu importieren, wenn sie nicht existieren.
Was ich bisher habe ist
Ich habe es mit und ohne {PKG} im import_module-Aufruf und/oder im ModuleType-Aufruf versucht.
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
Dennoch kann ich sehen, dass es ein top_module.sub_module.a3-Modul zusammen mit allen top_module.sub_module.a3.b*-Modulen gibt.
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.
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.