ubuntuusers.de

[Python] circular import

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

Glocke

Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

Hi,

beim Import einiger Files kam es bei mir zu Problemen, da in A etwas aus B benötigt wurde und in B etwas aus A. Meine bisherige Lösung sieht so aus:

foo.py

1
2
3
4
5
6
from bar import b, bar_func

a = 1

def foo_func():
   return bar_func() + a

bar.py

1
2
3
4
5
6
from foo import a, foo_func

b = 2

def bar_func():
   return foo_func() * b

das ganze ist natürlich auf ein einfaches beispiel reduziert 😛

Ich kann die def, classes etc. aus den Modulen nicht anders "unterbringen" (erstens inhaltlich nicht und zweitens sind die zu stark ineinander verzahnt, eine 50kb file will ich aber vermeiden da sich daran mit mehreren personen nicht so schön arbeiten lässt - aber egal).

Auf jeden Fall sieht es jetzt so ähnlich aus:

foo.py

1
2
3
4
5
6
7
8
9
a = None
foo_func = None

from bar import b, bar_func

a = 1

def foo_func():
   return bar_func() + a

bar.py

1
2
3
4
5
6
7
8
9
b = None
bar_func = None

from foo import a, foo_func

b = 2

def bar_func():
   return foo_func() * b

Wahrscheinlich kein sauberer Weg. Was ist in so einem Fall die Regel?

LG

barcc

Avatar von barcc

Anmeldungsdatum:
13. Juli 2007

Beiträge: 696

Wohnort: Dortmund

Du kannst das lösen, indem du auf from verzichtest:

foo.py

1
2
3
4
5
6
import bar

a = 1

def foo_func():
    return bar.bar_func() + bar.a

bar.py

1
2
3
4
5
6
import foo

b = 2

def bar_func():
    return foo.foo_func() * foo.b

Es reicht auch, das nur für die Datei zu machen, die als zweite importiert wird.

Eine andere unsaubere Lösung wäre, die from-import-Zeilen ans Dateiende zu verschieben. Die beste Möglichkeit ist aber, den Code zu entwirren und Imports nur hierarchisch zu verwenden.

Gruß, barcc

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

barcc schrieb:

Die beste Möglichkeit ist aber, den Code zu entwirren und Imports nur hierarchisch zu verwenden.

Sehe ich ganz genau so. Wenn Modul B das Modul A importiert, aber das Modul A wiederum Bestandteile aus B benötigt, dann ist das IMHO ein kaputtes Design. Sofern es ein paar Lowlevel-Funktionen gibt, die von beiden Modulen genutzt werden, dann sollte man diesen Funktionen ein eigenes Modul (z.B. helpers oder core) spendieren.

Glocke

(Themenstarter)
Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

snafu1 schrieb:

barcc schrieb:

Die beste Möglichkeit ist aber, den Code zu entwirren und Imports nur hierarchisch zu verwenden.

Sehe ich ganz genau so. Wenn Modul B das Modul A importiert, aber das Modul A wiederum Bestandteile aus B benötigt, dann ist das IMHO ein kaputtes Design. Sofern es ein paar Lowlevel-Funktionen gibt, die von beiden Modulen genutzt werden, dann sollte man diesen Funktionen ein eigenes Modul (z.B. helpers oder core) spendieren.

Ich versuch das so umzubauen, dass es kein "kaputtes Design" mehr ist. Was wären die Nachteile meiner "Lösung"?

LG

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Glocke schrieb:

Ich versuch das so umzubauen, dass es kein "kaputtes Design" mehr ist. Was wären die Nachteile meiner "Lösung"?

Das sieht man doch an diesem Thread 😉

Antworten |