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

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

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

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

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

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

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

foo.py
1
2
3
import foo.bar

...

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

foo/bar.py
1
2
3
import foo

...

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

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

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

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

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

Comments