Względne importowanie w Pythonie nie jest już zdecydowanie odradzane, ale w takim przypadku zdecydowanie zaleca się użycie bezwzględnego importu.
Zobacz tę dyskusję, cytując samego Guido:
„Czy to nie jest w większości historyczne? Do czasu wprowadzenia nowej składni importu względnego istniały różne problemy z importem względnym. Krótkoterminowym rozwiązaniem było zalecenie ich niestosowania. Długoterminowym rozwiązaniem było zaimplementowanie jednoznacznej składni. Teraz nadszedł czas, aby wycofać anty-zalecenie. Oczywiście, nie przesadzając - nadal uważam je za nabyte, ale mają swoje miejsce ”.
OP poprawnie łączy PEP 328, który mówi:
Zaprezentowano kilka przypadków użycia, z których najważniejszym jest możliwość zmiany struktury dużych pakietów bez konieczności edytowania pakietów podrzędnych. Ponadto moduł wewnątrz pakietu nie może łatwo zaimportować się bez importu względnego.
Zobacz także prawie zduplikowane pytanie Kiedy i dlaczego używać importu względnego w Pythonie
Oczywiście nadal pozostaje kwestią gustu. Chociaż łatwiej jest przenosić kod za pomocą względnych importów, może to również nieoczekiwanie zepsuć wszystko; a zmiana nazwy importu nie jest taka trudna.
Aby wymusić nowe zachowanie z PEP 328, użyj:
from __future__ import absolute_import
W takim przypadku niejawny import względny nie będzie już możliwy (np. import localfile
Nie będzie już działać, tylko from . import localfile
). Aby zachować czyste i odporne na przyszłość zachowanie, zaleca się korzystanie z bezwzględnego importu.
Ważnym zastrzeżeniem jest to, że ze względu na PEP 338 i PEP 366 , import względny wymaga, aby plik Pythona został zaimportowany jako moduł - nie można wykonać pliku file.py, który ma import względny, w przeciwnym razie otrzymasz plik ValueError: Attempted relative import in non-package
.
To ograniczenie należy wziąć pod uwagę przy ocenie najlepszego podejścia. Guido jest przeciwny uruchamianiu skryptów z modułu w każdym przypadku:
Jestem -1 w tej i wszystkich innych proponowanych twiddlach maszyny __main__. Jedynym przypadkiem użycia wydaje się być uruchamianie skryptów, które znajdują się w katalogu modułu, co zawsze postrzegałem jako anty-wzór. Żeby zmienić zdanie, musiałbyś mnie przekonać, że tak nie jest.
Wyczerpujące dyskusje na ten temat można znaleźć na SO; re. Python 3 to dość obszerne:
from _ import ...
, dzięki czemu byłyby przykładyfrom .. import A
ifrom . import B