Меня интересует предпочтительный способ импорта пакетов в приложение Python. У меня есть такая структура пакета:
project.app1.models
project.app1.views
project.app2.models
project.app1.views
импорт project.app1.models
и project.app2.models
. На ум приходят два способа сделать это.
С абсолютным импортом:
import A.A
import A.B.B
или с явным относительным импортом, как введено в Python 2.5 с PEP 328 :
# explicit relative
from .. import A
from . import B
Каков самый питонический способ сделать это?
python
package
python-import
Дэниел Хеппер
источник
источник
from _ import ...
, так что ваши примеры будутfrom .. import A
иfrom . import B
import ..A
наfrom .. import A
. Примечательно, что прошло всего 9 лет, прежде чем кто-то заметил;)Ответы:
Абсолютный импорт. Из PEP 8:
Явный относительный импорт - хорошая языковая функция (я думаю), но он далеко не такой явный, как абсолютный импорт. Более читаемая форма:
import A.A import A.B.B
особенно если вы импортируете несколько разных пространств имен. Если вы посмотрите на несколько хорошо написанных проектов / руководств, которые включают импорт из пакетов, они обычно следуют этому стилю.
Несколько дополнительных нажатий клавиш, которые вы сделаете более явными, сэкономят другим (и, возможно, вам) много времени в будущем, когда они попытаются выяснить ваше пространство имен (особенно, если вы переходите на 3.x, в котором некоторые из пакетов имена изменились).
источник
Относительный импорт 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
.Это ограничение следует учитывать при оценке наилучшего подхода. Гвидо в любом случае против запуска скриптов из модуля:
Исчерпывающие обсуждения по этому вопросу можно найти на SO; ре. Python 3 довольно обширен:
источник
import .baz
- это всего лишь одна из множества подобных ситуаций, описанных в PEP.Относительный импорт не только дает вам возможность переименовать свой пакет позже, не изменяя десятки внутренних операций импорта, но я также добился успеха с ними в решении определенных проблем, связанных с такими вещами, как циклический импорт или пакеты пространств имен, поскольку они не отправляют Python "обратно в систему". top ", чтобы заново начать поиск следующего модуля из пространства имен верхнего уровня.
источник
python setup.py install
илиpython setup.py develop
по какой- либо другой причине), в этих случаях я создаю исходный код и добавляю его как подмодуль git. Когда эти пакеты используют абсолютный импорт для своего собственного имени пакета, их импорт завершается ошибкой. Единственное решение - использовать явный относительный импорт. Я думаю, это следует поощрять.