Правильный импорт модулей в 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 кэширует каждый модуль и не перезагружает тот, который у него уже есть.