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:
"Ist das nicht größtenteils historisch? Bis zur Implementierung der neuen Relativimportsyntax gab es verschiedene Probleme mit Relativimporten. Die kurzfristige Lösung bestand darin, zu empfehlen, sie nicht zu verwenden. Die langfristige Lösung bestand darin, eine eindeutige Syntax zu implementieren. Jetzt Es ist Zeit, die Anti-Empfehlung zurückzuziehen. Natürlich, ohne über Bord zu gehen - ich finde sie immer noch einen erworbenen Geschmack; aber sie haben ihren Platz. "
Das OP verbindet den PEP 328 korrekt mit der Aufschrift :
Es wurden mehrere Anwendungsfälle vorgestellt, von denen der wichtigste darin besteht, die Struktur großer Pakete neu zu ordnen, ohne Unterpakete bearbeiten zu müssen. Darüber hinaus kann sich ein Modul in einem Paket ohne relative Importe nicht einfach selbst importieren.
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:
from __future__ import absolute_import
In diesem Fall ist ein impliziter relativer Import nicht mehr möglich (z. import localfile
funktioniert er nicht mehr from . 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:
Ich bin -1 in diesem und in jedem anderen vorgeschlagenen Twiddling der __main__ -Maschinerie. Der einzige Anwendungsfall scheint darin zu bestehen, Skripte auszuführen, die sich zufällig im Verzeichnis eines Moduls befinden, das ich immer als Antimuster gesehen habe. Um mich dazu zu bringen, meine Meinung zu ändern, müsstest du mich davon überzeugen, dass es nicht so ist.
Ausführliche Diskussionen zu diesem Thema finden Sie auf SO; Re. Python 3 ist dies ziemlich umfassend:
from _ import ...
, also wären Ihre Beispielefrom .. import A
undfrom . import B