Киллер-фичи Python 3

January 22, 2015

Когда человек впервые смотрит на различия Python 2 и Python 3, то первым делом он замечает, что print() теперь функция, а не оператор. Я хочу показать немного больше отличий, что бы Вы понимали, что пора переходить на свежую версию Python.

Строки

В Python 3 строки стали только Unicode. Кодровка по умолчанию – Utf-8. Это очень удобно, особенно, если вы постоянно работаете с кириллицей. Так же, это спасает от постояных ошибок, связанных со смешиванием закодированного и декодированного текстов. Можно больше не использовать литерал u"...", но все еще нужно использовать литерал b"...".

Для хранения текста используется тип - str, а для хранения данных - bytes. Неявные преобразования str-bytes запрещенны. Это защищает от частых ошибок в коде.

Числа

В Python 2 были 2 типа целых чисел - int и long. В Python 3 остался только long, но называется от теперь int. Теперь при умножении числа или возведении его в степень, оно не может поменять тип.

Поскольку вещественные числа (float) неточны, при работе с деньгами в Python необходимо использовать тип Decimal. Так вот, в Python 3 он стал работать в 20-120 раз быстрее, так как переписан с Python на С.

Аннотации функций

В Python 3 появилась аннотация аргументов и возвращемых значений функций. Выглядит это примерно так:

>>> func.__annotations__
{'b': <class 'float'>, 'return': <class 'str'>, 'a': <class 'int'>}

Более того, аннотацией может быть не только тип, а и число, строка и вычисление. Например:

>>> def func(name: 'Name of Stutent'):
...     pass

Вывод: аннотации функций дают “плюс” к удобству работе в IDE и “плюс” к структуррированию документации кода.

Nonlocal

Из внутренней функции в Python 2 нельзя менять переменные во внешней. В Python 3 можно. Далее код нетребующий поснений:

>> def f():
...     a = 10
...     def g():
...         nonlocal a
...         a += 1
...     g()
...     return a
... 
>>> f()
11

Отличия от global в том, что global засталяет интерпретатор искать имя в пространстве имен всего модуля, а nonlocal – вверх по функциям, в которых он объявлен.

Keyword only

Все что идет после * можно указывать только явно, то есть по имени. Очень повышает читаемость кода.

>>> def func(a, b, *, c, d=10):
...     return a, b, c, d
... 
>>> func(1,2,c=3,d=4)
(1, 2, 3, 4)
>>> func(1,2,d=4,c=3)
(1, 2, 3, 4)
>>> func(1,2,c=3)
(1, 2, 3, 10)
>>> func(1,2,3,4)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: func() takes 2 positional arguments but 4 were given
>>> func(1,2)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: func() missing 1 required keyword-only argument: 'c'

Extended Iterable Unpacking

Тут обяснений явно не нужно:

>>> a, *spam, b = '1,2,3,4,5'.split(',')
>>> a
'1'
>>> b
'5'
>>> spam
['2', '3', '4']

Новый super()

super() теперь можно вызывать без аргументов, так как класс и экзампляр будут выбраны автоматичести.

Новый GIL

В Python 3.2 появился новый GIL который лучше работает. Теперь потоки спят и ждут GIL не 100 тиков (что может быть очень долго), а 5 мс. В результате, вероятность того, что многопоточное приложение будет работать дольше однопоточного крайне мала и холливарные статьи на эти темы можно забыть.

Детальнее об этом я постараюсь рассказать в отдельной статье.

В заключение Python 3 приобрел массу крутых плюшек и однозначно всем пора перейти на него. Конечно, остается проблема с библиотеками, которые не поддерживают 3-ю версию языка, но уже достаточно много библиотек исправлены. Что бы искоренить эту проблему, старые библиотеки нужно портировать, а новые изначально писать на Python 3.

Полный список нововведений: Python 3.0, 3.1, 3.2, 3.3, 3.4.

P.S. Буду рад вопросам, идеям и замечаниям в комментариях и подписчикам в моем мини-блоге.

comments powered by Disqus