Вопрос

Предположим, я разработал универсальную утилиту для конечного пользователя, написанную на Python. Ранее у меня была только одна доступная версия, которая подходила для Python позже, чем версия 2.3 или около того. Достаточно было сказать, & Quot; загрузите Python, если вам нужно, а затем запустите этот скрипт & Quot ;. Была только одна версия скрипта в системе контроля версий (я использую Git) для отслеживания.

В Python 3 это уже не обязательно так. В обозримом будущем мне нужно будет одновременно разработать две разные версии: одну, подходящую для Python 2.x, и другую, подходящую для Python 3.x. С точки зрения развития, я могу придумать несколько вариантов:

<Ол>
  • Поддерживайте два разных скрипта в одной ветке, улучшая оба одновременно.
  • Поддерживайте две отдельные ветви и объединяйте общие изменения по ходу разработки.
  • Поддерживайте только одну версию сценария, а также отметьте файл исправления, который преобразует сценарий из одной версии в другую. После внесения достаточного количества изменений, которые исправление больше не применяет, разрешите конфликты и создайте новое исправление.
  • В настоящее время я склоняюсь к варианту 3, так как первые два будут связаны с большим количеством ошибок. Но вариант 3 кажется грязным, и моя система контроля версий должна управлять патчами для меня.

    Для дистрибутивной упаковки есть еще варианты:

    <Ол>
  • Предложите два различных пакета для загрузки, один из которых подходит для Python 2, а другой - для Python 3 (пользователь должен знать, чтобы загрузить правильный пакет для любой версии Python, которую он имеет).
  • Предложите один пакет для загрузки с двумя различными сценариями внутри (а затем пользователь должен знать, чтобы запустить правильный).
  • Один загружаемый пакет с двумя сценариями, зависящими от версии, и небольшим загрузчиком-заглушкой, который может работать в обеих версиях Python, который запускает правильный сценарий для установленной версии Python.
  • Опять же, я сейчас склоняюсь к варианту 3, хотя пока не пытался разработать такой загрузчик заглушек.

    Есть еще идеи?

    Это было полезно?

    Решение

    Изменить: мой первоначальный ответ основывался на состоянии 2009 года, а Python 2.6 и 3.0 были текущими версиями. Теперь, с Python 2.7 и 3.3, есть другие варианты. В частности, теперь вполне возможно использовать единую базу кода для Python 2 и Python 3.

    См. Портирование кода Python 2 в Python 3

    Оригинальный ответ:

    официальная рекомендация говорит:

      

    Для портирования существующих Python 2.5 или 2.6   Исходный код на Python 3.0, лучший   Стратегия заключается в следующем:

         <Ол>   
  • (Обязательное условие :) Начните с отличного тестового покрытия.

  •   
  • Портировать на Python 2.6. Это должно быть не больше работы, чем средний порт   из Python 2.x в Python 2. (x + 1).   Убедитесь, что все ваши тесты пройдены.

  •   
  • (все еще использую 2.6 :) Включите ключ командной строки -3. Это позволяет   предупреждения об особенностях, которые будут   удален (или изменен) в 3.0. Запустить свой   снова протестируйте набор и исправьте код, который   вы получаете предупреждения о том, пока есть   предупреждений не осталось, и все ваши тесты   еще пройти.

  •   
  • Запустите переводчик исходного кода 2to3 через дерево исходного кода.   (См. 2to3 - автоматический Python 2 до 3   перевод кода для получения дополнительной информации об этом   инструмент.) Запустите результат   перевод под Python 3.0. Вручную   исправить все оставшиеся проблемы, исправить   проблемы, пока все тесты не пройдут снова.

  •         

    Не рекомендуется пытаться писать   исходный код, который работает без изменений в   оба Python 2.6 и 3.0; Вы & # 8217; должны   использовать очень искаженный стиль кодирования,   например избегая печатных заявлений,   метаклассы и многое другое. Если ты   поддержание библиотеки, которая должна   поддерживать как Python 2.6, так и Python   3.0, лучший подход заключается в изменении шага 3 выше, отредактировав 2.6   версия исходного кода и работает   переводчик 2to3 снова, а не   редактирование версии 3.0 исходного кода   код.

    В идеале вы должны получить одну версию, совместимую с 2.6, которую можно перевести на 3.0 с помощью 2to3. На практике вы не сможете достичь этой цели полностью. Поэтому, возможно, вам понадобятся некоторые модификации вручную, чтобы заставить его работать под 3.0.

    Я хотел бы сохранить эти изменения в ветке, как ваш вариант 2. Однако вместо того, чтобы поддерживать окончательную 3.0-совместимую версию в этой ветке, я хотел бы применить ручные модификации перед к 2to3 переводы, и поместите этот модифицированный код 2.6 в вашу ветку. Преимущество этого метода состоит в том, что разница между этой ветвью и магистралью 2.6 будет довольно небольшой и будет состоять только из изменений вручную, а не изменений, сделанных 2to3. Таким образом, отдельные ветви будут проще поддерживать и объединять, и вы сможете извлечь выгоду из будущих улучшений в 2to3.

    В качестве альтернативы, возьмите немного "!", подождите и посмотрите " подход. Перейдите к портированию только настолько, насколько вы можете использовать одну версию 2.6 плюс перевод 2to3, и откладывайте оставшиеся изменения вручную, пока вам действительно не понадобится версия 3.0. Может быть, к этому времени вам больше не нужны ручные настройки ...

    Другие советы

    Для разработки вариант 3 слишком громоздкий. Поддержание двух ветвей - самый простой способ, хотя способ сделать это будет различным в разных VCS. Многие DVCS будут более довольны отдельными репозиториями (с общим происхождением, помогающим объединяться), а централизованная VCS, вероятно, будет легче работать с двумя ветвями. Вариант 1 возможен, но вы можете пропустить что-то для слияния и более подверженную ошибкам IMO.

    Для распространения я бы также использовал вариант 3, если это возможно. Все 3 варианта действительны в любом случае, и я видел изменения в этих моделях время от времени.

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

    Я думаю, что сейчас имеет смысл продолжать разработку для 2.x, по крайней мере, в течение нескольких месяцев, вплоть до года. В какой-то момент будет просто время объявить окончательную стабильную версию для 2.x и разработать следующие для 3.x +

    Например, я не буду переходить на 3.x, пока некоторые из основных фреймворков не пойдут по этому пути: PyQt, matplotlib, numpy и некоторые другие. И я не против, если в какой-то момент они прекратят поддержку 2.x и просто начнут разрабатывать для 3.x, потому что я буду знать, что через некоторое время я тоже смогу перейти на 3.x.

    Я бы начал с перехода на 2.6, что очень близко к python 3.0. Возможно, вы даже захотите подождать 2.7, что будет еще ближе к python 3.0.

    И затем, как только вы перейдете на 2.6 (или 2.7), я предлагаю вам просто оставить только одну версию скрипта с такими вещами, как " если PY3K: ... else: ... Quot; в редких местах, где это будет обязательно. Конечно, это не тот код, который нам нравится писать разработчикам, но тогда вам не нужно беспокоиться об управлении несколькими скриптами, ветвями, патчами или дистрибутивами, что станет кошмаром.

    Что бы вы ни выбрали, убедитесь, что у вас есть тщательные тесты со 100% охватом кода.

    Удачи!

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

    Для развития трудно сказать, не зная вашей аудитории. Пользователи Power Python, вероятно, оценят, что нет необходимости загружать две копии вашего программного обеспечения, но для более общей пользовательской базы оно, вероятно, должно «просто работать».

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top