Erstellen Sie dynamisch Module in __init__, wenn sie nicht vorhanden sindPython

Python-Programme
Guest
 Erstellen Sie dynamisch Module in __init__, wenn sie nicht vorhanden sind

Post by Guest »

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;

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*/...
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;

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')
Und dass ich so etwas tun kann, um Module, die noch nicht existieren, einfach zu ignorieren;

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 gerne tun könnte, ist, diese Module dynamisch zu erstellen und zu importieren, wenn sie nicht existieren.
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}')
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

Code: Select all

AttributeError: module 'top_module.sub_module' has no attribute 'a3'.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post