Подтвердить что ты не робот

Когда использовать абсолютный импорт

Я меняю кучу старого кода на Python, который иногда запускается в коллизии имен между пакетами. У меня вопрос о том, когда следует использовать абсолютный импорт и будет ли он правильным импортировать модули только одного уровня по имени.

/package/
/package/__init__.py
/package/subA
/package/subA/__init__.py
/package/subA/moduleA.py
/package/subA/moduleB.py
/package/subB
/package/subB/__init__.py
/package/subB/moduleA.py
/package/subB/moduleB.py

Должен ли каждый оператор импорта в пакете выглядеть следующим образом:

import package.subX.moduleX

или

from package.subX import moduleX

Как насчет в файлах подпакета __init__.py. Было бы неправильно просто поставить

import moduleA
import moduleB

Или, в /package/subA/moduleA.py, было бы неправильно просто поставить:

import moduleB
4b9b3361

Ответ 1

Относительный импорт оказался очень плохой идеей, хотя долгое время они были по умолчанию. Вы можете найти немало вопросов на этом сайте, где кто-то просто назвал их файл после встроенного модуля и сломал их приложение со странными сообщениями об ошибках.

Вот почему всегда полезно делать абсолютный импорт, ссылаясь на ваш проект повсюду, включая пакеты.

Короче говоря, используйте этот стиль:

import myproject.mypackage
from myproject.mypackage.myfile import MyClass

Цитата из PEP8:

Относительный импорт для внутрипакетных импортных поставок не рекомендуется. Всегда используйте абсолютный путь пакета для всех импорта. Даже сейчас, когда PEP 328 полностью реализован в Python 2.5, его стиль явного относительного импорта активно обескуражен; абсолютный импорт более переносимый и обычно более читаемый.