Was ist __init__.py
für in einem Python-Quellverzeichnis?
Meinen Sie nicht from util import check_schema
da Sie dies bereits in __init __.py getan haben from util import *
Was ist __init__.py
für in einem Python-Quellverzeichnis?
Eine __init__.py
Datei macht Importe einfach. Wenn eine __init__.py
in einem Paket vorhanden ist, die Funktion a()
kann aus einer Datei importiert werden b.py
etwa so:
from b import a
Ohne sie können Sie jedoch nicht direkt importieren. Sie müssen den Systempfad ändern:
import sys
sys.path.insert(0, 'path/to/b.py')
from b import a
Eine Sache, die __init__.py ermöglicht, ist die Umwandlung eines Moduls in ein Paket, ohne die API zu brechen oder fremde verschachtelte Namespaces oder private Module* zu erstellen. Dies hilft, wenn ich einen Namespace erweitern möchte.
Wenn ich eine Datei util.py habe, die
def foo():
...
dann werden die Nutzer auf foo
mit
from util import foo
Wenn ich dann Dienstprogramme für die Interaktion mit der Datenbank hinzufügen möchte, und ich möchte, dass sie ihren eigenen Namespace unter util
benötige ich ein neues Verzeichnis**, und um die API-Kompatibilität zu wahren (so dass die from util import foo
noch funktioniert), werde ich es util/ nennen. I könnte Verschieben Sie util.py nach util/ wie folgt,
util/
__init__.py
util.py
db.py
und in util/__init__.py do
from util import *
aber das ist überflüssig. Anstatt eine util/util.py Datei zu haben, können wir einfach den Inhalt von util.py in __init__.py einfügen und der Benutzer kann nun
from util import foo
from util.db import check_schema
Ich denke, dies zeigt sehr schön, wie ein util
Die Datei __init__.py des Pakets funktioniert ähnlich wie eine util
Modul
* Dies wird in den anderen Antworten angedeutet, aber ich möchte es hier hervorheben
** kurz vor der Anwendung von Importgymnastik. Beachten Sie, dass es nicht funktionieren wird, ein neues Paket mit demselben Namen wie die Datei zu erstellen, siehe ce
Meinen Sie nicht from util import check_schema
da Sie dies bereits in __init __.py getan haben from util import *
init .py : Es handelt sich um eine Python-Datei in einem Paketverzeichnis, die aufgerufen wird, wenn das Paket oder ein Modul des Pakets importiert wird. Sie können diese Datei verwenden, um den Paketinitialisierungscode auszuführen, d.h. wenn das Paket importiert wird, werden die Python-Anweisungen zuerst ausgeführt, bevor die anderen Module in diesem Ordner ausgeführt werden. Sie ist ähnlich wie die Hauptfunktion eines C- oder Java-Programms, aber sie befindet sich im Python-Paketmodul(-Ordner) und nicht in der Kern-Python-Datei. Außerdem hat sie Zugriff auf globale Variablen, die in diesem init .py-Datei, wenn das Modul in die Python-Datei importiert wird.
zum Beispiel. Ich habe eine init .py Datei in einem Ordner namens pymodlib, diese Datei enthält die folgenden Anweisungen:
print(f'Aufrufen init .py für { Name }') pystructures = ['for_loop', 'while__loop', 'ifCondition']
wenn ich dieses Paket "pymodlib" in meinem Lösungsmodul oder Notebook oder Python-Konsole importiere: Diese zwei Anweisungen werden beim Importieren ausgeführt. Im Log oder in der Konsole würden Sie also die folgende Ausgabe sehen:
pymodlib importieren Aufrufen von init .py für pymodlib
in der nächsten Anweisung der Python-Konsole: Ich kann auf die globale Variable zugreifen:
pymodlib.pystructures gibt es die folgende Ausgabe:
['for_loop', 'while__loop', 'ifCondition']
Ab Python 3.3 ist die Verwendung dieser Datei optional, um den Ordner zu einem Python-Modul zu machen. Sie müssen sie also nicht mehr in den Python-Modulordner aufnehmen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
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").