Как перенести код Python 2 на Python 3

Вступление

Python был разработан в конце 1980-х годов и впервые опубликован в 1991 году. С именем, вдохновленным британской комедийной группой Monty Python, Python был задуман как преемник императивного универсального языка программирования ABC. В своей первой итерации Python уже включал обработку исключений, functions и https: //www.digitalocean .com / community / tutorials / понимание-наследование-в-питоне-3 [классы с наследованием].

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

Фон

  • Python 2 * был опубликован в 2000 году, сигнализируя о более прозрачном и инклюзивном процессе разработки языка. Он включал в себя гораздо больше программных функций и добавил больше функций на протяжении всей своей разработки.

  • Python 3 * считается будущим Python и является версией языка, который в настоящее время находится в разработке. Выпущенный в конце 2008 года, Python 3 устранил и исправил недостатки внутреннего дизайна. Тем не менее, внедрение Python 3 было медленным из-за обратной совместимости языка с Python 2.

  • Python 2.7 * был опубликован в 2010 году как последний из выпусков 2.x. Цель Python 2.7 состояла в том, чтобы облегчить пользователям Python 2.x перенос функций на Python 3, обеспечивая некоторую степень совместимости между ними.

Вы можете узнать больше о версиях Python и о том, какой из них использовать, прочитав наш учебник «https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2[Python 2 vs Python 3: практические соображения]. »

Начать с Python 2.7

Чтобы перейти на Python 3 или одновременно поддерживать Python 2 и Python 3, необходимо убедиться, что ваш код Python 2 полностью совместим с Python 2.7.

Многие разработчики уже работают исключительно с кодом Python 2.7, но важно подтвердить, что все, что поддерживается только в более ранних версиях, работает правильно с Python 2.7 и соответствует стилю Python 2.7.

Убедиться в том, что ваш код написан на Python 2.7, особенно важно, потому что это единственная версия Python 2, которая все еще поддерживается и получает исправления. Если вы работаете над более ранней версией Python 2, вам придется обходить проблемы, с которыми вы сталкиваетесь, в коде, который больше не поддерживается и больше не получает исправления.

Кроме того, некоторые инструменты, упрощающие перенос кода, такие как пакет Pylint, который ищет ошибки программирования, не поддерживаются более ранними версиями Python чем 2.7.

Важно помнить, что хотя Python 2.7 в настоящее время все еще поддерживается и поддерживается, он в конце концов достигнет конца своей жизни. PEP 373 подробно описывает график выпуска Python 2.7 и на момент написания отмечает дату его заката как 2020.

Тестовое покрытие

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

В рамках вашего тестирования вы можете добавить интерактивные кейсы Python в строки документации всех ваших функций, методов, классов и модулей, а затем использовать встроенный https://docs.python.org/3.6/library/doctest. html [+ doctest + module], чтобы убедиться, что они работают, как показано.

Помимо + doctest +, вы можете использовать https://pypi.python.org/pypi/coverage [+ охват.py + пакет] для отслеживания покрытий модульных тестов. Этот инструмент будет контролировать вашу программу и отмечать, какие части кода были выполнены, а какие могли быть выполнены, но не были. + cover.py + может распечатывать отчеты в командной строке или выводить HTML. Обычно он используется для измерения эффективности тестов, показывая, какие части кода выполняются при тестировании, а какие нет.

Имейте в виду, что вы не стремитесь к 100% тестированию - вы хотите убедиться, что вы закрываете любой код, который является запутанным или необычным. Для лучшей практики вы должны стремиться к 80% охвату.

Узнайте о различиях между Python 2 и Python 3

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

Наше руководство по «https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2[Python 2 против Python 3]» посвящено некоторым из https: // www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2#key-differences[key Отличия] между двумя версиями, и вы можете просмотреть https: //docs.python .org / 3 / [официальная документация Python] для более подробной информации.

Приступая к переносу и переносу, вы можете внести несколько изменений в синтаксис.

+ Печать +

The + print + statement в Python 2 был изменен на функцию a + print () + _ в Python 3._

Python 2 Python 3

print "Hello, World!"

print("Hello, World!")

+ + Exec

The + exec + statement в Python 2 заменено на функцию, которая разрешает явные локальные и глобальные переменные в Python 3.

Python 2 Python 3

exec code

exec(code)

exec code in globals

exec(code, globals)

exec code in (globals, locals)

exec(code, globals, locals)

+ / + и + // +

Python 2 выполняет разделение по полу с помощью _ + / + _https: //www.digitalocean.com/community/tutorials/how-to-do-math-in-python-3-with-operators [operator], Python 3 представил + // + для разделения этажа .

Python 2 Python 3

5 / 2 = 2

5 / 2 = 2.5

5 // 2 = 2

Чтобы использовать эти операторы в Python 2, import + Division + из `+ future + `модуль:

from __future__ import division

+ Подъем +

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

Python 2 Python 3

raise Exception, args

raise Exception

raise Exception(args)

raise Exception, args, traceback

raise Exception(args).with_traceback(traceback)

raise "Error"

raise Exception("Error")

+ Кроме +

В Python 2 было сложно перечислить несколько исключений, но это изменилось в Python 3._

Помните, что _ + as + _ используется явно с _ +, за исключением + _ в Python 3

Python 2 Python 3

except Exception, variable:

except AnException as variable:

except (OneException, TwoException) as variable:

+ Защита

В Python 2 функции могут принимать последовательности, такие как tuples или https://www.digitalocean.com/community/tutorials / понимание-листы-в-питон-3 [списки]. В Python 3 эта распаковка была удалена.

Python 2 Python 3

def function(arg1, (x, y)):

def function(arg1, x_y): x, y = x_y

+ + Выражение

Синтаксис обратной черты Python 2 больше не существует. Используйте + repr () + _ + str.format () + в Python 3._

Python 2 Python 3

+x = \`355/113\+`

x = repr(355/113):

Форматирование строк

Синтаксис форматирования строки изменен с Python 2 на Python 3.

Python 2 Python 3

"%d %s" % (i, s)

"{} {}".format(i, s)

"%d/%d=%f" % (355, 113, 355/113)

"{:d}/{:d}={:f}".format(355, 113, 355/113)

+ Класс +

Нет необходимости указывать + object _ в Python 3.