Richtig importieren von Modulen in Python

Wie kann ich Modulimporte einrichten, damit jedes Modul auf die Objekte aller anderen zugreifen kann?

Ich habe eine mittelgroße Python-Anwendung mit Modul-Dateien in verschiedenen Unterverzeichnissen. Ich habe Module erstellt, die diese Unterverzeichnisse an sys.path anhängen und eine Gruppe von Modulen import thisModule as tm , indem import thisModule as tm . Modulobjekte werden mit dieser Qualifikation bezeichnet. Ich importiere dann dieses Modul in die anderen mit from moduleImports import * . Der Code ist jetzt schlampig und hat einige dieser Dinge, die oft doppelt sind.

  • PyQt Unregelmäßig geformte Fenster (zB ein Rundschreiben ohne Rand / Dekorationen)
  • Implementiere singleton mit metaclass
  • Fehler bei der Verwendung von FigureCanvasQTAgg in MatplotlibWidget pyqt5
  • Flache Liste der Listen der Listen zu einer Liste der Listen
  • Löschen der ersten Zeile einer Textdatei in Python
  • Kann ich diesen Python-Code vektorisieren?
  • Zuerst fällt die Anwendung aus, da einige Modulreferenzen nicht zugeordnet sind. Der gleiche Code läuft, wenn die Einheit getestet wird.

    Zweitens mache ich mir Sorgen, dass ich ein Problem mit rekursiven Modulimporten verursache. Importieren von moduleImports importiert thisModule, das moduleImports importiert. . . .

    Was ist der richtige Weg, dies zu tun?

  • Python: '' ist nicht definiert
  • Pandas Serie zu Dataframe, verwenden Sie die Serienindizes als Spalten
  • Python sqlalchemy + postgresql Programm friert
  • Entschlüsseln Sie gpg-Datei von E-Mail (file.pgp)
  • Wie summiere man einzelne Zeilen in Pandas?
  • Wie kann ich eine Reihe von High- und Low-Pitch-Pieptönen mit Ruby oder Python erstellen?
  • 4 Solutions collect form web for “Richtig importieren von Modulen in Python”

    "Ich habe eine mittelgroße Python-Anwendung mit Modul-Dateien in verschiedenen Unterverzeichnissen."

    Gut. __init__.py Sie absolut sicher, dass jedes Verzeichnis eine Datei __init__.py enthält, so dass es ein Paket ist.

    "Ich habe Module erstellt, die diese Unterverzeichnisse an sys.path "

    Schlecht. Verwenden Sie PYTHONPATH oder installieren Sie die gesamte Struktur Lib/site-packages . sys.path dynamisch aktualisieren. Es ist eine schlechte Sache. Schwer zu verwalten und zu pflegen.

    "Importiert eine Gruppe von Modulen, mit import thisModule as tm ."

    Macht keinen Sinn. Vielleicht hast du einen import thisModule as tm für jedes Modul in deiner Struktur. Dies ist typisch, Standard-Praxis: Import nur die Module, die Sie brauchen, keine anderen.

    "Ich importiere dann dieses Modul in die anderen mit from moduleImports import * "

    Schlecht. Decken Sie nicht ein Bündel von zufälligen Sachen.

    Jedes Modul sollte eine längere Liste der spezifischen Dinge haben, die es braucht.

     import this import that import package.module 

    Explizite Liste. Keine magie Keine dynamische Änderung an sys.path .

    Mein aktuelles Projekt hat 100 Module, ein Dutzend oder so Pakete. Jedes Modul importiert genau das, was es braucht. Keine magie

    Wenige Zeiger

    1. Vielleicht haben Sie bereits Funktionalität in verschiedenen Modulen aufgeteilt. Wenn du die meiste Zeit richtig gemacht hast, wirst du nicht in kreisförmige Importprobleme fallen (zB wenn Modul a von b und b abhängig ist, kannst du ein drittes Modul c machen, um eine solche kreisförmige Abhängigkeit zu entfernen). Als letzter Ausweg, in einem Import b aber in b Import a an der Stelle, wo ein benötigt wird, zB Innenfunktion.

    2. Sobald die Funktionalität ordnungsgemäß in Modulen gruppiert sie in Pakete unter einem Subdir und fügen Sie eine Datei __init__.py , damit Sie das Paket importieren können. Halten Sie solche pakages in einem Ordner zB lib und fügen Sie dann entweder sys.path hinzu oder setzen Sie PYTHONPATH env Variable

    3. Vom Modulimport * kann nicht eine gute Idee sein. Stattdessen importiere alles was nötig ist. Es kann voll qualifiziert sein. Es tut nicht weh, um ausführlich zu sein. ZB aus pakageA.moduleB importiere coolClass.

    Der Weg, dies zu tun, ist, Magie zu vermeiden. Mit anderen Worten, wenn Ihr Modul etwas von einem anderen Modul benötigt, sollte es es explizit importieren. Sie sollten sich nicht darauf verlassen, dass die Dinge automatisch importiert werden.

    Wie der Zen von Python ( import this ) hat es, explizit ist besser als implizit.

    Du wirst keine Rekursion auf Importe bekommen, denn Python cachiert jedes Modul und wird es nicht neu laden.

    Python ist die beste Programmiersprache der Welt.