Was ist __init__.py für?

Was ist __init__.py für in einem Python-Quellverzeichnis?

9 Solutions collect form web for “Was ist __init__.py für?”

Es ist ein Teil eines Pakets. Hier ist die Dokumentation.

Die Dateien __init__.py sind erforderlich, um Python die Verzeichnisse als Pakete zu behandeln. Dies geschieht, um Verzeichnisse mit einem gemeinsamen Namen, wie z. B. string , zu verhindern, indem sie unbeabsichtigte Gültigkeitsmodelle, die später (tiefer) auf dem Modul-Suchpfad auftreten, ausblenden. Im einfachsten Fall kann __init__.py nur eine leere Datei sein, aber es kann auch Initialisierungscode für das Paket ausführen oder die Variable __all__ , die später beschrieben wird.

Dateien mit dem Namen __init__.py werden verwendet, um Verzeichnisse auf dem Datenträger als Python-Paketverzeichnisse zu markieren. Wenn du die Dateien hast

 mydir/spam/__init__.py mydir/spam/module.py 

Und mydir ist auf deinem mydir , du kannst den code in module.py als module.py

 import spam.module 

oder

 from spam import module 

Wenn Sie die Datei __init__.py entfernen, __init__.py Python nicht mehr nach Submodulen in diesem Verzeichnis, so dass Versuche, das Modul zu importieren, fehlschlagen.

Die Datei __init__.py ist in der Regel leer, kann aber verwendet werden, um ausgewählte Teile des Pakets unter bequemeren Namen zu exportieren, Bequemlichkeitsfunktionen zu halten usw. Bei dem obigen Beispiel kann auf den Inhalt des Init-Moduls zugegriffen werden

 import spam 

Auf der Grundlage dieser

Zusätzlich zur Beschriftung eines Verzeichnisses als Python-Paket und zur Definition __all__ __init__.py können Sie mit __init__.py eine beliebige Variable auf __init__.py definieren. So ist es oft bequem, wenn ein Paket etwas definiert, das häufig importiert wird, in einer API-ähnlichen Weise. Dieses Muster fördert die Einhaltung der Pythonischen "Flat ist besser als verschachtelte" Philosophie.

Ein Beispiel

Hier ist ein Beispiel aus einem meiner Projekte, in dem ich häufig einen sessionmaker namens Session importiere, um mit meiner Datenbank zu interagieren. Ich habe ein "Datenbank" -Paket mit ein paar Modulen geschrieben:

 database/ __init__.py schema.py insertions.py queries.py 

Mein __init__.py enthält den folgenden Code:

 import os from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine engine = create_engine(os.environ['DATABASE_URL']) Session = sessionmaker(bind=engine) 

Da ich hier Session definiere, kann ich eine neue Session mit der untenstehenden Syntax starten. Dieser Code wäre der gleiche aus dem Inneren oder außerhalb des "Datenbank" -Paket-Verzeichnisses ausgeführt.

 from database import Session session = Session() 

Natürlich ist das eine kleine Bequemlichkeit – die Alternative wäre, Session in einer neuen Datei wie "create_session.py" in meinem Datenbankpaket zu definieren und neue Sessions zu starten:

 from database.create_session import Session session = Session() 

Weiterlesen

Es gibt eine ziemlich interessante reddit Thread, die entsprechende Verwendungen von __init__.py hier:

http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/

Die Mehrheit Meinung scheint zu sein, dass __init__.py Dateien sollten sehr dünn, um zu vermeiden, verletzen die "explizite ist besser als implizite" Philosophie.

Die Datei __init__.py macht Python-Verzeichnisse, die sie als Module enthalten.

Darüber hinaus ist dies die erste Datei, die in ein Modul geladen werden soll, also können Sie es verwenden, um Code auszuführen, den Sie jedes Mal ausführen möchten, wenn ein Modul geladen wird, oder geben Sie die zu exportierenden Submodule an.

Es gibt 2 Hauptgründe für __init__.py

  1. Für die Bequemlichkeit: Die anderen Benutzer müssen die genaue Lage Ihrer Funktionen in Ihrer Pakethierarchie nicht kennen.

     your_package/ __init__.py file1.py/ file2.py/ ... fileN.py # in __init__.py from file1 import * from file2 import * ... from fileN import * # in file1.py def add(): pass 

    Dann können andere add () anrufen

     from your_package import add 

    Ohne zu wissen, file1, wie

     from your_package.file1 import add 
  2. Wenn du etwas initialisieren willst, Zum Beispiel Protokollierung (die in die oberste Ebene gestellt werden soll):

     import logging.config logging.config.dictConfig(Your_logging_config) 

In Python ist die Definition des Pakets sehr einfach. Wie Java sind die hierarchische Struktur und die Verzeichnisstruktur gleich. Aber du musst __init__.py in einem Paket haben. Ich werde die Datei __init__.py mit dem folgenden Beispiel erklären:

 package_x/ |-- __init__.py |-- subPackage_a/ |------ __init__.py |------ module_m1.py |-- subPackage_b/ |------ __init__.py |------ module_n1.py |------ module_n2.py |------ module_n3.py 

__init__.py kann leer sein, solange es existiert. Es bedeutet, dass das Verzeichnis als Paket betrachtet werden sollte. Natürlich kann __init__.py auch den entsprechenden Inhalt einstellen.

Wenn wir eine Funktion in module_n1 hinzufügen:

 def function_X(): print "function_X in module_n1" return 

Nach dem Rennen:

 >>>from package_x.subPackage_b.module_n1 import function_X >>>function_X() function_X in module_n1 

Dann folgten wir dem Hierarchiepaket und nannten module_n1 die Funktion. Wir können __init__.py in subPackage_b wie folgt verwenden:

 __all__ = ['module_n2', 'module_n3'] 

Nach dem Rennen:

 >>>from package_x.subPackage_b import * >>>module_n1.function_X() Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named module_n1 

Bei der Verwendung von * __init__.py , Modul-Paket unterliegt __init__.py Inhalt.

__init__.py behandelt das Verzeichnis, das es als __init__.py Modul enthält.

Für Leute, die lieber Code lesen, stelle ich den Kommentar von Two-Bit Alchemist hier.

 $ find /tmp/mydir/ /tmp/mydir/ /tmp/mydir//spam /tmp/mydir//spam/__init__.py /tmp/mydir//spam/module.py $ cd ~ $ python >>> import sys >>> sys.path.insert(0, '/tmp/mydir') >>> from spam import module >>> module.myfun(3) 9 >>> exit() $ $ rm /tmp/mydir/spam/__init__.py* $ $ python >>> import sys >>> sys.path.insert(0, '/tmp/mydir') >>> from spam import module Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named spam >>> 

Es erleichtert das Importieren anderer Python-Dateien. Wenn Sie diese Datei in ein Verzeichnis (sagen Sachen) mit anderen py-Dateien platziert, dann können Sie etwas wie import stuff.other tun.

 root\ stuff\ other.py morestuff\ another.py 

Ohne diese __init__.py innerhalb des Verzeichnis Zeug, konnte man nicht importieren other.py, weil Python nicht weiß, wo der Quellcode für Zeug ist und nicht in der Lage, es als Paket zu erkennen.

Seit Python 3.3 ist __init__.py nicht mehr erforderlich, um Verzeichnisse als importierbare Python-Pakete zu definieren.

Check PEP 420: Implizite Namespace-Pakete :

Native Unterstützung für Paketverzeichnisse, die keine __init__.py Marker-Dateien benötigen und automatisch mehrere __init__.py überspannen können (inspiriert von verschiedenen Drittanbieter-Ansätzen zu Namespace-Paketen, wie in PEP 420 beschrieben )

Hier ist der Test:

 $ mkdir -p /tmp/test_init $ touch /tmp/test_init/module.py /tmp/test_init/__init__.py $ tree -at /tmp/test_init /tmp/test_init ├── module.py └── __init__.py $ python3 >>> import sys >>> sys.path.insert(0, '/tmp') >>> from test_init import module >>> import test_init.module $ rm -f /tmp/test_init/__init__.py $ tree -at /tmp/test_init /tmp/test_init └── module.py $ python3 >>> import sys >>> sys.path.insert(0, '/tmp') >>> from test_init import module >>> import test_init.module 

Referenzen:
Englisch: http://www.tab.fzk.de/en/projekt/zusammenf…ng/ab117.htm
https://www.python.org/dev/peps/pep-0420/
Ist __init__.py nicht für Pakete in Python 3 erforderlich?

  • __package__ ist beim Import eines Python-Moduls keine
  • Aufrufbare Module
  • Python kann das installierte Modul `news` nicht sehen
  • Wie ändere ich einen Python-Modulnamen?
  • Gibt es irgendwelche Python Bluetooth Module für Windows 7 64 bit?
  • Python-Modul-Import - relative Pfade Problem
  • Wie greife ich von den anderen Modulen auf die Attribute des aktuellen Ausführungsmoduls zu?
  • Pyinstaller Activex Attribut Fehler mit wxPython
  • Python-Modulabhängigkeit
  • Wie finde ich den Standort der Python-Modulquellen?
  • Installiere das Python-Modul mit einer Zip-Datei
  • Python ist die beste Programmiersprache der Welt.