Перенос существующего кода на Python 3 может показаться огромной и страшной задачей, но есть вещи, которые во время использования Python 2.7, могут помочь облегчить миграцию на Python3, когда это понадобится.
Python предоставляет инструмент 2to3 для автоматического переноса существующего кода, но опыт показывает, что этого недостаточно, и все равно нужно дорабатывать код р «в ручном режиме» , и в результате получается два кода – один для Python 2.7, и второй для 3.2+, что только создает дополнительные трудности.
Многие особенности Python 3 были так или иначе портированы на Python 2.7, поэтому лучший способ уменьшить проблемы при портировании в будущем – это написать код, который одновременно совместим и с Python 2.7, и 3.2+ . С новыми модулями работать не так уж сложно, и, как правило, существующие модули можно перенести за несколько минут работы.
В двух словах – изменение некоторых вещей в стиле программирования сейчас может облегчить миграцию в будущем. Вот некоторые практические предложения из опыта:
Используйте все опции Python3 “from __future__ import …”.
Явно закрывайте все файлы при помощи close (), когда заканчиваете работу с ними.
Начните думать о строках как о различных типах (unicode или bytes), основываясь на их использовании, даже если все они сейчас типа str. Другими словами, считайте весь текст объектами unicode и все данные как bytes, и пишите свой код соответственно.
Используйте функцию bytes () вместо str () для преобразования в данных. Это просто псевдоним для str, но для Python3 это будет нужно изменить в любом случае. Продолжайте использовать str () для преобразования объектов, которые представляют собой читаемый текст, а не данные.
Используйте модуль six (https://pypi.python.org/pypi/six) или похожий, чтобы нивелировать некоторые другие различия между Python2 и Python3. Например, вместо использования «isinstance (obj, basestring)» можно использовать «isinstance (obj, six.string_types)». Модуль six также помогает работать с модулями или классами, которые изменили имена или местоположения в стандартной библиотеке. К сожалению, трудно запомнить все, для чего использовать в six, пока не получите ошибки в Python3.
Эти и другие методы, которые помогут написать код, совместимый с Python 2.7 и Python 3 обсуждаются в этом превосходном резюме документации Python. https://docs.python.org/3/howto/pyporting.html
Также см. шпаргалку http://python-future.org/compatible_idioms.html и книгу “Supporting Python”