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.

  • Meine eigenen Daten über FaceBook API abrufen
  • Wie zählt man die Anzahl der folgenden Zeilen in Pandas
  • Python & MySql: Unicode und Codierung
  • Migration zu pip + virtualenv von setuptools
  • Boto - Hochladen von Datei an einen bestimmten Ort auf Amazon S3
  • In Python, gibt es eine Möglichkeit, ich kann alle / einige der Bilddateien (zB JPG / PNG) aus einem ** Google Bilder ** Suchergebnis herunterladen?
  • 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?

  • Pandas-Fehler "Kann nur .str accessor mit String-Werten verwenden"
  • Minimieren von Funktionen mit großen Gradienten mit `scipy.optimize.minimize`
  • Verwalten von Protokollen / Warnungen in Python-Erweiterungen
  • Pass dict mit Nicht-String-Schlüsselwörter, um in kwargs zu funktionieren
  • Slurm Multiprocessing Python Job
  • ValueError: benötigt mehr als 1 Wert zum Auspacken
  • 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.