Ich frage mich, wie Pakete in eine Python-Anwendung bevorzugt importiert werden können. Ich habe eine Paketstruktur wie diese:
project.app1.models
project.app1.views
project.app2.models
project.app1.views
Importe project.app1.models
und project.app2.models
. Es gibt zwei Möglichkeiten, dies zu tun, die mir in den Sinn kommen.
Mit absoluten Importen:
import A.A
import A.B.B
oder mit expliziten relativen Importen, wie in Python 2.5 mit PEP 328 eingeführt :
# explicit relative
from .. import A
from . import B
Was ist der pythonischste Weg, dies zu tun?
python
package
python-import
Daniel Hepper
quelle
quelle
from _ import ...
, also wären Ihre Beispielefrom .. import A
undfrom . import B
import ..A
auf aktualisiertfrom .. import A
. Bemerkenswert, dass es nur 9 Jahre dauerte, bis es jemand bemerkte;)Antworten:
Absolute Importe. Aus PEP 8:
Explizite relative Importe sind eine nette Sprachfunktion (denke ich), aber sie sind bei weitem nicht so explizit wie absolute Importe. Die besser lesbare Form ist:
vor allem, wenn Sie mehrere verschiedene Namespaces importieren. Wenn Sie sich einige gut geschriebene Projekte / Tutorials ansehen, die Importe aus Paketen enthalten, folgen sie normalerweise diesem Stil.
Die wenigen zusätzlichen Tastenanschläge, die Sie verwenden, um expliziter zu werden, sparen anderen (und möglicherweise Ihnen) in Zukunft viel Zeit, wenn sie versuchen, Ihren Namespace herauszufinden (insbesondere, wenn Sie auf 3.x migrieren, in dem ein Teil des Pakets enthalten ist) Namen haben sich geändert).
quelle
Von relativen Python-Importen wird nicht mehr dringend abgeraten. In diesem Fall wird jedoch die Verwendung von absolute_import dringend empfohlen.
Bitte sehen Sie diese Diskussion unter Berufung auf Guido selbst:
Das OP verbindet den PEP 328 korrekt mit der Aufschrift :
Siehe auch fast doppelte Frage Wann oder warum relative Importe in Python verwendet werden sollen
Natürlich ist es immer noch Geschmackssache. Es ist zwar einfacher, Code mit relativen Importen zu verschieben, dies kann jedoch auch zu unerwarteten Problemen führen. und das Umbenennen der Importe ist nicht so schwierig.
Um das neue Verhalten von PEP 328 zu erzwingen, verwenden Sie:
In diesem Fall ist ein impliziter relativer Import nicht mehr möglich (z.
import localfile
funktioniert er nicht mehrfrom . import localfile
). Für ein sauberes und zukunftssicheres Verhalten ist die Verwendung von absolute_import ratsam.Eine wichtige Einschränkung ist die wegen PEP 338 und PEP 366 für relative Importe die Python-Datei als Modul importiert werden muss. Sie können keine Datei.py ausführen, die einen relativen Import hat, oder Sie erhalten eine
ValueError: Attempted relative import in non-package
.Diese Einschränkung sollte bei der Bewertung des besten Ansatzes berücksichtigt werden. Guido ist auf jeden Fall gegen das Ausführen von Skripten aus einem Modul:
Ausführliche Diskussionen zu diesem Thema finden Sie auf SO; Re. Python 3 ist dies ziemlich umfassend:
quelle
import .baz
- Dies ist jedoch nur eine Vereinfachung vieler ähnlicher Situationen, die im PEP beschrieben sind.Relative Importe ermöglichen es Ihnen nicht nur, Ihr Paket später umzubenennen, ohne Dutzende interner Importe zu ändern, sondern ich habe auch Erfolg damit gehabt, bestimmte Probleme zu lösen, die z. B. zirkuläre Importe oder Namespace-Pakete betreffen, da sie Python nicht zurück an die senden top ", um die Suche nach dem nächsten Modul erneut über den Namespace der obersten Ebene zu starten.
quelle
python setup.py install
oderpython setup.py develop
aus welchem Grund auch immer). In diesen Fällen gable ich den Quellcode und füge ihn als Git-Submodul hinzu. Wenn diese Pakete absolute Importe für ihren eigenen Paketnamen verwenden, schlagen ihre Importe fehl. Die einzige Lösung besteht darin, explizite relative Importe zu verwenden. Das sollte meiner Meinung nach gefördert werden.