Я уверен, что это тема, которая волнует большинство разработчиков Python, учитывая, что Python 3 скоро выйдет. Несколько вопросов, которые помогут нам двигаться в правильном направлении:
Будет ли у вас одновременно поддерживаться версия для Python 2 и Python 3 или у вас будет просто версия для Python 3 после ее завершения?
Было бы очень интересно прочитать обновление этого высоко оцененного вопроса и комментариев сейчас, спустя 2,5 года и с выпуском python 3.2.
Путь миграции по-прежнему отстой для библиотек, потому что у вас не может быть кода 2x вместе с кодом 3k в одном файле. 2to3 хорош для одноразового преобразования, но не является жизнеспособным в качестве варианта долгосрочной разработки, потому что разработчикам не нравится поддерживать две разные версии одного и того же источника. Настоящий препроцессор упростил бы процесс, но у python его нет.
@joaquin: является интересно. Я только что опубликовал еще один ответ с сообщением в блоге относительно недавнего проекта о совместимости 2-3.






Как автор библиотеки:
Жду выхода финальной версии. Я, как и большинство членов сообщества Python, убежден, что 2.x будет оставаться доминирующей версией в течение недель или месяцев. У нас достаточно времени, чтобы выпустить красивый, отполированный релиз 3.x.
Я буду поддерживать отдельные ветки 2.x и 3.x. 2.x будет обратно совместим с 2.4, поэтому я не могу использовать много причудливого синтаксиса или новых функций в 2.6 / 3.0. В отличие от этого, ветка 3.x будет использовать каждую из этих функций, что делает работу пользователя более удобной. Набор тестов будет изменен, так что 2to3 будет работать с ним, и я буду поддерживать одни и те же тесты для обеих веток.
> ... 2.x будет оставаться доминирующей версией в течение недель или месяцев, я думаю, это немного оптимистично. Пройдет несколько лет, ИМХО. Но я аплодирую вашему подходу!
Основная идея версии 2.6 - предоставить возможность перехода на версию 3.0. Таким образом, вы можете использовать from __future__ import X, медленно мигрируя по одной функции за раз, пока вы не соберете их все и не сможете перейти на 3.0. Многие из функций 3.0 будут перенесены в 2.6, так что вы можете постепенно сокращать языковой разрыв, вместо того, чтобы переносить все за один раз.
На работе мы планируем сначала перейти с 2.5 на 2.6. Затем мы начинаем постепенно включать функции 3.0, по одному модулю за раз. В какой-то момент целая часть системы, вероятно, будет готова для 3.x.
Единственная проблема - это библиотеки. Если библиотека никогда не переносится, мы застряли на старой библиотеке. Но я почти уверен, что в свое время мы получим прекрасную альтернативу для этой части.
Некоторые из моих более сложных кодов 2.x останутся на уровне 2.5 или 2.6. Я перехожу на 3.0 для всех новых разработок, поскольку некоторые из сторонних библиотек, которые я часто использую, были обновлены до версии 3.
Я хотел попытаться преобразовать библиотеку BeautifulSoup в 3х для проекта, над которым я работаю, но я понимаю, насколько сложно поддерживать две разные ветки кода.
Текущая модель, которая справляется с этим, включает:
Эта модель работает, но ИМХО отстой. Для каждого изменения / выпуска вы должны пройти следующие шаги :: sigh ::. Кроме того, это отговаривает разработчиков от расширения ветки 3x новыми функциями, которые могут поддерживаться только в py3k, потому что вы по-прежнему ориентируете весь код на 2x.
Решение ... используйте препроцессор
Поскольку мне не удалось найти достойный препроцессор в стиле c с директивами #define и #ifdef для python, я написал его.
Это называется pypreprocessor и его можно найти в PYPI
По сути, вы делаете следующее:
Вот и все. Теперь он будет работать как в 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, и я надеюсь увидеть прогресс поддержки в 3 раза в ближайшее время. Ненавижу, когда язык не прогрессирует. Тем более, что версия 3x разрешает многие из представленных WTF и делает синтаксис более удобным для пользователей, переходящих с других языков.
Документация на данный момент полная, но не обширная. Я постараюсь в ближайшее время добавить в вики более обширную информацию.
Обновлять:
Хотя я разработал pypreprocessor специально для решения этой проблемы, он не работает, потому что лексер выполняет проверку синтаксиса всего кода перед выполнением любого кода.
Если бы у python была реальная поддержка директив препроцессора C, это позволило бы разработчикам писать код python2x и python3k рядом друг с другом в одном файле, но из-за плохой репутации препроцессора C (злоупотребление заменой макросов для изменения ключевых слов языка) я не увидеть, как в ближайшее время в Python будет добавлена законная поддержка препроцессора C.
Zope Toolkit медленно продвигается к поддержке Python 3. Медленно в основном потому, что многие из этих библиотек очень сложны.
Для большинства библиотек я использую 2to3. Некоторые библиотеки обходятся без него, потому что они просты или содержат большую часть кода в C-расширении. zc.buildout, который является связанным пакетом, будет запускать тот же код без поддержки 2to3 для Python 2 и 3.
Мы переносим ZTK на Python 3, потому что от него зависят многие другие библиотеки и фреймворки, такие как Twisted и Pyramid framework.
Проект Django использует библиотеку six для поддержки кодовой базы, которая одновременно работает на Python 2 и Python 3 (Сообщение блога).
six делает это, предоставляя уровень совместимости, который интеллектуально перенаправляет импорт и функции в соответствующие места (а также объединяет другие несовместимые изменения).
Я поговорил с парнем (Эймериком), который портировал Django на python 3, используя шесть: он сказал мне, что это огромная работа (нужно было изменить что-то вроде 20% строк в коде), но как только это будет сделано, все будет готово. , нет необходимости поддерживать две ветки и возиться с 2to3. Честно говоря, я думаю, что Гвидо следует изменить свое руководство и положить конец беспорядку 2 на 3: используйте по шесть штук на каждого!
Django откажется от совместимости с Python2 после следующего выпуска LTS: djangoproject.com/weblog/2015/jun/25/roadmap
«Сдаться» звучит так, будто они оставляют плохую или сломанную идею. Это далеко от истины! Django отказывается от поддержки Python 2 потому что сам Python отказывается от поддержки Python 2. six по-прежнему является лучшим способом поддерживать работоспособную, совместимую кодовую базу, но, надеюсь, через несколько лет в этом нет необходимости, потому что все будут использовать Python 3.
Для нас ключевым моментом является поддержка библиотеки. В тот момент, когда библиотеки, от которых мы зависим, поддержат 3.0, мы перенесем наши проекты на 3.0. Мы не будем поддерживать ветки нашего программного обеспечения, совместимые с 2.x - мы обновим все системы наших клиентов до Python 3.0.