Зависимости Python: объединение двух пакетов в один

У меня есть два пакета python A и B, которые я хотел бы объединить в A, то есть все функциональные возможности B теперь доступны в A.B. Раньше A-1.0 зависело от B-1.0. Теперь я хочу избежать, что у пользователей A-2.0 все еще есть B-1.0, и я не знаю, как правильно это обрабатывать.

Различные решения/идеи, с которыми я столкнулся:

  • Включите некоторый код в A-2.0, который пытается импортировать B, если создается ImportError, поймайте исключение и продолжайте, в противном случае установите RuntimeError, который B установлен параллельно

  • Как-то отмечаем B как блокировщик для A-2.0 ( это возможно?)

  • Создайте "поддельный" преемник для B, поэтому люди, которые обновляют свои виртуальные среды или устанавливают "последнюю" версию B, получают пустой пакет, который генерирует исключение при импорте.

Я приветствую ваше мнение и переживает

1 ответ

Думаю, ты не можешь! (по крайней мере, без использования таких трюков, как вы описали).

Пакетная система Python (насколько мне известно) не имеет такого понятия, как "разрешенные" пакеты. Может быть человек, который изобретает другой пакет C, который он называет B, но с совершенно другой функциональностью. Такое понятие запретит пользователям вашего пакета A использовать пакет C (псевдоним B).

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

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

В таком случае (и когда вам действительно нужно объединить пакеты - см. ниже), я бы рекомендовал вам сделать совершенно новое имя пакета, например "newA", чтобы подчеркнуть тот факт, что что-то коренным образом изменилось (и таким образом, смешение между старыми А и В также будет более вероятно обнаружено).

Но, конечно, я бы добавил аргумент msw, что вы сами создаете свою проблему. Обычно также лучше иметь меньшие пакеты (если они имеют разумный размер, конечно), а не более крупные пакеты "Я управляю миром". Вы можете комбинировать меньшие пакеты для разных приложений.

licensed under cc by-sa 3.0 with attribution.