Выпуск языка программирования Python 3.9
6 октября 2020 года
После года разработки представлен значительный выпуск языка программирования Python 3.9. Python 3.9 стал первым выпуском после перехода проекта на новый цикл подготовки и сопровождения релизов. Новые значительные выпуски теперь будут формироваться раз в год, а корректирующие обновления выпускаться раз в два месяца. Каждая значительная ветка будет поддерживаться в течение полутора лет, после чего ещё три с половиной года для неё будут формироваться исправления с устранением уязвимостей.
Работа над новой веткой теперь начинается за пять месяцев до релиза очередной ветки, т.е. одновременно с выпуском Python 3.9 началось альфа-тестирование ветки Python 3.10. Ветка Python 3.10 будет находиться на стадии альфа-выпусков в течение семи месяцев, во время которых будут добавляться новые возможности и производиться исправление ошибок. После этого в течение трёх месяцев будет проводиться тестирование бета-версий, во время которого добавление новых возможностей будет запрещено и всё внимание будет уделяться исправлению ошибок. Последние два месяца перед релизом ветка будет находится на стадии кандидата в релизы, на которой будет выполнена финальная стабилизация.
Среди добавленных новшеств в Python 3.9:
- В словарях, определённых при помощи встроенного класса dict, появилась поддержка операторов слияния "|" и обновления "|=", которые дополняют методы {**d1, **d2} и dict.update, ранее предлагавшиеся для объединения словарей. >>> x = {"key1": "value1 from x", "key2": "value2 from x"} >>> y = {"key2": "value2 from y", "key3": "value3 from y"} >>> x | y {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'} >>> y | x {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
- Во встроенную коллекцию типов включены list, dict и tuple, которые можно использовать как базовые типы без импорта из модуля typing. Т.е. вместо typing.List, typing.Dict и typing.Tuple теперь можно указывать просто list, dict и tuple: def greet_all(names: list[str]) - None: for name in names: print("Hello", name)
- Предоставлены гибкие средства для аннотирования функций и переменных. Для прикрепления аннотаций в модуль typing добавлен новый тип Annotated, расширяющий существующие типы дополнительными метаданными, которые могут использоваться при статическом анализе или для оптимизаций во время выполнения. Для доступа к метаданным из кода в метод typing.get_type_hints() добавлен параметр include_extras. charType = Annotated[int, ctype("char")] UnsignedShort = Annotated[int, struct2.ctype('H')]
- Смягчены грамматические требования к декораторам - любое выражение, подходящее для использование в блоках if и while, теперь может быть использовано как декоратор. Изменение позволило заметно улучшить читаемость кода PyQt5 и упростить сопровождение данного модуля: Было: @buttons[0].clicked.connect Теперь можно писать: button_0 = buttons[0] @button_0.clicked.connect
- В стандартную библиотеку добавлен модуль zoneinfo, включающий информацию из базы часовых поясов IANA.
- Предложены новые методы для удаления префиксов и окончаний строк - str.removeprefix(prefix) и str.removesuffix(suffix). Методы добавлены в объекты str, bytes, bytearray и collections.UserString. >>> s = "FooBar" >>> s.removeprefix("Foo") 'Bar'
- Задействован новый парсер PEG (Parsing Expression Grammar), который пришёл на смену парсеру LL(1). Применение нового парсера позволило избавиться от некоторых "хаков", используемых для обхода ограничений в LL(1), и существенно снизило трудозатраты на сопровождение парсера. По производительности новый парсер находится примерно на одном уровне с прошлым, но значительно опережает его в плане гибкости, что позволяет более свободно чувствовать себя при проектировании новых возможностей языка. Код старого парсера пока сохранён и может быть возвращён при помощи флага "-X oldparser" или переменной окружения "PYTHONOLDPARSER=1", но будет удалён в выпуске 3.10.
- Предоставлена возможность доступа методов Си-расширений к состоянию модулей, в которых они определены, с применением прямого разыменования указателей вместо поиска состояния модуля при помощи функции PyState_FindModule. Изменение позволяет повысить производительность модулей на Си за счёт снижения или полного исключения накладных расходов на проверку состояния модуля. Для ассоциирования модуля с классом предложена Си-функция PyType_FromModuleAndSpec(), для получения модуля и его состояния Си-функции PyType_GetModule() и PyType_GetModuleState(), а для предоставления методу доступа к классу, в котором он определён, Си-функция PyCMethod и флаг METH_METHOD.
- Сборщик мусора избавлен от блокировки коллекций, включающих воскрешённые объекты, которые остаются доступными извне после запуска финализатора.
- Добавлен метод os.pidfd_open, позволяющий использовать подсистему ядра Linux "pidfd" для обработки ситуации с повторным использованием PID (pidfd связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID).
- Поддержка спецификации Unicode обновлена до версии 13.0.0.
- В модуле graphlib реализована поддержка топологического поиска в графе.
- Устранена утечка памяти при повторной инициализации интерпретатора Python в одном процессе.
- Проведена оптимизация производительности встроенных типов range, tuple, set, frozenset, list и dict, реализованная за счёт применения протокола быстрого вызова Vectorcall для более быстрого обращения к объектам, написанным на языке Си.
- Модули _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time и _weakref переведены на загрузку с инициализацией в несколько стадий.
- Модули стандартной библиотеки audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios и zlib переведены на использование ограниченного стабильного ABI, который решает проблему работоспособности сборок модулей-расширений для разных версий Python (при обновлении версии не требуется пересобирать модули-расширения, и модули собранные для 3.9, смогут работать в ветке 3.10).
Источники[править]
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии[править]
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.