Mein Paket hat folgende Struktur:
mobilescouter/
__init__.py #1
mapper/
__init__.py #2
lxml/
__init__.py #3
vehiclemapper.py
vehiclefeaturemapper.py
vehiclefeaturesetmapper.py
...
basemapper.py
vehicle/
__init__.py #4
vehicle.py
vehiclefeature.py
vehiclefeaturemapper.py
...
Ich bin nicht sicher, wie die __init__.py
Dateien richtig geschrieben werden sollen.
Das __init__.py #1
sieht aus wie:
__all__ = ['mapper', 'vehicle']
import mapper
import vehicle
Aber wie soll das zum Beispiel __init__.py #2
aussehen? Meins ist:
__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml
Wann sollte __all__
verwendet werden?
Antworten:
__all__
ist sehr gut - es hilft beim Importieren von Anweisungen, ohne Module automatisch zu importieren http://docs.python.org/tutorial/modules.html#importing-from-a-packageVerwenden
__all__
undimport *
ist nur redundant__all__
benötigtIch glaube , einer der stärksten Gründe für den Einsatz
import *
in einem__init__.py
zu Importpaket in der Lage sein , einen Skript Refactoring , die in mehrere Skripte , ohne zu brechen eine bestehende Anwendung gewachsen ist. Aber wenn Sie von Anfang an ein Paket entwerfen. Ich denke, es ist am besten,__init__.py
Dateien leer zu lassen.beispielsweise:
dann wächst die App und jetzt ist es ein ganzer Ordner
dann kann das init-Skript sagen
Damit ein Skript, das für Folgendes geschrieben wurde, während der Änderung nicht unterbrochen wird:
quelle
__all__
undimport *
ist redundant",__all__
wird vom Verbraucher des Moduls verwendet undfrom foo import *
wird vom Modul selbst verwendet, um andere zu verwenden ....using __all__ and import * is redundant, only __all__ is needed
Wie sind diese überflüssig? Sie machen verschiedene Dinge.Meine eigenen
__init__.py
Dateien sind meistens leer. Insbesondere habe ich nie einenfrom blah import *
Teil von__init__.py
- wenn "Importieren des Pakets" bedeutet, dass alle Arten von Klassen, Funktionen usw. direkt als Teil des Pakets definiert werden, würde ich stattdessen den Inhalt von lexikalischblah.py
in das Paket kopieren__init__.py
und entfernenblah.py
( Die Multiplikation von Quelldateien nützt hier nichts.Wenn Sie darauf bestehen, die
import *
Redewendungen (eek) zu unterstützen, kann die Verwendung__all__
(mit einer möglichst winzigen Liste von Namen, die Sie selbst verwenden können) zur Schadensbegrenzung hilfreich sein. Im Allgemeinen sind Namespaces und explizite Importe gute Dinge, und ich empfehle dringend, jeden Ansatz zu überdenken, der auf der systematischen Umgehung eines oder beider Konzepte basiert! -)quelle
import *
, müssen Sie bedingungslos das gesamte Framework akzeptieren, auch Funktionen, die Sie niemals verwenden werden. Wenn Sie__init__.py
leer bleiben, haben Sie mehr Chancen als nur Alles-oder-Nichts-Semantik. Denken Sie an verdreht.from mobilescouter import A, B
ist nur eine Codezeile und Sie haben kein Projekt mit 666 Klassen und jeder mit seiner eigenen Datei, oder? Wenn Sie zwei oder mehrimport *
in Ihrem Code haben, füllen Sie den Namespace mit potenziellem Müll und Sie werden schnell vergessen, woher SieA
kommen. Und wenn ein oberes Paket dasselbe tut? Sie greifen nach allen Unterpaketen und Unterunterpaketen. Wie der Zen von Python sagt, ist explizit besser als implizit.Sie
__init__.py
sollten einen Docstring haben .Obwohl alle Funktionen in Modulen und Unterpaketen implementiert sind, können Sie in Ihrem Paket docstring dokumentieren, wo Sie beginnen sollen. Betrachten Sie beispielsweise das Python-
email
Paket . Die Paketdokumentation ist eine Einführung, die den Zweck, den Hintergrund und die Zusammenarbeit der verschiedenen Komponenten im Paket beschreibt. Wenn Sie automatisch Dokumentation aus Docstrings mit Sphinx oder einem anderen Paket generieren, ist das Paket Docstring genau der richtige Ort, um eine solche Einführung zu beschreiben.Weitere Informationen finden Sie in den hervorragenden Antworten von Firecrow und Alex Martelli .
quelle
__init__.py
für dasemail
Paket dieser Richtlinie? Ich sehe eine einzeilige Dokumentzeichenfolge, die nicht viel dazu beiträgt, zu erklären, "wie die verschiedenen Komponenten im Paket zusammenarbeiten".