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

Nikita Grishko

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.х

С чего начать?

  1. Нужны тесты!
  2. Много хороших тестов!
  3. Поддерживать версии: 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