5 октября Python Software Foundation выпустила Python 3.9. Раньше команда Python придерживалась 18-месячного цикла разработки и выпуска, но теперь перешла на годовой цикл. Python 3.9 внес существенные изменения как в сам язык, так и в способы его разработки.
Python переходит на годовой цикл выпуска
До этого момента Python разрабатывался и выпускался с периодичностью в восемнадцать месяцев.
Переход на годовой цикл означает, что в каждом выпуске будет меньшее количество функций, но при этом пользователи получат более быструю обратную связь по тестированию функций и меньше потенциально критических изменений. Следовательно, у пользователей и менеджеров дистрибутивов появится больше стимулов к частому обновлению Python. Это также означает, что внедрение новых функций займет не так много времени.
Новая временная шкала показывает, что Python 3.10, который 19 мая 2020 года официально перешел на стадию предварительной разработки альфа-версии, будет выпущен в октябре 2021 года.
Введение парсера на основе PEG
Python 3.9 предлагает заменить текущий синтаксический анализатор на основе LL(1) на высокопроизводительный и более стабильный синтаксический анализатор грамматики PEG. Эта замена снимет текущее ограничение грамматики LL(1). Синтаксический анализатор PEG отличается от своего предшественника тем, что не зависит от контекста, и оператор выбора упорядочен.
Код старого парсера пока сохранен и может быть восстановлен при помощи флага «-X oldparser» или переменной окружения «PYTHONOLDPARSER=1». Но в выпуске 3.10 он будет удалён.
Улучшения многопроцессорности и AsyncIO
В многопроцессорность и asyncIO было внесено много именений. Например, параметр reuse_address из asyncio.loop.create_datagram_endpoint() удален из соображений безопасности. Кроме того, говоря о библиотеке multiprocessing, в класс multiprocessing.SimpleQueue был добавлен новый метод close() для явного закрытия очереди.
Изменения словаря и строковых функций
Python вводит два новых оператора слияния | и |= для словаря. Один для объединения двух словарей в новый словарь, а другой для обновления содержимого одного словаря другим словарем. Конфликты ключей будут разрешены путем сохранения самого правого значения, которое соответствует текущему поведению аналогичных операций dict, где последнее обнаруженное значение является более важным.
Что касается строк, были добавлены две новые функции. Первая str.removeprefix(префикс) может использоваться для удаления префикса, тогда как str.removesuffix(суффикс) может использоваться для удаления суффикса. Ожидается, что с введением новых функций API станет более последовательным, описательным и стабильным.
Поддержка часового пояса IANA
Модуль Zoneinfo предназначен для поддержки базы данных часовых поясов IANA, которая теперь добавлена в стандартную библиотеку. По умолчанию модуль zoneinfo будет использовать часовой пояс системы. Однако, если часовой пояс системы недоступен, библиотека будет применять tzdata в качестве часового пояса.
Повышенная скорость
Python 3.9 включает два больших обновления, которые повышают производительность без изменений в существующем коде.
Первое связано с использованием протокола vectorcall, представленного в Python 3.8. Vectorcall ускоряет вызовы многих общих функций за счет минимизации или исключения временных объектов, созданных для вызова. В Python 3.9 функция vectorcall была расширена для нескольких встроенных модулей, таких как range, tuple, set, frozenset, list и dict.
Вторым важным средством повышения производительности является новый инструмент анализа исходного кода Python. Новый анализатор для выполнения CPython устраняет внутренние несоответствия и обеспечивает быстрый синтаксический анализ для больших объемов кода.
Новые операции типа Python
В новой версии Python программы аннотаций были упрощены за счет удаления иерархии параллельных типов. Теперь он включает поддержку универсального синтаксиса во всех стандартных коллекциях. Вместо typing.List или typing.Dict в сигнатуре функции можно использовать встроенные типы коллекций list или dict в качестве универсальных типов.
Декораторы теряют некоторые ограничения
Декораторы позволяют оборачивать функции Python, чтобы программно изменять их поведение. Ранее декораторы могли состоять только из символа @, имени (например func) или имени, разделенного точками (func.method), и одного вызова (func.method(arg1, arg2)). Одним из давних способов обойти это ограничение было создание функции или лямбда-выражения, которое заменяло более сложное выражение при использовании в качестве декоратора.
В Python 3.9 декораторы теперь могут состоять из любого допустимого выражения.
Улучшения внутреннего устройства Python
Очистка, доработка и модернизация внутренних компонентов Python – это то, над чем постоянно работают разработчики Python. В Python 3.9 есть пара таких изменений:
Переработка способа взаимодействия модулей с импортированным кодом. Модули расширения Python, написанные на C, теперь могут использовать новый механизм загрузки, который заставляет их вести себя больше как обычные модули Python при импорте.
Несколько модулей в стандартной библиотеке Python уже поддерживают это поведение: abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref.
Новый механизм загрузки не только позволяет Python более гибко обрабатывать модули расширения, но также предоставляет новые возможности, такие как расширенное поведение подключения.
Стабильный внутренний ABI для CPython. Исторически каждая крупная версия Python была несовместима с ABI предыдущих версий, что требовало перекомпиляции модулей расширения для каждой новой версии. С этого момента любые модули расширения, использующие стабильный ABI, будут работать в версиях Python.
В Python 3.9 следующие модули стандартной библиотеки используют стабильный ABI: audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib.
Brython 3.9
6 октября был опубликован релиз проекта Brython 3.9, который представляет собой реализацию языка Python 3 для выполнения на стороне web-браузера. Он позволяет использовать Python вместо JavaScript в качестве языка сценариев для Интернета. Brython адаптирован к среде HTML5 с интерфейсом для объектов и событий DOM.
Скорость выполнения аналогична CPython для большинства операций. Библиотеки brython.js и brython_stdlib.js дают возможность использовать язык Python для определения логики работы сайта на стороне клиента. Для включения Python-кода на страницы применяется тег <script> с mime-типом text/python.
Напомним, что в июле этого года Python обогнал Java в рейтинге языков программирования Developer Ecosystem Survey 2020.