Относительный импорт Python больше не рекомендуется, но в этом случае настоятельно рекомендуется использовать absolute_import.
См. Это обсуждение со ссылкой на самого Гвидо:
«Разве это не в основном историческое? Пока не был реализован новый синтаксис относительного импорта, были различные проблемы с относительным импортом. Краткосрочным решением было рекомендовать не использовать их. Долгосрочным решением было внедрение однозначного синтаксиса. Теперь пора отозвать антирекомендацию. Конечно, не переусердствуйте - я все еще нахожу их приобретенным вкусом; но у них есть свое место ».
OP правильно связывает PEP 328, в котором говорится:
Было представлено несколько вариантов использования, наиболее важным из которых является возможность изменить структуру больших пакетов без необходимости редактировать подпакеты. Кроме того, модуль внутри пакета не может легко импортировать себя без относительного импорта.
Также см. Почти повторяющийся вопрос Когда и зачем использовать относительный импорт в Python
Конечно, это дело вкуса. Хотя легче перемещать код с помощью относительного импорта, это также может неожиданно что-то сломать; и переименовать импорт не так уж и сложно.
Чтобы принудительно изменить поведение PEP 328, используйте:
from __future__ import absolute_import
В этом случае неявный относительный импорт больше не будет возможен (например, import localfile
больше не будет работать, только from . import localfile
). Для чистого и перспективного поведения рекомендуется использовать absolute_import.
Важное предостережение заключается в том, что из-за PEP 338 и PEP 366 относительный импорт требует, чтобы файл python был импортирован как модуль - вы не можете выполнить file.py с относительным импортом, иначе вы получите файл ValueError: Attempted relative import in non-package
.
Это ограничение следует учитывать при оценке наилучшего подхода. Гвидо в любом случае против запуска скриптов из модуля:
Я -1 по этому поводу и по поводу любых других предлагаемых вариантов механизма __main__. Единственный вариант использования - запуск сценариев, которые находятся внутри каталога модуля, что я всегда считал антипаттерном. Чтобы заставить меня изменить свое мнение, вам нужно убедить меня, что это не так.
Исчерпывающие обсуждения по этому вопросу можно найти на SO; ре. Python 3 довольно обширен:
from _ import ...
, так что ваши примеры будутfrom .. import A
иfrom . import B