Как вы планируете осуществить переход на Python 3?

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

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

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

Для нас ключевым моментом является поддержка библиотеки. В тот момент, когда библиотеки, от которых мы зависим, поддержат 3.0, мы перенесем наши проекты на 3.0. Мы не будем поддерживать ветки нашего программного обеспечения, совместимые с 2.x - мы обновим все системы наших клиентов до Python 3.0.

codeape 06.10.2008 13:24

Было бы очень интересно прочитать обновление этого высоко оцененного вопроса и комментариев сейчас, спустя 2,5 года и с выпуском python 3.2.

joaquin 23.02.2011 10:55

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

Evan Plaice 16.03.2011 07:01

@joaquin: является интересно. Я только что опубликовал еще один ответ с сообщением в блоге относительно недавнего проекта о совместимости 2-3.

Thane Brimhall 27.10.2012 02:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
52
4
10 016
6

Ответы 6

Как автор библиотеки:

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

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

> ... 2.x будет оставаться доминирующей версией в течение недель или месяцев, я думаю, это немного оптимистично. Пройдет несколько лет, ИМХО. Но я аплодирую вашему подходу!

Kevin Little 05.10.2008 23:09

Основная идея версии 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х для проекта, над которым я работаю, но я понимаю, насколько сложно поддерживать две разные ветки кода.

Текущая модель, которая справляется с этим, включает:

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

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

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

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

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

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

  1. импортировать препроцессор
  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, и я надеюсь увидеть прогресс поддержки в 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 делает это, предоставляя уровень совместимости, который интеллектуально перенаправляет импорт и функции в соответствующие места (а также объединяет другие несовместимые изменения).

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

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

Я поговорил с парнем (Эймериком), который портировал Django на python 3, используя шесть: он сказал мне, что это огромная работа (нужно было изменить что-то вроде 20% строк в коде), но как только это будет сделано, все будет готово. , нет необходимости поддерживать две ветки и возиться с 2to3. Честно говоря, я думаю, что Гвидо следует изменить свое руководство и положить конец беспорядку 2 на 3: используйте по шесть штук на каждого!

MiniQuark 14.04.2013 23:52

Django откажется от совместимости с Python2 после следующего выпуска LTS: djangoproject.com/weblog/2015/jun/25/roadmap

MKesper 01.02.2017 16:30

«Сдаться» звучит так, будто они оставляют плохую или сломанную идею. Это далеко от истины! Django отказывается от поддержки Python 2 потому что сам Python отказывается от поддержки Python 2. six по-прежнему является лучшим способом поддерживать работоспособную, совместимую кодовую базу, но, надеюсь, через несколько лет в этом нет необходимости, потому что все будут использовать Python 3.

Thane Brimhall 01.02.2017 17:34

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