Зависимости внутри пакета в python

Что за прелесть эти ваши сказочки..

Питон чудо как хорош, когда дело касается скорости исполнения.
Простые программы из одного-двух классов исполняются, да и пишутся на нём быстро,
а иногда даже очень быстро.

Но вот как только тебе захочется сделать так, чтобы классы были разложены по файлам,
и начнёшь подтягивать зависимости из файла в файл при помощи import, можно садиться
в угол, брать попкорн и расплываться в чеширской, практически сардонической улыбке.

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

Тем не менее, способ справиться с “кошмарным ужасом” зависимостей есть.

Первое что надо запомнить:

foo.py
import foo.bar

...

Если вы делаете так, готовьтесь к неприятностям. Т.е. циклические зависимости,
переходящие в невозможность подгрузить какой-нибудь класс.
Происходит это не только потому, что модуль верхнего уровня может где-нибудь
понадобиться, сколько потому, что импортируя где-нибудь модуль foo.pee, вы
автоматически требуете, чтобы питон проимпортировал модуль foo. Проще говоря,
импортируем зависимости без напряжения - в модулях более нижнего уровня
из модулей более верхнего:

foo/bar.py
import foo

...

и, с осторожностью, чтобы не зациклить импорты, зависимости между модулями
под модулями foo.bar и foo.baz.

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

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

В следующих сериях (если дойдут руки):

  • Как и чем тестировать в python
  • Как сделать пакет, чтобы поставить на другой машине через pip?