Python 3.10

Python 3.10.0 (фінальний реліз) вийшов 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(), що повертає кількість одиниць у двійковому поданні заданого цілого числа, відомого також як кількість заповнених бітів.

Подання, що повертаються методами dict.keys(), dict.values() та dict.items(), тепер мають атрибут mapping, який надає об’єкт types.MappingProxyType, що огортає оригінальний словник.

PEP 618: Функція zip() тепер має необов’язковий прапор strict, який використовується для перевірки того, що всі ітеровані об’єкти мають однакову довжину.

Вбудовані та розширені функції, що приймають цілочисельні аргументи, більше не приймають Decimals, Fractions та інші об’єкти, які можна перетворити в цілі числа лише з втратою (наприклад, ті, що мають метод __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(), що дозволяє переміщувати дані між двома файловими дескрипторами без копіювання між адресним простором ядра та адресним простором користувача, де один з файлових дескрипторів повинен посилатися на канал (pipe).

Додавання 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 тепер має більш безпечні налаштування за замовчуванням. Шифри без прямої секретності або з SHA-1 MAC вимкнені за замовчуванням. Рівень безпеки 2 забороняє слабкі ключі RSA, DH та ECC з менш ніж 112 бітами безпеки. SSLContext за замовчуванням використовує мінімальну версію протоколу TLS 1.2. Налаштування засновані на дослідженні Хінека Шлавака.

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

Додавання параметра timeout до функції ssl.get_server_certificate().

Модуль ssl використовує heap-типи та багатофазну ініціалізацію.

Додано новий прапор перевірки VERIFY_X509_PARTIAL_CHAIN.

sys

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

Додавання sys.stdlib_module_names, що містить список назв модулів стандартної бібліотеки.

_thread

_thread.interrupt_main() тепер приймає необов’язковий номер сигналу для імітації (за замовчуванням все ще signal.SIGINT).

Примітки