Відносне імпортування 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
.
Це обмеження слід враховувати при оцінці найкращого підходу. У будь-якому випадку Guido проти запуску скриптів з модуля:
Я -1 на цьому та на будь-яких інших запропонованих поворотах машини __main__. Здається, єдиним варіантом використання є запуск сценаріїв, які, здається, живуть всередині каталогу модуля, який я завжди сприймав як антишаблон. Щоб я передумав, вам довелося б переконати мене, що це не так.
Вичерпні дискусії з цього приводу можна знайти на SO; повторно Python 3 це досить вичерпно:
from _ import ...
, щоб ваші приклади були бfrom .. import A
іfrom . import B