Вопрос

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

  1. Будете ли вы поддерживать версии Python 2 и Python 3 одновременно или у вас просто будет версия Python 3 после ее завершения?

    • Вы уже начали или планируете начать в ближайшее время?Или вы планируете дождаться выхода финальной версии, чтобы начать работу в полную силу?
Это было полезно?

Решение

Вот общий план Twisted.Изначально я собирался написать об этом в блоге, но потом подумал:зачем писать об этом, если я могу получить точки для этого?

  1. Подождите, пока кого-нибудь это заинтересует.

    Сейчас ни у кого нет Python 3.Мы не собираемся тратить кучу усилий до тех пор, пока хотя бы один реальный пользователь не выйдет и не скажет: «Мне нужна поддержка Python 3.0», и у него будет для этого веская причина, помимо того факта, что 3.0 выглядит блестяще.

  2. Подождите, пока наши зависимости не переместятся.

    Такая большая система, как Twisted, имеет ряд зависимостей.Для начала в наш список входят:

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

  3. Подождите, пока кто-нибудь достаточно позаботится помогать.

    К счастью, над Twisted работают 5 человек — и я говорю «из благотворительности», потому что это касается меня, а я не принимал никаких обязательств уже несколько месяцев.У нас есть более 1000 открытых билетов прямо сейчас, и было бы неплохо действительно исправить некоторые из них — исправить ошибки, добавить функции и вообще сделать Twisted лучшим продуктом сам по себе — прежде чем тратить время на его перенос на существенно новую версию языка.

    Это потенциально включает в себя спонсоры достаточно заботлив, чтобы заплатить нам за это, но я надеюсь, что будет приток волонтеров, которые заботятся о поддержке 3.0 и хотят помочь продвинуть сообщество вперед.

  4. Следуйте совету Гвидо.

    Это означает мы не будем менять наш API несовместимо, и мы будем следовать руководящие принципы переходного развития которое Гвидо опубликовал в прошлом году.Это начинается с модульных тестов и запуска инструмент преобразования 2 в 3 над кодовой базой Twisted.

  5. Сообщайте об ошибках и добавляйте исправления для инструмента 2to3..

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

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

  6. Поддерживайте совместимость с версией 2.x в течение нескольких лет.

    На данный момент Twisted поддерживает Python версий от 2.3 до 2.5.В настоящее время мы работаем над поддержкой версии 2.6 (которую, очевидно, придется завершить до версии 3.0!).Наш план состоит в том, чтобы пересмотреть поддерживаемые версии Python на основе долгосрочно поддерживаемых версий Python. Убунту - версия 8.04, включающая Python 2.5, будет поддерживаться до 2013 года.По совету Гвидо, нам придется отказаться от поддержки версии 2.5, чтобы поддерживать версию 3.0, но я надеюсь, что мы сможем найти способ обойти эту проблему (мы довольно изобретательны в вопросах совместимости версий).

    Итак, мы планируем поддерживать Python 2.5 как минимум до 2013 года.Через два года Ubuntu выпустит еще одну версию Ubuntu с долгосрочной поддержкой:если они еще существуют и идут по графику, это будет 10.04.Лично я предполагаю, что он будет поставляться с Python 2.x, возможно, с Python 2.8, поскольку /usr/bin/python, потому что в дистрибутив входит огромное количество программного обеспечения Python, и обновление всего этого займет много времени.Итак, через пять лет затем, в 2015 году мы можем начать рассматривать возможность прекращения поддержки 2.x.

    В течение этого периода мы продолжим следовать советам Гвидо по поводу миграции:запуск 2to3 поверх нашей кодовой базы 2.x и изменение кодовой базы 2.x, чтобы тесты проходили в обеих версиях.

    В результате Python 3.x не будет источник язык для Twisted, пока мне не исполнится 35 лет — это будет целевая среда выполнения (а также набор рекомендаций и ограничений) для моего кода Python 2.x.Я планирую писать программы на Python 2.x в течение следующих десяти лет или около того.

Итак, это план.Я надеюсь, что через год или около того он будет выглядеть смехотворно консервативным;что переход на 3.x прост, как пирог, и все быстро обновляются.Могут произойти и другие вещи:ветки 2.x и 3.x могут сойтись, кто-то может написать 3to2, или другая среда выполнения (на ум приходит PyPy) может позволить запускать код 2.x и 3.x в одном и том же процессе напрямую, что упрощает процесс преобразования.

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

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

Проект Django использует библиотеку six поддерживать кодовую базу, которая одновременно работает на Python 2 и Питон 3 (Сообщение блога).

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

Очевидные преимущества:

  • Нет необходимости в отдельных ветках для Python 2 и Python 3.
  • Никаких инструментов преобразования, таких как 2to3.

Основная идея версии 2.6 — предоставить путь перехода на версию 3.0.Таким образом, вы можете использовать from __future__ import X медленно переносите одну функцию за раз, пока вы не зафиксируете их все и не сможете перейти к версии 3.0.Многие функции версии 3.0 перейдут и в версию 2.6, так что вы сможете постепенно уменьшать языковой разрыв, а не переносить все за один раз.

На работе планируем сначала обновиться с 2.5 до 2.6.Затем мы начинаем постепенно включать функции 3.0, по одному модулю за раз.В какой-то момент целая часть системы, вероятно, будет готова для версии 3.x.

Единственная проблема — библиотеки.Если библиотека никогда не переносится, мы остаемся со старой библиотекой.Но я вполне уверен, что в свое время мы получим прекрасную альтернативу этой части.

