wake-up-neo.com

mit __init__.py

Ich habe Schwierigkeiten, die Verwendungsszenarien oder Entwurfsziele von Pythons __init__.py - Dateien in meinen Projekten zu verstehen.

Angenommen, ich habe ein 'model'-Verzeichnis (als Paket bezeichnet), das die folgenden Dateien enthält

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py

Ich habe zwei Möglichkeiten gefunden, __init__.py Zu verwenden:

  1. Ich habe eine gemeinsame Definition, die in solrmodel.py, mongomodel.py, samodel.py Verwendet werden muss. Kann ich __init__.py Als Basis-/gemeinsame Definition für alle * model.py-Klassen verwenden? Das bedeutet, dass ich model/__init__.py Importieren muss.

  2. Oder der __init__.py Muss die importierten Definitionen von solrmodel.py, mongomodel.py und samodel.py enthalten und ermöglicht den einfachen Import von Klassen oder Funktionen wie diesen:

    # file: __init__.py
    
    from mongomodel import *
    from solrmodel import *
    from samodel import *
    

    (Mir ist bewusst, dass import * Nicht empfohlen wird und ich es nur als Konvention verwendet habe.)

Ich konnte mich nicht zwischen zwei Szenarien entscheiden. Gibt es weitere Verwendungsszenarien für __init__.py Und können Sie die Verwendung erläutern?

64
user90150

Die überwiegende Mehrheit der von mir geschriebenen __init__.py - Dateien ist leer, da viele Pakete nichts zu initialisieren haben.

Ein Beispiel für eine Initialisierung ist, wenn ich zum Zeitpunkt des Ladens eines Pakets ein für alle Mal ein paar Daten einlesen möchte (z. B. aus Dateien, einer Datenbank oder dem Web). In diesem Fall ist dies much Das Einlesen einer privaten Funktion in das __init__.py des Pakets ist angenehmer, als ein separates "Initialisierungsmodul" zu haben und dieses Modul redundant von jedem einzelnen realen Modul im Paket zu importieren (unnötigerweise wiederholend) und fehleranfällig: Dies ist offensichtlich ein Fall, in dem unter Berufung auf die Sprachgarantie sichergestellt wird, dass das Paket __init__.py einmal vor einem Modul in geladen wird Das Paket ist offensichtlich viel pythonischer!).

Weitere konkrete und maßgebliche Meinungen finden Sie in den verschiedenen Ansätzen der verschiedenen Pakete, die Teil der Standardbibliothek von Python sind.

49
Alex Martelli

Die Inhalte von __init__.py werden importiert, wenn Sie ein Modul innerhalb des Pakets importieren.

Sie übersehen ein drittes Szenario, das darin besteht, die gemeinsamen Teile in ein separates Modul zu packen und dann die anderen Module das importieren zu lassen, wobei __init__.py für Dinge, die außerhalb des Pakets verwendet werden. Dies ist die Praxis, die ich normalerweise folge.