Wofür ist __init__.py da?

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

Lösung

Früher war es ein erforderlicher Teil eines Pakets ([altes, vor 3.3 "reguläres Paket"] (https://docs.python.org/3/reference/import.html#regular-packages), nicht [neueres 3.3+ "Namensraumpaket"] (https://docs.python.org/3/reference/import.html#namespace-packages)).

Hier ist die Dokumentation

Python definiert zwei Arten von Paketen, reguläre Pakete und Namespace-Pakete. Reguläre Pakete sind traditionelle Pakete, wie sie in Python 3.2 und früher existierten. Ein reguläres Paket ist typischerweise als ein Verzeichnis implementiert, das eine __init__.py-Datei enthält. Wenn ein reguläres Paket importiert wird, wird diese __init__.py Datei implizit ausgeführt, und die darin definierten Objekte werden an Namen im Namensraum des Pakets gebunden. Die Datei __init__.py kann den gleichen Python-Code enthalten wie jedes andere Modul auch, und Python fügt dem Modul einige zusätzliche Attribute hinzu, wenn es importiert wird.

Aber klicken Sie einfach auf den Link, er enthält ein Beispiel, mehr Informationen und eine Erklärung von Namespace-Paketen, der Art von Paketen ohne __init__.py.

Kommentare (20)

Die Datei __init__.py sorgt dafür, dass Python Verzeichnisse, die sie enthalten, als Module behandelt.

Außerdem ist dies die erste Datei, die in einem Modul geladen wird, so dass Sie sie verwenden können, um Code auszuführen, der jedes Mal ausgeführt werden soll, wenn ein Modul geladen wird, oder um die Untermodule anzugeben, die exportiert werden sollen.

Kommentare (0)

Sie erleichtert das Importieren anderer Python-Dateien. Wenn Sie diese Datei in einem Verzeichnis (z.B. stuff) platzieren, das andere py-Dateien enthält, dann können Sie so etwas wie import stuff.other machen.

root\
    stuff\
         other.py

    morestuff\
         another.py

Ohne diese __init__.py innerhalb des Verzeichnisses stuff, könnte man other.py nicht importieren, weil Python nicht weiß, wo der Quellcode von stuff ist und es nicht als Paket erkennen kann.

Kommentare (1)