Относительный импорт Python больше не рекомендуется, но в этом случае настоятельно рекомендуется использовать absolute_import.
Пожалуйста, смотрите это обсуждение , ссылаясь на самого Гвидо:
"Разве это в основном не исторически? До нового синтаксиса относительного импорта
были реализованы различные проблемы с относительным импортом.
краткосрочным решением было рекомендовать не использовать их. Долгосрочный
Решение заключалось в реализации однозначного синтаксиса. Теперь пришло время
снять антирекоменду Конечно, не выходя за борт
- Я все еще нахожу их приобретенным вкусом; но у них есть свое место. "
ОП правильно связывает 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 это довольно всеобъемлющий: