Поиск по сайту:

Преобразование вашего кода Python 2 в Python 3


На этой странице

  1. Я думал, что Python 3 обратно совместим с Python 2?
  2. Некоторые различия между Python 2 и Python 3
  3. Преобразование с Python 2 на Python 3 в основном происходит автоматически.
  4. Бег 2 на 3
  5. Modernize — это оболочка для 2to3.
  6. Советы
  7. Тест, тест, тест
  8. Заключение
  9. Ссылки

Срок службы Python 2 истек 1 января 2020 г. Python 3 доступен с 2008 г., но переход с 2 на 3 был медленным из-за зависимостей от библиотек, которые изначально не были доступны в Python 3, более ранние версии python 3 были медленнее, чем Python 2, а также потому, что Python 2 работал довольно хорошо для многих людей. Конец жизни Python 2 означает, что больше не будет поддерживаемых выпусков и исправлений ошибок от Python. Некоторые дистрибутивы Linux, такие как Ubuntu и Red Hat, некоторое время будут поддерживать Python 2, но лучше перейти на Python 3.

Я думал, что Python 3 обратно совместим с Python 2?

Не 100%. Переход от Python 2 к Python 3 был воспринят как возможность «исправить» некоторые проблемы с Python 2. Среди них более единообразное продвижение Unicode во всем языке и устранение некоторых проблем в синтаксисе, таких как печать как оператор, а не чем функция.

Несколько различий между Python 2 и Python 3

Некоторые операторы, такие как print, exec и другие, были заменены встроенными функциями. Примеры:

print 'hello world' # valid python 2 not in python 3
print ('hello world') # valid python 3 and later versions of python 2

Целочисленное деление также было изменено. Пример:

print (5 / 2) # in python 2 result is 2 in python 3 result is 2.5

// добавлено в python 3 для поддержки старого поведения

Многие функции теперь возвращают unicode/bytes в python 3 вместо строк ascii/str в python 2. Пример:

type (subprocess.checkout_output('cmd')) # returns <class 'bytes'> <class 'bytes'=""> in python 3 vs <type 'str'><type 'str'=""> in python 2

Чтобы преобразовать python 3 в строку, вам нужно использовать параметр .decode(ascii).

type (subprocess.check_output('ls').decode('ascii')) # will result in a <class 'str'><class 'str'=""> in python 3

Некоторые библиотеки были реорганизованы.

Например. Библиотека python2 urllib2 была заменена на urllib в Python 3. Urllib в Python 3 также доступен в таких модулях, как urllib.request и urllib.error, поэтому вы можете импортировать их, чтобы получить функциональность, аналогичную Python 2.

from urllib import urlopen # python 2
from urllib.request import urlopen # python 3

Преобразование с Python 2 на Python 3 в основном автоматически

Хотя вы можете внести все изменения для преобразования вашего скрипта Python из Python 2 в Python 3 вручную, существует инструмент, который сделает за вас большую часть тяжелой работы. 2to3 — это пакет, который можно установить из библиотеки pip, а также он доступен как отдельный пакет во многих репозиториях дистрибутивов. Для установки через pip3

% pip3 install 2to3

Для установки на Debian/Ubuntu

% sudo apt install 2to3

Для установки на Fedora/CentOS

% sudo yum install 2to3

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

Бег 2 на 3

$ 2to3 --help # will provide you the help message from the system

Пара интересных вариантов

-l                  # will provide a list of the fixes available in 2to3.  E.g. print, exec, urllib, and others
-x                  # explicitly not run a transformation, use if one of the "fixes" doesn't work for your code base
-o                  # output dir, put transformed files into another location
--add-suffix=SUFFIX # put a suffix on converted files --add-suffix='3', will convert .py files to .py3 files
-w                  # overwrite current files with modified files

Предполагая, что у вас есть каталог кода Python 2 (скрипты) и папка назначения для кода Python 3 (scripts3), вы можете сделать следующее: Команда для преобразования выглядит следующим образом.

% 2to3 scripts -n -w -o scripts3

Варианты следующие

scripts  - source dir
-n       - no backups
-w       - write-unchanged files, write file even if no changes are required by 2to3
-o       - output directory
scripts3 - output directory, where the converted scripts are written

Таким образом, исходный код не изменяется, и пользователь может просмотреть преобразованный код в папке scripts3 и по-прежнему ссылаться на исходный код.

Модернизация — это оболочка вокруг 2to3.

Его поведение аналогично 2to3, за исключением того, что он поддерживает флаг --six-unicode, который будет использовать шесть вспомогательных функций, помогающих поддерживать Python 3.1 и Python 3.2. Я бы, вероятно, использовал 2to3, если только для модернизации не будет добавлена привлекательная функция, которая побудит вас использовать ее. Модернизация также доступна в некоторых дистрибутивах, таких как тестирование Debian и Arch. Установить

# pip3 install modernize

Бежать

# python-modernize --help

Советы

Дос

Do conversion in small chunks
Do use tools like pylint to help you figure out problematic code, before you convert it
Do compare the code before and after the conversion
Do use the debugger to validate critical code

НЕТ

Do not overwrite your code with 2to3, recommend a separate directory
Do not trust in the tools to do everything correctly

Тест, тест, тест

Независимо от того, как вы конвертируете свой код с Python 2 на Python 3, вы должны тщательно его протестировать. Для критически важного кода Python я бы даже предложил использовать отладчик Python для запуска кода построчно.

# python3 -m pdb  # will run the script in the python debugger 

Затем введите n, чтобы перейти к следующей строке сценария, и q, чтобы выйти из отладчика.

Заключение

Python 2 умер после долгой и плодотворной жизни. Если вы все еще используете Python 2, вам следует перейти на Python 3. Python предоставляет инструмент в 2to3, который помогает с переходом с Python 2 на Python 3 и избавляет от многих хлопот. 2to3 — не идеальный инструмент, но он может сделать большую часть работы за вас и на несколько порядков снизить сложность преобразования с Python 2 на 3.

Ссылки

  • Страница 2to3 в библиотеке документации Python https://docs.python.org/3/library/2to3.html
  • Библиотека модернизации https://pypi.org/project/modernize/
  • Перенос кода Python 2 на страницу Python 3 на сайте python.org https://docs.python.org/3/howto/pyporting.html