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

Как вы планируете обрабатывать миграцию на Python 3?

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

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

    • Вы уже начали или планируете начать работу в ближайшее время? Или вы планируете дождаться окончательного выхода финальной версии?
4b9b3361

Ответ 1

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

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

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

  • Подождите, пока наши зависимости не будут перенесены.

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

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

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

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

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

  • Следуйте советам Guido.

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

  • Сообщить об ошибках и файлах для инструмента 2to3.

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

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

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

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

    В течение этого периода мы продолжим следовать рекомендациям Guido о миграции: работаем на 2to3 над нашей 2.x-кодовой базой и модифицируем 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. Я хотел бы предоставить всем этим людям положительный опыт как можно дольше.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Поддержка

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

Текущая модель для обработки:

  • внести изменения в ветвь 2x
  • запустить 2to3
  • молитесь, чтобы он правильно преобразовывал первый раз
  • запустите код
  • запустите модульные тесты, чтобы убедиться, что все работает
  • скопируйте вывод в ветвь 3x

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

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

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

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

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

  • import pypreprocessor
  • определить, какая версия python script запущена в
  • задайте 'define' в препроцессоре для версии (ex 'python2' или 'python3')
  • sprinkle '#ifdef python2' и '#ifdef python3', где код определен в версии
  • запустите код

Что это. Теперь он будет работать как в 2x, так и в 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.

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

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

Update:

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

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

Ответ 6

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

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

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

Ответ 7

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