Михаил Коробов: Как перейти на python 3
TRANSCRIPT
Как перейти на Python 3
PyCon Russia 2013,Михаил Коробов
Минутка саморекламы
● 20 своих open-source библиотек, которые поддерживают 2.х и 3.х;
● добавил поддержку Python 3 в несколько небольших сторонних open-source библиотек;
● по гранту PSF добавил поддержку Python 3 в NLTK (https://github.com/nltk/nltk)
Зачем переходить?
Python 2.x не улучшается уже почти 3 года.
В чем проблема-то?
● Переводить код с 2.х на 3.х достаточно несложно;
● можно начинать новые проекты на 3.х;● есть утилиты 2to3, python-modernize и
другие;● обновление программ - привычное дело.
"Проблема": > 20 тыс. библиотек
... всем бы такие проблемы.
Выход: научиться портировать библиотеки
Что значит "портировать библиотеку"?
Какие версии Python поддерживать?
Какие версии Python поддерживать?
● 2.6● 2.7● 3.2● 3.3+
tox.ini
[tox]envlist = py26,py27,py32,py33,pypy
[testenv]deps = pytestcommands= py.test []
Стратегии поддержки Python 3
1. Две версии кода;2. генерация кода для 3.x с помощью 2to3;3. исходный код, работающий под 2.х и 3.х;4. Cython.
Генерация кода под 3.х
● Официально рекомендованный способ;● утилита/библиотека 2to3.
Примеры:● numpy;● scipy;● tornado;● jinja2;● SQLAlchemy.
Генерация кода под 3.х
● Официально рекомендованный способ;● утилита/библиотека 2to3.
Примеры:● numpy;● scipy;● tornado;● jinja2;● SQLAlchemy (?).
Один исходный код
● Оказалось, что это возможно и практично;● __future__ импорты очень помогают;● библиотеки six и python-modernize.
Примеры:● pip, virtualenv;● django;● pyramid;● requests
Cython
Подходит для C/C++ - расширений.
Примеры:● lxml;● pyzmq
Практические руководства
● http://docs.python.org/dev/howto/pyporting.html● http://python3porting.com/● https://docs.djangoproject.com/en/dev//topics/python3/● http://packages.python.org/six/
План действий(один из возможных)
1. Тесты
● Тесты должны быть;● они должны работать;● их должно быть достаточно.
2. Python 2.5 - не поддерживать
● __future__ - импорты;● except Exception as e;● b'foo';● io;● и т.д.
3. "Осовременить" код под 2.хfrom __future__ import absolute_importfrom __future__ import unicode_literalsfrom __future__ import print_functionfrom __future__ import division
except Exception as e:
4. Ввод-вывод
● Разобраться, как в библиотеке организован ввод-вывод;
● для текстовых данных - "внутри" работать с unicode;
● кодировать-декодировать данные только при общении с "внешним миром".
5. Добавить поддержку Python 3
● В tox.ini добавтить Python 3;● если тесты падают, исправлять это.
5. Добавить поддержку Python 3
Если выполнены пункты 1-4, то тесты уже должны "почти" работать.
Спасибо.