Говорю как автор библиотеки:

Жду выхода финальной версии.Я убежден, как и большинство членов сообщества Python, что версия 2.x продолжит оставаться доминирующей версией в течение нескольких недель или месяцев.Этого достаточно времени, чтобы выпустить хорошую, отточенную версию 3.x.

Я буду поддерживать отдельные ветки 2.x и 3.x.2.x будет обратно совместим с 2.4, поэтому я не смогу использовать много необычного синтаксиса или новых функций в 2.6/3.0.Напротив, ветка 3.x будет использовать каждую из этих функций, что сделает работу пользователя более удобной.Набор тестов будет изменен, чтобы с ним работал 2to3, и я буду поддерживать одни и те же тесты для обеих ветвей.

Поддержите оба

Я хотел попытаться преобразовать библиотеку BeautifulSoup в 3x для проекта, над которым работаю, но понимаю, насколько сложно будет поддерживать две разные ветки кода.

Текущая модель для решения этой проблемы включает в себя:

  1. внести изменения в ветку 2x
  2. бежать 2 на 3
  3. молитесь, чтобы конвертация прошла правильно с первого раза
  4. запустить код
  5. запустите модульные тесты, чтобы убедиться, что все работает
  6. скопируйте вывод в ветку 3x

Эта модель работает, но ИМХО это отстой.Для каждого изменения/выпуска вам необходимо выполнить следующие шаги::sigh::.Кроме того, это препятствует разработчикам расширять ветку 3x новыми функциями, которые могут поддерживаться только в py3k, поскольку вы по-прежнему ориентируете весь код на 2x.

Решение...использовать препроцессор

Поскольку я не смог найти достойный препроцессор в стиле C с директивами #define и #ifdef для Python, я написал его.

Это называется pypreprocessor, его можно найти в PYPI.

По сути, вы делаете следующее:

  1. импортировать pypreprocessor
  2. определить, в какой версии Python работает скрипт
  3. установите «define» в препроцессоре для версии (например, «python2» или «python3»)
  4. добавить директивы #ifdef python2 и #ifdef python3, где код зависит от версии
  5. запустить код

Вот и все.Теперь он будет работать как в 2x, так и в 3x.Если вы беспокоитесь о дополнительном снижении производительности при работе препроцессора, есть также режим, который удаляет все метаданные и выводит постобработанный исходный код в файл.

Лучше всего...вам нужно выполнить преобразование 2 в 3 только один раз.

Вот рабочий пример:

#!/usr/bin/env python
# py2and3.py

import sys
from pypreprocessor import pypreprocessor

#exclude
if sys.version[:3].split('.')[0] == '2':
    pypreprocessor.defines.append('python2')
if sys.version[:3].split('.')[0] == '3':
    pypreprocessor.defines.append('python3')

pypreprocessor.parse()
#endexclude
#ifdef python2
print('You are using Python 2x')
#ifdef python3
print('You are using python 3x')
#else
print('Python version not supported')
#endif

Вот результаты в терминале:

 python py2and3.py
 >>>You are using Python 2x 
 python3 py2and3.py
 >>>You are using python 3x

Если вы хотите вывести результат в файл и создать чистый исходный файл для конкретной версии без дополнительных метаданных, добавьте эти две строки где-нибудь перед оператором pypreprocessor.parse():

pypreprocessor.output = outputFileName.py
pypreprocessor.removeMeta = True

Затем:

python py2and3.py

Создаст файл с именем outputFileName.py, специфичный для Python 2x, без дополнительных метаданных.

python3 py2and3.py

Создаст файл с именем outputFileName.py, специфичный для Python 3x, без дополнительных метаданных.

Документацию и дополнительные примеры см. здесь. pypreprocessor в GoogleCode.

Я искренне надеюсь, что это поможет.Мне нравится писать код на Python, и я надеюсь как можно скорее увидеть прогресс в поддержке области 3x.Ненавижу видеть, как язык не прогрессирует.Тем более, что версия 3x устраняет многие из представленных WTF и делает синтаксис более дружелюбным для пользователей, переходящих с других языков.

Документация на данный момент полная, но не обширная.Я постараюсь в ближайшее время добавить вики более обширную информацию.

Обновлять:

Хотя я разработал pypreprocessor специально для решения этой проблемы, он не работает, поскольку лексер проверяет синтаксис всего кода перед его выполнением.

Если бы в Python была реальная поддержка директив препроцессора C, это позволило бы разработчикам писать код Python2x и Python3k рядом друг с другом в одном файле, но из-за плохой репутации препроцессора C (злоупотребление заменой макросов для изменения ключевых слов языка) я не делаю этого. см., что законная поддержка препроцессора C будет добавлена ​​​​в Python в ближайшее время.

Zope Toolkit медленно продвигается к поддержке Python 3.Медленно главным образом потому, что многие из этих библиотек очень сложны.

Для большинства библиотек я использую 2to3.Некоторые библиотеки обходятся без него, поскольку они просты или содержат большую часть кода в C-расширении.zc.buildout, который является родственным пакетом, будет запускать тот же код без 2to3 для поддержки Python 2 и 3.

Мы портируем ZTK на Python 3, потому что от него зависят многие другие библиотеки и фреймворки, такие как Twisted и фреймворк Pyramid.

Некоторые из моих более сложных кодов версии 2.x останутся на версиях 2.5 или 2.6.Я перехожу на версию 3.0 для всех новых разработок, как только некоторые из сторонних библиотек, которые я часто использую, будут обновлены для версии 3.

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