Портируем на Python 3
Wargaming.net
Зачем нам Python 3?
- летом 2010 последний релиз ветки 2.х с новыми фичами
- в 2.х только исправления ошибок
- улучшения в стандартную библиотеку не вносятся
Зачем нам Python 3?
- Asynchronous IO Support (PEP-3156)
- yield from (PEP-0380)
- Function Annotations (PEP-3107)
- ...
Что делать с существующим кодом?
Нельзя все сразу переписать с 2.x на 3.x, т.к. большинство кода пишется на 2.х
С чего начать?
- Нужны тесты!
- Много хороших тестов!
- Поддерживать версии: py26, py27, py32+, pypy?
2to3
- официально рекомендованный способ (PEP-3000)
- входит в стандартную поставку
- автоматические генерирует 3.х код, что довольно удобно
2to3 минусы
- работает не всегда корректно
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
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]
2to3 минусы
@@ -75,7 +75,7 @@
# Ensure values are unique, do not contain already present values, and are not missing
# 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:
2to3 минусы
- работает не всегда корректно
- две ветки
2+3
Mожно писать код который будет одновременно работать как на 2.x так и на 3.х.
Примеры: django, virtualenv, requests, ... .
2+3 помощники
- tox (http://tox.readthedocs.org/)
- __future__ импорты (http://docs.python.org/2/library/__future__.html)
- six (http://pythonhosted.org/six/)
Что дальше?
- pull requests
- issues
Еще интересное
- http://www.slideshare.net/it-people/ekbpy2012-python-3
- http://www.slideshare.net/it-people/python-3-16964834
Вопросы?
Nikita Grishko / https://github.com/Gr1N
Porting to Py3k
By Nikita Grishko
Porting to Py3k
[25-10-2013] Python Meetup, Minsk
- 1,822