Python ist eine sehr elegante Sprache. Nun, außer ... außer Importen. Ich kann es immer noch nicht so machen, wie es mir natürlich erscheint.Circular Imports Hell
Ich habe eine Klasse MyObjectA
, die in Datei mypackage/myobjecta.py
ist. Dieses Objekt verwendet einige Dienstprogrammfunktionen, die in mypackage/utils.py
sind. Also in meiner ersten Zeile in myobjecta.py
ich schreibe:
from mypackage.utils import util_func1, util_func2
Aber einige der Utility-Funktionen erstellen und zurückgeben neue Instanzen von MyObjectA
. Also muss ich in utils.py
schreiben:
from mypackage.myobjecta import MyObjectA
Nun, nein ich kann nicht. Dies ist ein zirkulärer Import und Python wird dies ablehnen.
Es gibt viele Fragen zu diesem Thema, aber keine scheint eine befriedigende Antwort zu geben. Von was ich in allen Antworten lesen kann:
- Reorganisieren Sie Ihre Module, Sie tun es falsch! Aber ich weiß nicht, wie besser, meine Module zu organisieren, auch in einem so einfachen Fall wie ich präsentiert.
- Versuchen nur
import ...
stattfrom ... import ...
(persönlich hasse ich alle zu schreiben und möglicherweise Refactoring den vollen Namen Qualifier, ich liebe, genau zu sehen, was ich in Modul von der Außenwelt am Import). Würde das helfen? Ich bin mir nicht sicher, immer noch gibt es kreisförmige Importe. - Hacks wie importieren etwas in den inneren Bereich eines Funktionskörpers nur eine Zeile, bevor Sie etwas aus anderen Modul verwenden.
Ich hoffe immer noch, es gibt die Lösung Nummer 4), die Pythonic im Sinne von funktional und elegant und einfach und funktionierend sein würde. Oder gibt es nicht?
Hinweis: Ich bin in erster Linie ein C++ - Programmierer, das obige Beispiel ist so einfach zu lösen, indem entsprechende Header eingefügt werden, die ich nicht glauben kann, dass es in Python nicht möglich ist.
Von dem, was Sie sagen, würde ich entweder MyObjectA in utils.py setzen, weil einige Dienstprogrammfunktionen es zurückgibt, oder ich würde die Dienstprogrammfunktionen setzen, die ein MyObjectA in myobjecta.py zurückgibt. Aber das ist die Antwort 1) – DainDwarf
Ich suchte nach Python zirkuläre Importe und fand mehrere Fragen. Hast du gesucht? –
@ Dain: Ja, könnte sicherlich tun, wenn die Dienstprogrammfunktionen nur MyObjectA zurückgeben. Aber was, wenn sie auch MyObjectB oder MyObjectC usw. zurückgeben können? –