Niedawno zaktualizowałem wersje pylint , popularnego narzędzia sprawdzającego styl Python.
W całym moim kodzie stało się to balistyczne, wskazując miejsca, w których importuję moduły w tym samym pakiecie, bez określania pełnej ścieżki pakietu.
Nowy komunikat o błędzie to W0403.
W0403: Względny import% r powinien wynosić% r
Używane, gdy wykryty zostanie import w stosunku do katalogu pakietu.
Przykład
Na przykład, jeśli moje pakiety mają następującą strukturę:
/cake
/__init__.py
/icing.py
/sponge.py
/drink
a w pakiecie gąbek piszę:
import icing
zamiast
import cake.icing
Otrzymam ten błąd.
Chociaż rozumiem, że nie wszystkie wiadomości Pylint mają takie samo znaczenie i nie boję się ich odrzucić, nie rozumiem, dlaczego taka praktyka jest uważana za zły pomysł.
Miałem nadzieję, że ktoś może wyjaśnić pułapki, więc mógłbym poprawić swój styl kodowania zamiast (jak obecnie planuję) wyłączyć to pozornie fałszywe ostrzeżenie.
źródło
import .icing
zamiastfrom . import icing
from <> import
;import <>
jest zawsze absolutne. Oczywiście import bezwzględny można wykorzystaćfrom <> import
, pomijając wiodące kropki. Powódimport .foo
jest zabroniony, ponieważ po tymimport XXX.YYY.ZZZ
czasieXXX.YYY.ZZZ
można go użyć w wyrażeniu. Ale.moduleY
nie nadaje się do użycia w wyrażeniu.Istnieje kilka dobrych powodów:
Import względny łatwo się psuje, gdy przenosisz moduł.
Wyobraź sobie, że masz
foo.bar
, Afoo.baz
ibaz
moduł w swoim pakiecie.foo.bar
importujefoo.baz
, ale używając importu względnego.Teraz, jeśli były, aby przejść
foo.bar
dobar
, twój moduł nagle importuje innybaz
!Względny import jest niejednoznaczny. Nawet bez poruszania się po
bar
module w powyższym przykładzie nowy deweloper przychodzący do twojego projektu może zostać wybaczony za to, że nie zdaje sobie sprawy, żebaz
tak naprawdę jestfoo.baz
zamiast pakietu głównegobaz
.Bezwzględny import wyraźnie wskazuje, który moduł jest używany. I jak
import this
głosi kazanie, wyraźne jest lepsze niż dorozumiane.Python 3 całkowicie wyłączył import niejawny; importy są teraz zawsze interpretowane jako absolutne, co oznacza, że w powyższym przykładzie
import baz
zawsze będzie importował moduł najwyższego poziomu. Zamiast tego będziesz musiał użyć jawnej składni importu (from . import baz
).Przeniesienie przykładu z Pythona 2 do 3 doprowadziłoby zatem do nieoczekiwanych problemów, użycie importu absolutnego sprawi, że Twój kod będzie przyszłościowy.
źródło