Как вы планируете обрабатывать переход на Python 3? - PullRequest
52 голосов
/ 05 октября 2008

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

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

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

Ответы [ 7 ]

90 голосов
/ 18 октября 2008

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

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

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

  2. Дождитесь миграции наших зависимостей.

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

    • Zope Interface
    • PyCrypto
    • PyOpenSSL
    • pywin32
    • PyGTK (хотя эта зависимость, к сожалению, очень легкая сейчас, к тому времени, когда миграция начнется, я надеюсь, что в Twisted будет больше инструментов с графическим интерфейсом)
    • pyasn1
    • PyPAM
    • gmpy

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

  3. Подождите, пока кому-то все равно достаточно , чтобы помочь .

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

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

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

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

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

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

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

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

    Прямо сейчас Twisted поддерживает python 2.3 до 2.5. В настоящее время мы работаем над поддержкой версии 2.6 (которую мы, очевидно, должны закончить до версии 3.0!). Мы планируем пересмотреть наши поддерживаемые версии Python на основе долгосрочных поддерживаемых версий Ubuntu - выпуск 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. Я хотел бы предоставить всем этим людям положительный опыт как можно дольше.

8 голосов
/ 27 октября 2012

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

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

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

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

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

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

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

3 голосов
/ 05 июня 2010

Поддержка обоих

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

Текущая модель для этого включает:

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

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

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

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

Он называется pypreprocessor и может быть найден в PYPI

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

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

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

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

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

#!/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 (злоупотребление заменой макросов для изменения языка). ключевые слова) В ближайшее время я не вижу, чтобы в python добавлялась легитимная поддержка препроцессора C.

3 голосов
/ 05 октября 2008

Выступая в роли автора библиотеки:

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

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

2 голосов
/ 16 марта 2011

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

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

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

0 голосов
/ 06 октября 2008

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

...