Ich habe kürzlich Versionen von Pylint aktualisiert , einem beliebten Python-Stilprüfer.
Es ist in meinem gesamten Code ballistisch und zeigt Stellen auf, an denen ich Module in dasselbe Paket importiere, ohne den vollständigen Paketpfad anzugeben.
Die neue Fehlermeldung lautet W0403.
W0403: Der relative Import% r sollte% r sein
Wird verwendet, wenn ein Import relativ zum Paketverzeichnis erkannt wird.
Beispiel
Zum Beispiel, wenn meine Pakete so aufgebaut sind:
/cake
/__init__.py
/icing.py
/sponge.py
/drink
und in der Schwammpackung schreibe ich:
import icing
Anstatt von
import cake.icing
Ich werde diesen Fehler bekommen.
Obwohl ich verstehe, dass nicht alle Pylint-Nachrichten gleich wichtig sind und ich keine Angst habe, sie zu verwerfen, verstehe ich nicht, warum eine solche Praxis als schlechte Idee angesehen wird.
Ich hatte gehofft, jemand könnte die Fallstricke erklären, damit ich meinen Codierungsstil verbessern könnte, anstatt (wie ich derzeit vorhabe) diese scheinbar unechte Warnung auszuschalten.
quelle
import .icing
anstelle vonfrom . import icing
from <> import
.import <>
ist immer absolut. Natürlich können absolute Importe verwendetfrom <> import
werden, indem die führenden Punkte weggelassen werden. Der Grundimport .foo
ist verboten, weilimport XXX.YYY.ZZZ
danachXXX.YYY.ZZZ
in einem Ausdruck verwendet werden kann. Ist.moduleY
aber in einem Ausdruck nicht verwendbar.Es gibt ein paar gute Gründe:
Relative Importe brechen leicht ab, wenn Sie ein Modul verschieben.
Stellen Sie sich vor, Sie haben ein
foo.bar
, einfoo.baz
und einbaz
Modul in Ihrem Paket.foo.bar
Importefoo.baz
, aber mit einem relativen Import.Nun, wenn Sie sich zu bewegen waren
foo.bar
zubar
, Ihr Modul plötzlich importiert eine anderebaz
!Relative Importe sind nicht eindeutig. Selbst
bar
wenn Sie sich im obigen Beispiel nicht durch das Modul bewegen , könnte es einem neuen Entwickler, der zu Ihrem Projekt kommt, verzeihen, dass er nicht weiß, dassbaz
es sich tatsächlich um ein Paket auffoo.baz
Root-Ebene handeltbaz
.Absolute Importe machen deutlich, welches Modul verwendet wird. Und als
import this
Prediger ist explizit besser als implizit.Python 3 hat implizite relative Importe insgesamt deaktiviert. Importe werden jetzt immer als absolut interpretiert, was bedeutet, dass im obigen Beispiel
import baz
immer das Modul der obersten Ebene importiert wird. Sie müssen stattdessen die explizite Importsyntax verwenden (from . import baz
).Die Portierung des Beispiels von Python 2 auf 3 würde daher zu unerwarteten Problemen führen. Wenn Sie jetzt absolute Importe verwenden, ist Ihr Code zukunftssicher.
quelle