Python

Что нового ожидает нас в этой версии и в будущих релизах?

Вышел полный релиз Python 3.9!

Очевидно, что эта версия знаменует собой переломный момент в эволюции Python. Мы рассмотрим:

> Новый вектор развития Python

- Смена парсера

- Цикл обновлений

> Новый функционал

- Подсказки типов

- Новые строковые методы

- Объединение словарей

> Новый вектор развития Python

- Смена парсера

- Цикл обновлений

> Новый функционал

- Подсказки типов

- Новые строковые методы

- Объединение словарей

Новый вектор развития Python

В этом релизе есть два важных обновления, которые не приведут к резким переменам, но направят эволюцию Python как языка программирования в немного ином направлении.

В двух словах, суть обновлений заключается в:

  • новом парсере Python;
  • менее глобальном, но более частом выпуске релизов.

LL(1) и PEG

Около 30 лет назад Гвидо ван Россум создал один из первых фрагментов кода, когда-либо написанных для Python  —  pgen. Он до сих пор используется в качестве синтаксического анализатора Python.

Pgen использует грамматику, основанную на LL(1), то есть парсер LL(1) анализирует код сверху вниз, слева направо с возможностью просмотра только одного токена.

Это по существу означает, что разработка новых возможностей Python ограничена, потому что:

  • LL(1) анализирует только один токен, что не позволяет создавать хорошую грамматику.
  • Python уже содержит грамматику non-LL(1). То есть текущий парсер использует слишком много обходных путей, чрезмерно усложняя процесс.
  • Даже при наличии обходных путей возможности ограничены. Правила можно обойти, но не нарушить.
  • С помощью LL(1) конкретный леворекурсивный синтаксис может вызвать бесконечный цикл в дереве синтаксического анализа, вызывая переполнение стека.

Эти особенности LL(1) ограничивают потенциал развития Python.

Python 3.9 вырвался из этих ограничений благодаря блестящему новому парсеру PEG, описанному в рамках PEP 617.

Сразу же мы этого не заметим. Никакие изменения, использующие преимущества нового синтаксического анализатора, не будут внесены до выхода Python 3.10, но после этого язык будет освобожден от оков LL(1).

Цикл обновлений

Расписание релизов Python. Обновления будут выходить через 12 месяцев, а не 18.

До выпуска Python 3.9 новая версия языка выходила раз в полтора года, а теперь она будет появляться раз в год [PEP 602]. Что это значит:

  • В релизах будет меньше нового функционала.
  • Изменения будут постепенными, однако выпуск новых функций и исправление ошибок будет происходить быстрее.
  • Более стабильный график релизов. Теперь мы знаем, что новый Python будет выходить каждый октябрь!

Таким образом, разработчики фактически делают фокус на небольших, но постепенных изменениях ежегодно, а не на глобальных обновлениях через каждые полтора года. В то же время ожидается, что скорость развития останется прежней.

Новый функционал

Наряду с этими организационными изменениями версия 3.9 порадует нас некоторыми новыми функциями!

Подсказки типов

В далеком 2008 году Python 3 представил средства для аннотирования функций  —  предшественников подсказок типов. Они были не идеальны, но это было только начало.

Текущее состояние подсказок типов в Python является совокупным результатом многих дополнений и модификаций аннотаций и пакета typing.

Впоследствии были добавлены новые функции. Сейчас релиз 3.9 объединяет все эти различные функции вместе с аккуратным новым синтаксисом.

Мы можем легко указать ожидаемые типы данных переменных. Если мы затем напишем что-то бессмысленное, например попытаемся преобразовать строку в целое число, редактор обнаружит проблему.

Программа не выдаст сообщение об ошибке (к сожалению), но в любом случае очень поможет в работе с большими объемами кода. Давайте взглянем на новый синтаксис.

В Python можно складывать две строки с помощью +. Таким образом, в данной функции add_int, соединяющей две одинаковые строки, ошибка не возникнет:

Старая версия без подсказок типов (слева), Python 3.9 с подсказками типов (справа).

При помощи нового функционала мы просто указываем ожидаемый тип как : int, и редактор немедленно обнаруживает ошибку:

Указываем ожидаемый тип входных и выходных данных.

Мы также можем использовать синтаксис -> type, чтобы получить сведения об ожидаемых типах:

Мы можем объединить различные типы, чтобы создать более сложные аннотации.

И мы не ограничены одними лишь простыми, стандартными типами!

Строковые методы

Это изменение не такое впечатляющее, как остальные, но тем не менее пользуются строковыми методами часто. Появились два новых метода удаления строковых префиксов и суффиксов:

"foo bar".removeprefix("fo")

[Out]: 'o bar'

"foo bar".removesuffix("ar")

[Out]: 'foo b'

Объединение cловарей

Теперь у нас появились два новых оператора для объединения словарей.

Это оператор слияния |:

a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}

c = a | b
print(c)

[Out]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

И оператор обновления, который выполняет слияние, обновляя существующий словарь:

a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}

a |= b
print(a)

Ожидание того стоит

В будущем Python ждет много других полезных изменений. Будет интересно наблюдать, как язык развивается с новым циклом обновлений и синтаксическим анализатором.

Переходите по ссылке для установки!

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи James Briggs: Python 3.9