Kreuzweise Imports irgendwie möglich?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Kreuzweise Imports irgendwie möglich?

Beitragvon sma » Sonntag 6. Januar 2008, 12:45

Ich habe Quelltext, der so ungeschickt in Dateien (also damit Module) aufgeteilt ist, dass sich Funktionen daraus gegenseitig benötigen, etwa so:

Code: Alles auswählen

# module1.py
def foo():
    ...bar()...

# module2.py
def bar():
    ...foo()...

Ich hatte versucht, dass durch ein drittes Modul zu korrigieren:

Code: Alles auswählen

# g.py
from module1 import *
from module2 import *

# module1.py
from g import *
...

# module2.py
from g import *
...

Doch leider geht das nicht, da g.__dict__ beim Importieren in module1 noch nichts enthält, insbesondere nicht das, was ich mir aus module2 zu importieren erhoffe.

Kann ich die Situation irgendwie trickreich retten, ohne alle Funktionsnamen zu ändern (was ich nicht nur hässlich fände, sondern auch echte Arbeit wäre, da es nicht nur zwei Module sondern ein Dutzend mit einigen Tausend Zeilen Code sind) und mit einem expliziten Modul-Präfix zu versehen?

Stefan
BlackJack

Beitragvon BlackJack » Sonntag 6. Januar 2008, 13:33

Der einzige "Trick" der mir einfiele: Alles in ein Modul kopieren. Ist ja letztendlich auch der Effekt, den man sich in der Regel mit einem Sternchen-Import verspricht, nämlich das es wie ein "include" funktioniert.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Sonntag 6. Januar 2008, 14:47

Habe jetzt folgendes gemacht:

Code: Alles auswählen

from includes import *
for m in sys.modules.values():
    if hasattr(m, 'MONSTERS'):
        m.__dict__.update(sys.modules['includes'].__dict__)

Im main-Modul durchsuche ich alle geladenen Module nach den passenden (die zufällig alle die Konstante MONSTERS haben, da das das erste ist, was in includes.py steht) und aktualisiere deren dicts mit dem letzten Stand des globalen Moduls.

Nicht wirklich schön, aber ich kann mich jetzt darum kümmern, dass das Programm funktioniert und kämpfe nicht mehr mit der mangelhaften Modularisierung ;)

Stefan
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Sonntag 6. Januar 2008, 21:33

Man könnte auch einfach die Imports an das Ende der Datei schreiben.
TUFKAB – the user formerly known as blackbird
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Montag 7. Januar 2008, 18:29

mitsuhiko, ist es wirklich immer so einfach? Für 2 Dateien funktioniert dein Tipp, aber bei meinem Ansatz, in einer Datei alle Imports zu sammeln, damit ich dann in jedem Modul nur ein Import schreiben muss, passt doch AFAICT folgendes (mal die Imports nach hinten gepackt):

Modul A definiert Name a. Modul A importiert dann G. G importiert erneut A (was schon geladen wurde, daher nicht noch einmal durchlaufen wird) und fügt a zu G hinzu. G importiert dann B. B definiert b und importiert dann G, welches, da schon geladen, einfach seine Namen, also a, zu B hinzufügt. Dann kehren wir zum Import-Vorgang innerhalb von G zurück und fügen alles aus B, also a und b zu G hinzu. Nun importiert G noch C, das definiert c, fügt aus G a und b hinzu und in G landen a, b und c. Diese landen dann in A.

Damit fehlt doch aber "c" in B.

Stefan

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder