Neben der Kennzeichnung eines Verzeichnisses als Python-Paket und der Definition von __all__
, __init__.py
ermöglicht es Ihnen, jede Variable auf Paketebene zu definieren. Dies ist oft praktisch, wenn ein Paket etwas definiert, das häufig importiert wird, ähnlich wie eine API. Dieses Muster fördert die Einhaltung der Pythonic "flach ist besser als verschachtelt" Philosophie.
Ein Beispiel
Hier ein Beispiel aus einem meiner Projekte, bei dem ich häufig eine sessionmaker
genannt. Session
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
Meine __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 definiere Session
Hier kann ich eine neue Sitzung mit der folgenden Syntax starten. Dieser Code würde sowohl innerhalb als auch außerhalb des Paketverzeichnisses "database" ausgeführt werden.
from database import Session
session = Session()
Natürlich ist dies eine kleine Erleichterung - die Alternative wäre die Definition von Session
in einer neuen Datei wie "create_session.py" in meinem Datenbankpaket, und starten Sie neue Sitzungen mit:
from database.create_session import Session
session = Session()
Weitere Lektüre
Es gibt einen ziemlich interessanten reddit-Thread über die angemessene Verwendung von __init__.py
hier:
http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/
Die Mehrheitsmeinung scheint zu sein, dass __init__.py
Dateien sollten sehr dünn sein, um nicht gegen die Philosophie "explizit ist besser als implizit" zu verstoßen.
36 Stimmen
Gemäß dem unten stehenden Kommentar von @Rob_before_edits und dieser Stackoverflow-Thread 37139786 scheint es, dass init .py wird für Python 3.3+ nicht mehr benötigt.
24 Stimmen
Paket ohne
__init__
es Namensraum Paket , nicht ein normales Paket . Das ist nicht dasselbe wie @methane mit hier ein Beispiel .4 Stimmen
@Rainning Ein Namespace-Paket unterscheidet sich nicht grundlegend von einem normalen Paket. Es ist nur eine andere Art, Pakete zu erstellen. Sobald ein Namespace-Paket erstellt ist, gibt es keinen funktionalen Unterschied mehr zwischen ihm und einem regulären Paket.
1 Stimmen
Die offiziellen Dokumente enthalten eine Reihe von Artikeln, in denen die Verwendung des Begriffs erklärt wird, und sie definieren auch jeden Begriff genau.
4 Stimmen
@Rainning vielleicht haben Sie nicht bemerkt, dass die Erklärung, die ich oben hinzugefügt habe, wortwörtlich von pep420 stammt
1 Stimmen
@Jun711: Haben Sie den Link gelesen, den ich angegeben habe? Womit ich nicht einverstanden bin, ist ein Kommentar, der hoch gevotet wurde, aber eigentlich falsch ist. Du empfiehlst Leuten, die Python lernen, zu denken, dass
__init__.py
war nutzlos und kann vollständig ignoriert werden (Sie sagten "nicht mehr benötigt").