Правильный импорт модулей в Python
Как настроить импорт модулей, чтобы каждый модуль мог получить доступ к объектам всех остальных?
У меня есть приложение Python среднего размера с файлами модулей в разных подкаталогах. Я создал модули, которые присоединяют эти подкаталоги к sys.path
и импортирует группу модулей, используя import thisModule as tm
. Объекты модуля относятся к этой квалификации. Затем я импортирую этот модуль в другие с помощью from moduleImports import *
. Код сейчас неаккуратный и имеет несколько таких вещей, которые часто дублируют.
Во-первых, приложение терпит неудачу, поскольку некоторые ссылки на модули не назначены. Этот же код запускается при тестировании устройства.
Во-вторых, я беспокоюсь, что я вызываю проблему с рекурсивным импортом модулей. Импортирует модуль. Импорт импортирует thisModule, который импортирует модули.,.
Каков правильный способ сделать это?
Ответы
Ответ 1
"У меня есть приложение Python среднего размера с файлами модулей в разных подкаталогах.
Хорошо. Убедитесь, что каждая директория содержит файл __init__.py
, так что это пакет.
"Я создал модули, которые добавляют эти подкаталоги в sys.path
"
Bad. Используйте PYTHONPATH
или установите всю структуру Lib/site-packages
. Не обновляйте sys.path
динамически. Это плохо. Трудно управлять и поддерживать.
"импортирует группу модулей, используя import thisModule as tm
."
Не имеет смысла. Возможно, у вас есть один import thisModule as tm
для каждого модуля в вашей структуре. Это типичная стандартная практика: импортируйте только нужные вам модули, а другие нет.
"Затем я импортирую этот модуль в другие с помощью from moduleImports import *
"
Bad. Не используйте для печати кучу случайных материалов.
Каждый модуль должен иметь длинный список конкретных вещей, в которых он нуждается.
import this
import that
import package.module
Явный список. Никакой магии. Нет динамического изменения на sys.path
.
В моем текущем проекте есть 100 модулей, дюжина или около того пакетов. Каждый модуль импортирует именно то, что ему нужно. Никакой магии.
Ответ 2
Несколько указателей
-
Возможно, вы уже разделились
функциональность в различных модулях. Если
правильно сделано большую часть времени, когда вы
не попадет в круглый импорт
проблемы (например, если модуль a зависит
на b и b на a вы можете сделать третий
модуль c для удаления такого кругового
зависимость). В крайнем случае, в
import b, но в b import a на
точка, где требуется, например. внутри
функция.
-
Как только функциональность
модули группируют их в пакетах под
subdir и добавить файл __init__.py
для этого, чтобы вы могли импортировать
пакет. Храните такие
папке, например. lib, а затем либо добавить
sys.path или установить PYTHONPATH env
переменная
-
из импорта модуля * может не
быть хорошей идеей. Вместо этого импортируйте все
необходим. Он может быть полностью квалифицирован. Это
не больно быть многословным. например
от pakageA.moduleB импорт
CoolClass.
Ответ 3
Способ сделать это - избежать магии. Другими словами, если ваш модуль требует что-то из другого модуля, он должен явно импортировать его. Вы не должны полагаться на то, что импортируется автоматически.
Как имеет Zen Python (import this
), явное лучше, чем неявное.
Ответ 4
Вы не получите рекурсию по импорту, потому что Python кэширует каждый модуль и не перезагружает тот, который у него уже есть.