Портируем на Python 3

23
ПОРТИРУЕМ НА PYTHON 3 Wargaming.net Nikita Grishko

description

Почему стоит все чаще задумывать о поддержке Python 3 и с какими проблемами можно столкнуться при портировании. Рассмотрим на примерах из Sentry (https://github.com/getsentry/sentry) как добавить поддержку Python 3 с использованием 2to3 (http://docs.python.org/3.3/library/2to3.html), tox (http://tox.readthedocs.org/en/latest/) и six (http://pythonhosted.org/six/). Автор: Никита Гришко (Wargaming.net)

Transcript of Портируем на Python 3

Page 1: Портируем на Python 3

ПОРТИРУЕМ НА PYTHON 3

Wargaming.net

Nikita Grishko

Page 2: Портируем на Python 3

ЗАЧЕМ НАМ PYTHON 3?

Page 3: Портируем на Python 3

ЗАЧЕМ НАМ PYTHON 3?летом 2010 последний релиз ветки 2.х с новыми фичамив 2.х только исправления ошибокулучшения в стандартную библиотеку не вносятся

Page 4: Портируем на Python 3

ЗАЧЕМ НАМ PYTHON 3?Asynchronous IO Support (PEP-3156)

yield from (PEP-0380)

Function Annotations (PEP-3107)

...

Page 5: Портируем на Python 3

ЧТО ДЕЛАТЬ ССУЩЕСТВУЮЩИМ КОДОМ?

Нельзя все сразу переписать с 2.x на 3.x, т.к. большинствокода пишется на 2.х

Page 6: Портируем на Python 3

С ЧЕГО НАЧАТЬ?

Page 7: Портируем на Python 3

С ЧЕГО НАЧАТЬ?1. Нужны тесты!

Page 8: Портируем на Python 3

С ЧЕГО НАЧАТЬ?1. Нужны тесты!2. Много хороших тестов!

Page 9: Портируем на Python 3

С ЧЕГО НАЧАТЬ?1. Нужны тесты!2. Много хороших тестов!3. Поддерживать версии: py26, py27, py32+, pypy?

Page 10: Портируем на Python 3

2TO3официально рекомендованный способ (PEP-3000)входит в стандартную поставкуавтоматические генерирует 3.х код, что довольно удобно

Page 11: Портируем на Python 3

2TO3 МИНУСЫработает не всегда корректно

Page 12: Портируем на Python 3

2TO3 МИНУСЫ@@ -314,7 +314,7 @@ tags.append((k, v)) data['tags'] = tags

- for k in data.keys():+ for k in list(data.keys()): if k in RESERVED_FIELDS: continue

Page 13: Портируем на Python 3

2TO3 МИНУСЫ@@ -147,7 +147,7 @@ if worker not in default_servers: raise CommandError( 'Unsupported udp server type; expected one of %s, but got "%s".'- % (', '.join(default_servers.keys()), worker))+ % (', '.join(list(default_servers.keys())), worker))

return default_servers[worker]

Page 14: Портируем на Python 3

2TO3 МИНУСЫ@@ -75,7 +75,7 @@

# Ensure values are unique, do not contain already present values, and # values specified in select_related- values = set(filter(None, (getattr(o, column) for o in objects)))+ values = set([_f for _f in (getattr(o, column) for o in objects) if _f]) if values: qs = model.objects if database:

Page 15: Портируем на Python 3

2TO3 МИНУСЫработает не всегда корректнодве ветки

Page 16: Портируем на Python 3

2+3Mожно писать код который будет одновременно работать

как на 2.x так и на 3.х.

Примеры: django, virtualenv, requests, ... .

Page 17: Портируем на Python 3

2+3 ПОМОЩНИКИ

Page 18: Портируем на Python 3

2+3 ПОМОЩНИКИtox (http://tox.readthedocs.org/)

Page 19: Портируем на Python 3

2+3 ПОМОЩНИКИtox (http://tox.readthedocs.org/)__future__ импорты(http://docs.python.org/2/library/__future__.html)

Page 20: Портируем на Python 3

2+3 ПОМОЩНИКИtox (http://tox.readthedocs.org/)__future__ импорты(http://docs.python.org/2/library/__future__.html)six (http://pythonhosted.org/six/)

Page 21: Портируем на Python 3

ЧТО ДАЛЬШЕ?pull requestsissues

Page 22: Портируем на Python 3

ЕЩЕ ИНТЕРЕСНОЕhttp://www.slideshare.net/it-people/ekbpy2012-python-3http://www.slideshare.net/it-people/python-3-16964834

Page 23: Портируем на Python 3

ВОПРОСЫ?NIKITA GRISHKO / HTTPS://GITHUB.COM/GR1N