Подтвердить что ты не робот

Лучшая практика повторного использования кода python

Я написал приложение библиотеки python (которое содержит несколько файлов *.py). И некоторые из моих проектов python должны повторно использовать код в приложении библиотеки. Какая рекомендуемая передовая практика для повторного использования кода python? В настоящее время я продумал три варианта:

  • Скопируйте и вставьте. Это далеко от лучшей практики. Он нарушает Сухой принцип. (Не повторяйте себя.)
  • Добавьте папку приложения библиотеки в переменную окружения PYTHONPATH: export PYTHONPATH=/path/to/library/app. Затем каждый проект на одном компьютере может ссылаться на код в приложении библиотеки.
  • И папка приложения библиотеки в sys.path в коде python: sys.path.append('/path/to/library/app')

Среди трех вариантов, которые вы предпочитаете? Какое преимущество оно имеет по сравнению с двумя другими вариантами? У вас есть другие лучшие варианты? Очень ценно, что если кто-то с годами опыта развития питона мог бы ответить на этот вопрос.

4b9b3361

Ответ 1

Позвольте мне предложить четвертую альтернативу: найдите время, чтобы узнать, как упаковать свою библиотеку и установить ее в своих сайтах; это легче, чем можно подумать, и я убежден, что это хорошо потрачено. Это очень хорошая отправная точка: https://packaging.python.org/en/latest/

Ответ 2

Из ваших трех вариантов, PYTHONPATH - это путь. Копирование и вставка явно отсутствуют, и добавление кода в ваши другие проекты для изменения sys.path просто загрязняет эти файлы знаниями об их среде.

Четвертый вариант: создать настоящий устанавливаемый пакет из вашего общего кода и установить его в свою установку на Python. Затем вы можете просто импортировать эти модули, как любой другой сторонний установочный код.

Ответ 3

Если это общая библиотека, вы должны ее упаковать и добавить в пакеты сайта, и тогда вам не придется беспокоиться о настройке чего-либо. Это лучший вариант.


Если вы не хотите использовать сайт-пакеты, используйте PYTHONPATH. Почему он существует, и это способ делать то, что вы хотите.


Возможно, вы захотите изучить site.addsitedir, path.append не предотвращает дублирование. Это также позволит вам использовать файлы .pth.

Динамическая настройка/добавление вещей в PYTHONPATH через sys.path приводит к такому же результату, но может усложнить ситуацию, если вы решите повторно использовать новую библиотеку. Это также вызывает проблемы, если ваши пути меняются, вам нужно изменить код по сравнению с переменной окружения. Если это не является полностью необходимым, вы не должны динамически настраивать свой путь python.


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

Ответ 4

Первый способ, как вы отметили, вряд ли приемлемо, поскольку он бесчисленных известных проблем.

У двух других есть свои проблемы. Во-первых, они требуют ручной работы при перемещении файлов (особенно плохо, если вы смешиваете его с логикой приложения, то есть помещаете его в *.py файлы вместо того, чтобы оставлять его на компьютере, на котором он выполняется) и требуют либо фиксированных мест установки (абсолютные пути ) или, по крайней мере, определенную структуру каталогов (относительные пути). ИМХО, эти способы приемлемы только в том случае, если приложения никогда не будут перемещаться нигде. Как только это станет необходимо, вы должны отказаться и использовать существующее решение в качестве единственной причины, чтобы не использовать его, будучи чрезмерным для небольших и локальных скриптов, больше не применяется:

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