3676 Stimmen

Wofür ist __init__.py da?

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

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.

19voto

Alec Punkte 7040

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

7voto

joel Punkte 4587

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

0 Stimmen

Meinen Sie nicht from util import check_schema da Sie dies bereits in __init __.py getan haben from util import *

0 Stimmen

@Mark nein, from util import * wäre in util/__init__.py und würde daher nicht importieren db würde es den Inhalt von util/util.py importieren. Ich werde die Antwort verdeutlichen

0voto

jayprakash Punkte 11

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.com

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.

Powered by:

X