Python 3.10

Python 3.10.0 (final) был выпущен 4 октября 2021 года. Возможности версии 3.10 описаны в PEP 619, а подробное описание изменений можно найти в What’s New in Python 3.10.

Новые синтаксические возможности

Статус

PEP 634

Структурное сопоставление с образцом: спецификация

[1]

PEP 635

Структурное сопоставление с образцом: мотивация и обоснование

[1]

PEP 636

Структурное сопоставление с образцом: руководство

[1]

bpo-12782

Контекстные менеджеры в скобках теперь официально разрешены

Новые возможности стандартной библиотеки

PEP 618

Добавление необязательной проверки длины в zip

Улучшения интерпретатора

PEP 626

Точные номера строк для отладки и других инструментов

Новые возможности аннотаций типов

PEP 604

Возможность записи объединений типов в виде X | Y

PEP 613

Явные псевдонимы типов

PEP 612

Переменные спецификации параметров

Важные устаревания, удаления или ограничения

PEP 644

Требуется OpenSSL 1.1.1 или новее

PEP 632

Объявление модуля distutils устаревшим.

Не относится

PEP 623

Объявление устаревшим и подготовка к удалению члена wstr в PyUnicodeObject.

Не относится

PEP 624

Удаление API кодировщиков Py_UNICODE

Не относится

PEP 597

Добавление необязательного EncodingWarning

Прочие изменения языка:

Тип int получил новый метод int.bit_count(), возвращающий количество единиц в двоичном представлении заданного целого числа, также известное как счётчик населённости (population count).

Представления, возвращаемые методами dict.keys(), dict.values() и dict.items(), теперь все имеют атрибут mapping, который предоставляет объект types.MappingProxyType, оборачивающий исходный словарь.

PEP 618: функция zip() теперь имеет необязательный флаг strict, используемый для требования, чтобы все итерируемые объекты имели одинаковую длину.

Встроенные функции и функции расширений, принимающие целочисленные аргументы, больше не принимают Decimal, Fraction и другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод __int__(), но не имеющие метода __index__()).

Если object.__ipow__() возвращает NotImplemented, оператор корректно откатится к object.__pow__() и object.__rpow__(), как и ожидается.

Выражения присваивания теперь можно использовать без скобок в литералах множеств и генераторах множеств, а также в индексах последовательностей (но не в срезах).

Функции получили новый атрибут __builtins__, который используется для поиска встроенных символов при выполнении функции вместо обращения к __globals__['__builtins__']. Атрибут инициализируется из __globals__["__builtins__"], если он существует, иначе из текущих встроенных символов.

Добавлены две новые встроенные функции — aiter() и anext(), предоставляющие асинхронные аналоги iter() и next() соответственно.

Статические методы (@staticmethod) и методы класса (@classmethod) теперь наследуют атрибуты метода (__module__, __name__, __qualname__, __doc__, __annotations__) и имеют новый атрибут __wrapped__. Более того, статические методы теперь можно вызывать как обычные функции.

Аннотации для сложных целей (всё, кроме целей simple name, определённых в PEP 526) больше не вызывают каких-либо эффектов во время выполнения при использовании from __future__ import annotations.

Объекты классов и модулей теперь лениво создают пустые словари аннотаций по требованию. Словари аннотаций хранятся в __dict__ объекта для обратной совместимости. Это улучшает рекомендуемые практики работы с __annotations__.

Аннотации, состоящие из yield, yield from, await или именованных выражений, теперь запрещены при from __future__ import annotations из-за их побочных эффектов.

Использование несвязанных переменных, super() и других выражений, которые могут изменить обработку таблицы символов, в качестве аннотаций теперь не имеет эффекта при from __future__ import annotations.

Хеши значений NaN как типа float, так и типа decimal.Decimal теперь зависят от идентичности объекта. Ранее они всегда хешировались в 0, хотя значения NaN не равны друг другу. Это приводило к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хешей при создании словарей и множеств, содержащих несколько значений NaN.

При удалении константы __debug__ теперь будет возбуждаться SyntaxError (вместо NameError).

Исключения SyntaxError теперь имеют атрибуты end_lineno и end_offset. Они будут равны None, если не определены.

Изменения во встроенных модулях:

asyncio

Добавлен отсутствовавший метод connect_accepted_socket().

array

Метод index() класса array.array теперь имеет необязательные параметры start и stop.

gc

Добавлены аудиторские перехватчики для gc.get_objects(), gc.get_referrers() и gc.get_referents().

hashlib

Модуль hashlib требует OpenSSL 1.1.1 или новее.

Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0.

Чисто-Python реализация pbkdf2_hmac() в качестве запасного варианта объявлена устаревшей. В будущем PBKDF2-HMAC будет доступен только при сборке Python с поддержкой OpenSSL.

os

Добавлена поддержка os.cpu_count() для VxWorks RTOS.

Добавлена новая функция os.eventfd() и связанные с ней вспомогательные средства для обёртки системного вызова eventfd2 в Linux.

Добавлена функция os.splice(), позволяющая перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и адресным пространством пользователя, причём один из файловых дескрипторов должен ссылаться на канал.

Добавлены O_EVTONLY, O_FSYNC, O_SYMLINK и O_NOFOLLOW_ANY для macOS.

platform

Добавлена функция platform.freedesktop_os_release() для получения идентификации операционной системы из стандартного файла freedesktop.org os-release.

socket

Исключение socket.timeout теперь является псевдонимом TimeoutError.

Добавлена возможность создания сокетов MPTCP с помощью IPPROTO_MPTCP.

Добавлена опция IP_RECVTOS для получения полей типа обслуживания (ToS) или DSCP/ECN.

ssl

Модуль ssl требует OpenSSL 1.1.1 или новее.

Модуль ssl имеет предварительную поддержку OpenSSL 3.0.0 и новую опцию OP_IGNORE_UNEXPECTED_EOF.

Использование устаревших функций и устаревших констант теперь приводит к DeprecationWarning. Атрибут ssl.SSLContext.options имеет установленные по умолчанию OP_NO_SSLv2 и OP_NO_SSLv3 и поэтому не может предупреждать о повторной установке флага.

Модуль ssl теперь имеет более безопасные настройки по умолчанию. Шифры без прямой секретности или с MAC на основе SHA-1 отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с уровнем безопасности менее 112 бит. SSLContext по умолчанию использует минимальную версию протокола TLS 1.2. Настройки основаны на исследовании Хайнека Шлавака (Hynek Schlawack).

Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python не блокирует их активно. Однако опции сборки OpenSSL, конфигурации дистрибутивов, патчи поставщиков и наборы шифров могут препятствовать успешному рукопожатию.

Добавлен параметр timeout в функцию ssl.get_server_certificate().

Модуль ssl использует типы из кучи и многофазную инициализацию.

Добавлен новый флаг проверки VERIFY_X509_PARTIAL_CHAIN.

sys

Добавлен атрибут sys.orig_argv: список исходных аргументов командной строки, переданных исполняемому файлу Python.

Добавлен атрибут sys.stdlib_module_names, содержащий список имён модулей стандартной библиотеки.

_thread

_thread.interrupt_main() теперь принимает необязательный номер сигнала для имитации (по умолчанию по-прежнему signal.SIGINT).

Примечания