Документация Python неофициальный перевод

3.15.md

1513 строк · 233.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.16/whatsnew/3.15.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.1589**Редактор:**1011Hugo van Kemenade1213В этой статье описываются новые возможности Python 3.15 по сравнению с версией 3.14.1415Подробнее см. в [списке изменений](https://python-all.ru/3.16/whatsnew/changelog.html#changelog).1617> **Примечание**18>19> Пользователям предварительных версий следует знать, что этот документ пока является черновиком. Он будет существенно дорабатываться по мере приближения релиза Python 3.15, так что стоит заглядывать снова, даже если вы уже читали более ранние версии.2021## Итоги – основные изменения2223- [**PEP 810**](https://python-all.ru/3.16/whatsnew/3.15.html): [Явный ленивый импорт для ускорения запуска](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-lazy-imports)24- [**PEP 814**](https://python-all.ru/3.16/whatsnew/3.15.html): [Добавление встроенного типа frozendict](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-frozendict)25- [**PEP 661**](https://python-all.ru/3.16/whatsnew/3.15.html): [Добавление встроенного типа sentinel](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-sentinel)26- [**PEP 799**](https://python-all.ru/3.16/whatsnew/3.15.html): [Специализированный пакет профилирования для организации инструментов профилирования Python](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-profiling-package)27- [**PEP 799**](https://python-all.ru/3.16/whatsnew/3.15.html): [Tachyon: высокочастотный статистический семплирующий профилировщик](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-sampling-profiler)28- [**PEP 831**](https://python-all.ru/3.16/whatsnew/3.15.html): [Указатели кадров включены по умолчанию для улучшения наблюдаемости на уровне системы](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-frame-pointers)29- [**PEP 798**](https://python-all.ru/3.16/whatsnew/3.15.html): [Распаковка внутри включений](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-unpacking-in-comprehensions)30- [**PEP 686**](https://python-all.ru/3.16/whatsnew/3.15.html): [Python теперь использует UTF-8 в качестве кодировки по умолчанию](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-utf8-default)31- [**PEP 829**](https://python-all.ru/3.16/whatsnew/3.15.html): [Конфигурационные файлы запуска пакетов](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-startup-files)32- [**PEP 728**](https://python-all.ru/3.16/whatsnew/3.15.html): [TypedDict с типизированными дополнительными полями](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-typeddict)33- [**PEP 747**](https://python-all.ru/3.16/whatsnew/3.15.html): [Аннотирование типовых форм с помощью TypeForm](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-typeform)34- [**PEP 800**](https://python-all.ru/3.16/whatsnew/3.15.html): Непересекающиеся базовые классы в системе типов35- [**PEP 782**](https://python-all.ru/3.16/whatsnew/3.15.html): [Новый C API PyBytesWriter для создания объекта bytes в Python](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-pybyteswriter)36- [**PEP 803**](https://python-all.ru/3.16/whatsnew/3.15.html), [**820**](https://python-all.ru/3.16/whatsnew/3.15.html), [**793**](https://python-all.ru/3.16/whatsnew/3.15.html): [Стабильный ABI для free-threaded сборок](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-abi3t) и связанный C API37- [**PEP 788**](https://python-all.ru/3.16/whatsnew/3.15.html): [Защита от финализации в C API](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-c-api-interpreter-finalization)38- [JIT-компилятор был значительно обновлён](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-jit)39- [Официальные 64-битные сборки Windows теперь используют интерпретатор с хвостовыми вызовами](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-windows-tail-calling-interpreter)40- [Улучшенные сообщения об ошибках](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-improved-error-messages)41- [Больше цвета](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-more-color)4243## Новые возможности4445### [**PEP 810**](https://python-all.ru/3.16/whatsnew/3.15.html): Явные ленивые импорты4647Крупные приложения на Python часто страдают от медленного запуска. A значительный вклад в эту проблему вносит система импорта: при импорте модуля Python должен найти файл, прочитать его с диска, скомпилировать в байткод и выполнить весь код верхнего уровня. Для приложений с глубокими деревьями зависимостей этот процесс может занимать секунды, даже когда большая часть импортированного кода в конкретном запуске никогда не используется.4849Разработчики обходили это, перенося импорты внутрь функций, используя [`importlib`](https://python-all.ru/3.16/library/importlib.html#module-importlib) для загрузки модулей по требованию, или перестраивая код, чтобы избежать ненужных зависимостей. Эти подходы работают, но делают код сложнее для чтения и поддержки, разбрасывают операторы импорта по всей кодовой базе и требуют дисциплины для последовательного применения.5051Python теперь предлагает более чистое решение через явные [`lazy`](https://python-all.ru/3.16/reference/simple_stmts.html#lazy) импорты с использованием нового мягкого ключевого слова `lazy`. Когда импорт помечается как ленивый, Python откладывает фактическую загрузку модуля до первого использования импортированного имени. Это даёт преимущества организации: объявление всех импортов в начале файла, при этом затраты на загрузку возникают только для модулей, которые действительно используются.5253Ключевое слово `lazy` работает как с операторами `import`, так и `from ... import` . При записи `lazy import heavy_module` Python не загружает модуль немедленно. Вместо этого он создаёт легковесный объект-прокси. Фактическая загрузка модуля происходит прозрачно при первом обращении к имени:5455```python56lazy import json57lazy from pathlib import Path5859print("Starting up...")  # json и pathlib ещё не загружены6061data = json.loads('{"key": "value"}')  # здесь загружается json62p = Path(".")  # здесь загружается pathlib63```6465Этот механизм особенно полезен для приложений, которые импортируют много модулей на верхнем уровне, но могут использовать лишь часть из них в конкретном запуске. Отложенная загрузка снижает задержку запуска без необходимости перестройки кода или разбросанных по кодовой базе условных импортов.6667В случае, если загрузка лениво импортированного модуля завершается ошибкой (например, если модуль не существует), Python возбуждает исключение в точке первого использования, а не во время импорта. Связанная трассировка включает как место, где было использовано имя, так и исходный оператор импорта, что упрощает диагностику и отладку сбоя.6869Для случаев, когда нужно включить ленивую загрузку глобально без изменения исходного кода, Python предоставляет опцию командной строки [`-X lazy_imports`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-X) и переменную окружения [`PYTHON_LAZY_IMPORTS`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHON_LAZY_IMPORTS). Обе принимают два значения: `all` делает все импорты ленивыми по умолчанию, а `normal` (по умолчанию) учитывает ключевое слово `lazy` в исходном коде. Функции [`sys.set_lazy_imports()`](https://python-all.ru/3.16/library/sys.html#sys.set_lazy_imports) и [`sys.get_lazy_imports()`](https://python-all.ru/3.16/library/sys.html#sys.get_lazy_imports) позволяют изменять и запрашивать этот режим во время выполнения.7071Для более избирательного контроля [`sys.set_lazy_imports_filter()`](https://python-all.ru/3.16/library/sys.html#sys.set_lazy_imports_filter) принимает вызываемый объект, который определяет, должен ли конкретный модуль загружаться лениво. Фильтр получает три аргумента: имя импортирующего модуля (или `None`), имя импортируемого модуля и fromlist (или `None` для обычных импортов). Он должен возвращать `True`, чтобы разрешить ленивый импорт, или `False`, чтобы принудительно загрузить сразу. Это позволяет, например, сделать ленивыми только модули вашего приложения, оставив сторонние зависимости обычными:7273```python74import sys7576def myapp_filter(importing, imported, fromlist):77    return imported.startswith("myapp.")78sys.set_lazy_imports_filter(myapp_filter)79sys.set_lazy_imports("all")8081import myapp.slow_module  # ленивый (соответствует фильтру)82import json               # жадный (не соответствует фильтру)83```8485Сам тип прокси доступен как [`types.LazyImportType`](https://python-all.ru/3.16/library/types.html#types.LazyImportType) для кода, которому нужно программно обнаруживать ленивые импорты.8687Существуют некоторые ограничения на то, где можно использовать ключевое слово `lazy`. Ленивые импорты разрешены только на уровне модуля; использование `lazy` внутри функции, тела класса или блока `try`/`except`/`finally` приводит к [`SyntaxError`](https://python-all.ru/3.16/library/exceptions.html#SyntaxError). Ни звёздочные импорты, ни future-импорты не могут быть ленивыми (`lazy from module import *` и `lazy from __future__ import ...` оба приводят к `SyntaxError`).8889Для кода, который не может напрямую использовать ключевое слово `lazy` (например, при поддержке версий Python старше 3.15, но с использованием ленивых импортов на 3.15+), модуль может определить [`__lazy_modules__`](https://python-all.ru/3.16/reference/datamodel.html#module.__lazy_modules__) как контейнер строк с полными именами модулей. Обычные операторы `import` для этих модулей затем обрабатываются как ленивые, с той же семантикой, что и ключевое слово `lazy`:9091```python92__lazy_modules__ = ["json", "pathlib"]9394import json     # ленивый95import os       # всё ещё жадный96```9798> **См. также**99>100> [**PEP 810**](https://python-all.ru/3.16/whatsnew/3.15.html) для полной спецификации и обоснования.101102(Вклад Пабло Галиндо Сальгадо и Дино Виланда в [gh-142349](https://python-all.ru/3.16/whatsnew/3.15.html).)103104### [**PEP 814**](https://python-all.ru/3.16/whatsnew/3.15.html): Добавление встроенного типа frozendict105106Новый [неизменяемый](https://python-all.ru/3.16/glossary.html#term-immutable) тип, [`frozendict`](https://python-all.ru/3.16/library/stdtypes.html#frozendict), добавлен в модуль [`builtins`](https://python-all.ru/3.16/library/builtins.html#module-builtins). Он не допускает изменений после создания. `frozendict` не является подклассом `dict`; он наследует напрямую от `object`. `frozendict` является [хешируемым](https://python-all.ru/3.16/glossary.html#term-hashable), пока все его ключи и значения хешируемы. `frozendict` сохраняет порядок вставки, но при сравнении порядок не учитывается.107108Например:109110```python111>>> a = frozendict(x=1, y=2)112>>> a113frozendict({'x': 1, 'y': 2})114>>> a['z'] = 3115Traceback (most recent call last):116  File "<python-input-2>", line 1, in <module>117    a['z'] = 3118    ~^^^^^119TypeError: 'frozendict' object does not support item assignment120>>> b = frozendict(y=2, x=1)121>>> hash(a) == hash(b)122True123>>> a == b124True125```126127Следующие модули стандартной библиотеки были обновлены для поддержки `frozendict`: [`copy`](https://python-all.ru/3.16/library/copy.html#module-copy), [`decimal`](https://python-all.ru/3.16/library/decimal.html#module-decimal), [`json`](https://python-all.ru/3.16/library/json.html#module-json), [`marshal`](https://python-all.ru/3.16/library/marshal.html#module-marshal), [`plistlib`](https://python-all.ru/3.16/library/plistlib.html#module-plistlib) (только для сериализации), [`pickle`](https://python-all.ru/3.16/library/pickle.html#module-pickle), [`pprint`](https://python-all.ru/3.16/library/pprint.html#module-pprint) и [`xml.etree.ElementTree`](https://python-all.ru/3.16/library/xml.etree.elementtree.html#module-xml.etree.ElementTree).128129[`eval()`](https://python-all.ru/3.16/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.16/library/functions.html#exec) принимают `frozendict` для *globals*, и [`type()`](https://python-all.ru/3.16/library/functions.html#type) и [`str.maketrans()`](https://python-all.ru/3.16/library/stdtypes.html#str.maketrans) принимают `frozendict` для *dict*.130131Код, проверяющий тип [`dict`](https://python-all.ru/3.16/library/stdtypes.html#dict) с помощью `isinstance(arg, dict)`, может быть обновлён до `isinstance(arg, (dict, frozendict))`, чтобы также принимать тип `frozendict`, или до `isinstance(arg, collections.abc.Mapping)`, чтобы также принимать другие отображающие типы, такие как [`MappingProxyType`](https://python-all.ru/3.16/library/types.html#types.MappingProxyType).132133> **См. также**134>135> [**PEP 814**](https://python-all.ru/3.16/whatsnew/3.15.html) для полной спецификации и обоснования.136137(Вклад Виктора Стиннера и Донхи На в [gh-141510](https://python-all.ru/3.16/whatsnew/3.15.html).)138139### [**PEP 661**](https://python-all.ru/3.16/whatsnew/3.15.html): Добавление встроенного типа sentinel140141Новый тип [`sentinel`](https://python-all.ru/3.16/library/functions.html#sentinel) добавлен в модуль [`builtins`](https://python-all.ru/3.16/library/builtins.html#module-builtins) для создания уникальных sentinel-значений с кратким представлением. Sentinel-объекты сохраняют идентичность при копировании, поддерживают использование в выражениях типов с оператором `|` и могут быть сериализованы, если они импортируемы по модулю и имени.142143(PEP от Таля Эйната; вклад Йелле Зийлстры в [gh-148829](https://python-all.ru/3.16/whatsnew/3.15.html).)144145> **См. также**146>147> [**PEP 661**](https://python-all.ru/3.16/whatsnew/3.15.html) для получения дополнительных сведений.148149### [**PEP 799**](https://python-all.ru/3.16/whatsnew/3.15.html): Выделенный пакет профилирования150151Добавлен новый модуль [`profiling`](https://python-all.ru/3.16/library/profiling.html#module-profiling), чтобы организовать встроенные средства профилирования Python в едином согласованном пространстве имён. Этот модуль содержит:152153- [`profiling.tracing`](https://python-all.ru/3.16/library/profiling.tracing.html#module-profiling.tracing): детерминированная трассировка вызовов функций (перенесено из `cProfile`).154- [`profiling.sampling`](https://python-all.ru/3.16/library/profiling.sampling.html#module-profiling.sampling): новый статистический профилировщик с семплингом (назван Tachyon).155156Модуль `cProfile` остаётся псевдонимом для обратной совместимости. Модуль [`profile`](https://python-all.ru/3.16/library/profile.html#module-profile) устарел и будет удалён в Python 3.17.157158> **См. также**159>160> [**PEP 799**](https://python-all.ru/3.16/whatsnew/3.15.html) для получения дополнительных сведений.161162(Авторы: Pablo Galindo и László Kiss Kollár в [gh-138122](https://python-all.ru/3.16/whatsnew/3.15.html).)163164### Tachyon: высокочастотный статистический профилировщик с семплингом165166[![Логотип профилировщика Tachyon](https://python-all.ru/3.16/_images/tachyon-logo.png)](https://python-all.ru/3.16/_images/tachyon-logo.png)167168Новый статистический профилировщик с семплингом (Tachyon) добавлен как [`profiling.sampling`](https://python-all.ru/3.16/library/profiling.sampling.html#module-profiling.sampling). Этот профилировщик позволяет выполнять анализ производительности запущенных процессов Python с низкими накладными расходами, не требуя изменения кода или перезапуска процесса.169170В отличие от детерминированных профилировщиков (таких как [`profiling.tracing`](https://python-all.ru/3.16/library/profiling.tracing.html#module-profiling.tracing)), которые инструментируют каждый вызов функции, профилировщик с семплингом периодически собирает стек-трейсы из запущенных процессов. Такой подход обеспечивает практически нулевые накладные расходы при частоте семплинга **до 1 000 000 Гц**, что делает его самым быстрым профилировщиком с семплингом для Python (на момент его создания) и идеальным для отладки проблем производительности в рабочих средах. Эта возможность особенно ценна для отладки проблем производительности в production-системах, где традиционные подходы к профилированию оказываются слишком навязчивыми.171172Ключевые возможности:173174- **Профилирование с нулевыми накладными расходами**: Подключение к любому запущенному процессу Python без влияния на его производительность. Идеально подходит для отладки в production, когда нельзя позволить себе перезапуск или замедление приложения.175- **Не требует изменения кода**: Профилирует существующие приложения без перезапуска. Для начала сбора данных достаточно указать профилировщику PID запущенного процесса.176- **Гибкие режимы целевого профилирования**:177178  - Профилирование запущенных процессов по PID (`attach`) – подключение к уже запущенным приложениям179  - Запуск и профилирование скриптов напрямую (`run`) – профилирование с самого начала выполнения180  - Запуск и профилирование модулей (`run -m`) – профилирование пакетов, запускаемых как `python -m module`181  - Захват однократного снимка запущенного процесса (`dump`) – вывод стек-трейса в стиле traceback для каждого потока (или всех задач asyncio с `--async-aware`). Полезно для исследования зависших процессов.182- **Несколько режимов профилирования**: Выберите, что измерять, в зависимости от исследуемой проблемы производительности:183184  - **Стенное время (Wall clock time)** (`--mode wall`, по умолчанию): Измеряет реальное прошедшее время, включая ввод-вывод, ожидание сети и блокирующие операции. Используйте этот режим, чтобы понять, где программа проводит календарное время, включая время ожидания внешних ресурсов.185  - **Время CPU** (`--mode cpu`): Измеряет только активное время выполнения на CPU, исключая ожидание ввода-вывода и блокировки. Используйте этот режим для выявления узких мест, связанных с загрузкой CPU, и оптимизации вычислительной работы.186  - **Время удержания GIL** (`--mode gil`): Измеряет время, проведённое с удержанием глобальной блокировки интерпретатора Python (GIL). Используйте этот режим, чтобы определить, какие потоки доминируют по использованию GIL в многопоточных приложениях.187  - **Время обработки исключений** (`--mode exception`): Собирает семплы только из потоков с активным исключением. Используйте этот режим для анализа накладных расходов на обработку исключений.188- **Профилирование с учётом потоков**: Возможность профилировать все потоки (`-a`) или только главный поток – необходимо для понимания поведения многопоточных приложений.189- **Несколько форматов вывода**: Выберите визуализацию, которая лучше всего подходит для вашего рабочего процесса:190191  - `--pstats`: Подробная табличная статистика, совместимая с [`pstats`](https://python-all.ru/3.16/library/pstats.html#module-pstats). Показывает временные характеристики на уровне функций с прямыми и кумулятивными семплами. Лучше всего подходит для детального анализа и интеграции с существующими инструментами профилирования Python.192  - `--collapsed`: Создаёт свёрнутые стек-трейсы (одна строка на стек). Этот формат специально разработан для создания флейм-графиков с помощью внешних инструментов, таких как скрипты FlameGraph Брендана Грегга или speedscope.193  - `--flamegraph`: Создаёт автономный интерактивный HTML-флейм-график с использованием D3.js. Открывается прямо в браузере для немедленного визуального анализа. Флейм-графики показывают иерархию вызовов, где ширина представляет затраченное время, что позволяет легко заметить узкие места с первого взгляда.194  - `--gecko`: Генерирует формат Gecko Profiler, совместимый с [Firefox Profiler](https://python-all.ru/3.16/whatsnew/3.15.html). Загрузите результат в Firefox Profiler для расширенного анализа на основе временной шкалы с такими возможностями, как графики стеков, маркеры и сетевая активность.195  - `--heatmap`: Создаёт интерактивную HTML-визуализацию в виде тепловой карты с количеством семплов на уровне строк. Создаёт директорию с тепловыми картами для каждого файла, точно показывающую, где тратится время на уровне исходного кода.196- **Интерактивный режим в реальном времени**: TUI-профилировщик в реальном времени с интерфейсом наподобие top (`--live`). Отслеживайте производительность во время работы приложения с интерактивной сортировкой и фильтрацией.197- **Профилирование с учётом асинхронности**: Профилирование async/await кода с восстановлением стеков на основе задач (`--async-aware`). Позволяет увидеть, какие корутины потребляют время, с возможностью показывать только выполняющиеся задачи или все задачи, включая ожидающие.198- **Профилирование на уровне опкодов**: Сбор информации об опкодах байткода для профилирования на уровне инструкций (`--opcodes`). Показывает, какие инструкции байткода выполняются, включая специализации от адаптивного интерпретатора.199200См. [`profiling.sampling`](https://python-all.ru/3.16/library/profiling.sampling.html#module-profiling.sampling) для получения полной документации, включая все доступные форматы вывода, режимы профилирования и параметры конфигурации.201202(Авторы: Pablo Galindo и László Kiss Kollár в [gh-135953](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-138122](https://python-all.ru/3.16/whatsnew/3.15.html).)203204### [**PEP 831**](https://python-all.ru/3.16/whatsnew/3.15.html): Указатели фреймов включены по умолчанию205206CPython теперь собирается с указателями фреймов по умолчанию на платформах, которые их поддерживают. Для этого используются флаги компилятора `-fno-omit-frame-pointer` и `-mno-omit-leaf-frame-pointer`, что ускоряет и повышает надёжность размотки нативного стека для системных профилировщиков, отладчиков, инструментов анализа сбоев и средств наблюдения на основе eBPF.207208Флаги доступны через [`sysconfig`](https://python-all.ru/3.16/library/sysconfig.html#module-sysconfig), поэтому модули расширения, собранные инструментами, которые используют конфигурацию сборки Python, наследуют указатели фреймов по умолчанию. Это распространение сделано намеренно: для смешанного профилирования Python/нативного кода требуется непрерывная цепочка указателей фреймов через интерпретатор, модули расширения, встраиваемые приложения и нативные библиотеки.209210> **Важно**211>212> Сторонние бэкенды сборки и нативные системы сборки должны сохранять эти флаги, когда используют значения [`sysconfig`](https://python-all.ru/3.16/library/sysconfig.html#module-sysconfig) от Python. Системы сборки, которые компилируют C, C++, Rust или другой нативный код без наследования флагов компилятора Python, должны сами включать эквивалентные флаги указателей фреймов. Один единственный нативный компонент, собранный без указателей фреймов, может нарушить размотку стека для всего процесса Python.213214(Авторы: Pablo Galindo Salgado и Savannah Ostrowski в [gh-149201](https://python-all.ru/3.16/whatsnew/3.15.html); PEP 831 написан Pablo Galindo Salgado, Ken Jin, Savannah Ostrowski и Diego Russo.)215216> **См. также**217>218> [**PEP 831**](https://python-all.ru/3.16/whatsnew/3.15.html) для получения дополнительных сведений.219220### [**PEP 798**](https://python-all.ru/3.16/whatsnew/3.15.html): Распаковка в генераторах списков221222Генераторы списков, множеств и словарей, а также выражения-генераторы теперь поддерживают распаковку с `*` и `**`. Это расширяет синтаксис распаковки из [**PEP 448**](https://python-all.ru/3.16/whatsnew/3.15.html) на генераторы, предоставляя новый синтаксис для объединения произвольного количества итерируемых объектов или словарей в единую плоскую структуру. Этот новый синтаксис является прямой альтернативой вложенным генераторам, [`itertools.chain()`](https://python-all.ru/3.16/library/itertools.html#itertools.chain) и [`itertools.chain.from_iterable()`](https://python-all.ru/3.16/library/itertools.html#itertools.chain.from_iterable). Например:223224```python225>>> lists = [[1, 2], [3, 4], [5]]226>>> [*L for L in lists]  # эквивалентно [x for L in lists for x in L]227[1, 2, 3, 4, 5]228229>>> sets = [{1, 2}, {2, 3}, {3, 4}]230>>> {*s for s in sets}  # эквивалентно {x for s in sets for x in s}231{1, 2, 3, 4}232233>>> dicts = [{'a': 1}, {'b': 2}, {'a': 3}]234>>> {**d for d in dicts}  # эквивалентно {k: v for d in dicts for k,v in d.items()}235{'a': 3, 'b': 2}236```237238Выражения-генераторы также могут использовать распаковку для получения значений из нескольких итерируемых объектов:239240```python241>>> gen = (*L for L in lists)  # эквивалентно (x for L in lists for x in L)242>>> list(gen)243[1, 2, 3, 4, 5]244```245246Это изменение также распространяется на асинхронные выражения-генераторы, так что, например, `(*a async for a in agen())` эквивалентно `(x async for a in agen() for x in a)`.247248> **См. также**249>250> [**PEP 798**](https://python-all.ru/3.16/whatsnew/3.15.html) для получения дополнительных сведений.251252(Автор: Adam Hartz в [gh-143055](https://python-all.ru/3.16/whatsnew/3.15.html).)253254### [**PEP 829**](https://python-all.ru/3.16/whatsnew/3.15.html): Файлы конфигурации запуска пакетов255256Загружаемые модулем [`site`](https://python-all.ru/3.16/library/site.html#module-site), когда `-S` не указан, [файлы .pth](https://python-all.ru/3.16/library/site.html#site-pth-files) могут содержать строки, которые как расширяют [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path), так и выполняют произвольный код, если строка начинается с `import` (с последующим пробелом или табуляцией). Последняя функциональность может быть проблематичной, поскольку сложно точно знать, что именно выполняется при запуске Python.257258В качестве шага по улучшению возможности аудита исполняемого кода до запуска, Python 3.15 вводит [файлы .start](https://python-all.ru/3.16/library/site.html#site-start-files), которые содержат спецификации точек входа в виде `pkg.mod:callable`, где `pkg.mod` – это путь импорта к указанной вызываемой сущности. При запуске Python вызываемая сущность находится и вызывается без аргументов.259260Строки `import` в файлах `.pth` объявлены устаревшими без предупреждения. Если найден соответствующий файл `.start`, строки `import` в файлах `.pth` игнорируются. Для строк расширения [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path) в файлах `.pth` изменений нет.261262Модуль [`site`](https://python-all.ru/3.16/library/site.html#module-site) также предоставляет [`site.StartupState`](https://python-all.ru/3.16/library/site.html#site.StartupState) для пакетной обработки запуска для нескольких каталогов сайтов, гарантируя, что все статические расширения путей применяются до выполнения любого кода запуска. [`site.main()`](https://python-all.ru/3.16/library/site.html#site.main) неявно использует экземпляр этого класса для пакетной обработки всех файлов конфигурации запуска при обычном запуске интерпретатора. Вызывающим сторонам, которым нужно такое же пакетное поведение, можно напрямую создать `StartupState` и управлять им с помощью [`addsitedir()`](https://python-all.ru/3.16/library/site.html#site.StartupState.addsitedir), [`addusersitepackages()`](https://python-all.ru/3.16/library/site.html#site.StartupState.addusersitepackages) и [`addsitepackages()`](https://python-all.ru/3.16/library/site.html#site.StartupState.addsitepackages), а затем вызвать [`process()`](https://python-all.ru/3.16/library/site.html#site.StartupState.process) один раз в конце пакетной обработки.263264(Автор: Barry Warsaw в [gh-148641](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-150228](https://python-all.ru/3.16/whatsnew/3.15.html).)265266### [**PEP 803**](https://python-all.ru/3.16/whatsnew/3.15.html) – Стабильный ABI для сборок со свободными потоками267268Расширения C, предназначенные для [Стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable-abi), теперь могут быть скомпилированы для нового *Стабильного ABI для сборок со свободными потоками* (также известного как `abi3t`), что делает их совместимыми с [сборками со свободными потоками](https://python-all.ru/3.16/glossary.html#term-free-threaded-build) CPython. Обычно это требует нетривиальных изменений в исходном коде; в частности:269270- Переход на API, введённый в [**PEP 697**](https://python-all.ru/3.16/whatsnew/3.15.html) (Python 3.12), такой как отрицательные [`basicsize`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Spec.basicsize) и [`PyObject_GetTypeData()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GetTypeData), вместо того чтобы делать [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) частью структуры экземпляра; и271- Переход от функции `PyInit_` к новому хуку экспорта [`PyModExport_*`](https://python-all.ru/3.16/c-api/extension-modules.html#c.PyModExport_modulename), введённому для этой цели в [**PEP 793**](https://python-all.ru/3.16/whatsnew/3.15.html), с новой структурой [`PySlot`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot), введённой в [**PEP 820**](https://python-all.ru/3.16/whatsnew/3.15.html).272273Обратите внимание, что Стабильный ABI не предоставляет всей функциональности CPython. Расширения, которые не могут переключиться на `abi3t`, должны продолжать собираться для существующего Стабильного ABI (`abi3`) и версионно-специфичного ABI для свободных потоков (`cp315t`) по отдельности.274275Стабильный ABI для сборок со свободными потоками обычно следует выбирать в инструменте сборки (например, Setuptools, meson-python, scikit-build-core или Maturin). На момент написания эти инструменты **не** поддерживали `abi3t`. Если это относится к вашему инструменту, компилируйте для `cp315t` отдельно. Если вы не используете инструмент сборки – или пишете такой инструмент – вы можете выбрать `abi3t`, установив макрос `Py_TARGET_ABI3T`, как описано в [Компиляция для Стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#abi3-compiling).276277Доступно практическое [руководство по миграции](https://python-all.ru/3.16/howto/abi3t-migration.html#abi3t-migration-howto) для перехода на `abi3t`.278279> **См. также**280>281> [**PEP 803**](https://python-all.ru/3.16/whatsnew/3.15.html) для получения дополнительных сведений.282283### [**PEP 788**](https://python-all.ru/3.16/whatsnew/3.15.html): Защита C API от завершения работы интерпретатора284285В C API [завершение работы интерпретатора](https://python-all.ru/3.16/glossary.html#term-interpreter-shutdown) может быть проблематичным для многих расширений, потому что [присоединение](https://python-all.ru/3.16/glossary.html#term-attached-thread-state) состояния потока навсегда зависает поток, что приводит к взаимоблокировкам и другим ложным проблемам. Кроме того, исторически было невозможно безопасно проверить, жив ли интерпретатор, прежде чем использовать его, что приводило к сбоям, когда один поток одновременно удаляет интерпретатор, а другой пытается к нему присоединиться.286287Теперь есть несколько новых наборов API для обхода этих проблем:288289- [Охранники интерпретатора](https://python-all.ru/3.16/c-api/interp-lifecycle.html#interpreter-guards), которые предотвращают завершение работы интерпретатора.290- [Представления интерпретатора](https://python-all.ru/3.16/c-api/interp-lifecycle.html#interpreter-views), которые обеспечивают потокобезопасный доступ к интерпретатору, который может одновременно завершать работу или быть удалён.291- [Новые API](https://python-all.ru/3.16/c-api/threads.html#c-api-attach-detach) для автоматического присоединения и отсоединения состояний потоков со встроенной защитой от финализации.292293Кроме того, API из семейства `PyGILState` (в первую очередь [`PyGILState_Ensure()`](https://python-all.ru/3.16/c-api/threads.html#c.PyGILState_Ensure) и [`PyGILState_Release()`](https://python-all.ru/3.16/c-api/threads.html#c.PyGILState_Release)) стали [мягко устаревшими](https://python-all.ru/3.16/glossary.html#term-soft-deprecated). **Не** планируется удалять их, существующий код продолжит работать, но в будущих версиях Python не будет новых API `PyGILState`.294295> **См. также**296>297> [**PEP 788**](https://python-all.ru/3.16/whatsnew/3.15.html) для подробностей.298299(Автор: Peter Bierma, [gh-149101](https://python-all.ru/3.16/whatsnew/3.15.html).)300301### Улучшенные сообщения об ошибках302303- Интерпретатор теперь даёт более полезные подсказки в исключениях [`AttributeError`](https://python-all.ru/3.16/library/exceptions.html#AttributeError) при обращении к несуществующему атрибуту объекта, если похожий атрибут доступен через один из его членов.304305  Например, если у объекта есть атрибут, который сам предоставляет запрошенное имя, сообщение об ошибке предложит обратиться к нему через этот внутренний атрибут:306307  ```python308  @dataclass309  class Circle:310     radius: float311312     @property313     def area(self) -> float:314        return pi * self.radius**2315316  class Container:317     def __init__(self, inner: Circle) -> None:318        self.inner = inner319320  circle = Circle(radius=4.0)321  container = Container(circle)322  print(container.area)323  ```324325  Теперь выполнение этого кода выдаёт более понятную подсказку:326327  ```pytb328  Traceback (most recent call last):329    File "/home/pablogsal/github/python/main/lel.py", line 42, in <module>330      print(container.area)331            ^^^^^^^^^^^^^^332  AttributeError: 'Container' object has no attribute 'area'. Did you mean '.inner.area' instead of '.area'?333  ```334- Когда [`AttributeError`](https://python-all.ru/3.16/library/exceptions.html#AttributeError) встроенного типа не находит близкого совпадения по расстоянию Левенштейна, сообщение об ошибке теперь проверяет статическую таблицу распространённых имён методов из других языков (JavaScript, Java, Ruby, C#) и предлагает эквивалент на Python:335336  ```pycon337  >>> [1, 2, 3].push(4)338  Traceback (most recent call last):339  ...340  AttributeError: 'list' object has no attribute 'push'. Did you mean '.append'?341342  >>> 'hello'.toUpperCase()343  Traceback (most recent call last):344  ...345  AttributeError: 'str' object has no attribute 'toUpperCase'. Did you mean '.upper'?346  ```347348  Если эквивалент на Python – языковая конструкция, а не метод, подсказка описывает её напрямую:349350  ```pycon351  >>> {}.put("a", 1)352  Traceback (most recent call last):353  ...354  AttributeError: 'dict' object has no attribute 'put'. Use d[k] = v.355  ```356357  Когда изменяемый метод вызывается для неизменяемого типа, подсказка предлагает соответствующий изменяемый вариант:358359  ```pycon360  >>> (1, 2, 3).append(4)361  Traceback (most recent call last):362  ...363  AttributeError: 'tuple' object has no attribute 'append'. Did you mean to use a 'list' object?364  ```365366  Эти подсказки также работают для подклассов встроенных типов.367368  (Автор: Matt Van Horn, [gh-146406](https://python-all.ru/3.16/whatsnew/3.15.html).)369- Теперь интерпретатор пытается дать подсказку, когда [`delattr()`](https://python-all.ru/3.16/library/functions.html#delattr) завершается ошибкой из-за отсутствующего атрибута. Если используется имя атрибута, очень похожее на существующий атрибут, интерпретатор предложит правильное имя атрибута в сообщении об ошибке. Например:370371  ```pycon372  >>> class A:373  ...     pass374  >>> a = A()375  >>> a.abcde = 1376  >>> del a.abcdf377  Traceback (most recent call last):378  ...379  AttributeError: 'A' object has no attribute 'abcdf'. Did you mean: 'abcde'?380  ```381382  (Авторы: Nikita Sobolev и Pranjal Prajapati, [gh-136588](https://python-all.ru/3.16/whatsnew/3.15.html).)383- Несколько сообщений об ошибках, некорректно использовавших термин «argument», исправлены. (Автор: Stan Ulbrych, [gh-133382](https://python-all.ru/3.16/whatsnew/3.15.html).)384385## Прочие изменения в языке386387- Python теперь использует [UTF-8](https://python-all.ru/3.16/whatsnew/3.15.html) в качестве кодировки по умолчанию независимо от окружения системы. Это означает, что операции ввода-вывода без явного указания кодировки, например `open('flying-circus.txt')`, будут использовать UTF-8. UTF-8 – широко поддерживаемая [Юникод](https://python-all.ru/3.16/whatsnew/3.15.html)-кодировка символов, ставшая *фактическим* стандартом представления текста, включая почти все веб-страницы в интернете, многие распространённые форматы файлов, языки программирования и другое.388389  Это применимо только если аргумент `encoding` не указан. Для наилучшей совместимости между версиями Python убедитесь, что явный аргумент `encoding` всегда предоставляется. [Опциональное предупреждение о кодировке](https://python-all.ru/3.16/library/io.html#io-encoding-warning) можно использовать для выявления кода, который может быть затронут этим изменением. Специальный аргумент `encoding='locale'` использует кодировку текущей локали и поддерживается начиная с Python 3.10.390391  Чтобы сохранить прежнее поведение, режим UTF-8 Python можно отключить с помощью переменной окружения [`PYTHONUTF8=0`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONUTF8) или параметра командной строки [`-X utf8=0`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-X).392393  > **См. также**394  >395  > [**PEP 686**](https://python-all.ru/3.16/whatsnew/3.15.html) для подробностей.396397  (Автор: Adam Turner, [gh-133711](https://python-all.ru/3.16/whatsnew/3.15.html); PEP 686 написан Inada Naoki.)398- Справка интерпретатора (например `python --help`) теперь цветная. Это можно контролировать [переменными окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Автор: Hugo van Kemenade, [gh-148766](https://python-all.ru/3.16/whatsnew/3.15.html).)399- Исключения, которые невозможно вызвать, теперь по умолчанию выделяются цветом. Это можно контролировать [переменными окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Автор: Peter Bierma, [gh-134170](https://python-all.ru/3.16/whatsnew/3.15.html).)400- Больше цвета в [argparse](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-argparse), [ast](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-ast), [calendar](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-calendar), [difflib](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-difflib), [http.server](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-http-server), [pickletools](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-pickletools), [автодополнении PyREPL](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-pyrepl-completion), [python –help](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-interpreter-help), [sqlite3](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-sqlite3), [timeit](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-timeit), [tokenize](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-tokenize), [невызываемых исключений (unraisable exceptions)](https://python-all.ru/3.16/whatsnew/3.15.html#whatsnew315-color-exceptions) и [stdlib](https://python-all.ru/3.16/glossary.html#term-stdlib) (ast, compileall, doctest, gzip, inspect, json.tool, pdb, profiling.sampling, random, regrtest, sqlite3, timeit, tokenize, trace, unittest, uuid, zipapp, zipfile) CLI help.401- [`__repr__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__repr__) у [`ImportError`](https://python-all.ru/3.16/library/exceptions.html#ImportError) и [`ModuleNotFoundError`](https://python-all.ru/3.16/library/exceptions.html#ModuleNotFoundError) теперь показывает «name» и «path» как `name=<name>` и `path=<path>`, если они были переданы в качестве именованных аргументов при создании. (Авторы: Serhiy Storchaka, Oleg Iarygin и Yoav Nir, [gh-74185](https://python-all.ru/3.16/whatsnew/3.15.html).)402- Дескрипторы [`__dict__`](https://python-all.ru/3.16/reference/datamodel.html#object.__dict__) и `__weakref__` теперь используют один экземпляр дескриптора на интерпретатор, общий для всех типов, которым они нужны. Это ускоряет создание классов и помогает избежать циклов ссылок. (Автор: Petr Viktorin, [gh-135228](https://python-all.ru/3.16/whatsnew/3.15.html).)403- Опция [`-W`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-W) и переменная окружения [`PYTHONWARNINGS`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONWARNINGS) теперь могут задавать регулярные выражения вместо строковых литералов для сопоставления с сообщением предупреждения и именем модуля, если соответствующее поле начинается и заканчивается косой чертой (`/`). (Автор: Serhiy Storchaka, [gh-134716](https://python-all.ru/3.16/whatsnew/3.15.html).)404- Функции, принимающие аргументы timestamp или timeout, теперь принимают любые вещественные числа (например [`Decimal`](https://python-all.ru/3.16/library/decimal.html#decimal.Decimal) и [`Fraction`](https://python-all.ru/3.16/library/fractions.html#fractions.Fraction)), а не только целые числа или числа с плавающей запятой, хотя это не повышает точность. (Автор: Serhiy Storchaka, [gh-67795](https://python-all.ru/3.16/whatsnew/3.15.html).)405406- Добавлен [`bytearray.take_bytes(n=None, /)`](https://python-all.ru/3.16/library/stdtypes.html#bytearray.take_bytes) для извлечения байтов из [`bytearray`](https://python-all.ru/3.16/library/stdtypes.html#bytearray) без копирования. Это позволяет оптимизировать код, который должен возвращать [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) после работы с изменяемым буфером байтов, например, буферизация данных, разбор сетевых протоколов, кодирование, декодирование и сжатие. Типичные шаблоны кода, которые можно оптимизировать с помощью [`take_bytes()`](https://python-all.ru/3.16/library/stdtypes.html#bytearray.take_bytes), перечислены ниже.407408  | Описание | Старое | Новое |409  | --- | --- | --- |410  | Возврат [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) после работы с [`bytearray`](https://python-all.ru/3.16/library/stdtypes.html#bytearray) | def read() -\> bytes: buffer = bytearray(1024) ... return bytes(buffer) | def read() -\> bytes: buffer = bytearray(1024) ... return buffer.take\_bytes() |411  | Очистка буфера с получением байтов | buffer = bytearray(1024) ... data = bytes(buffer) buffer.clear() | buffer = bytearray(1024) ... data = buffer.take\_bytes() |412  | Разделить буфер по заданному разделителю | buffer = bytearray(b'abc\\ndef') n = buffer.find(b'\\n') data = bytes(buffer\[:n + 1\]) del buffer\[:n + 1\] assert data == b'abc\\n' assert buffer == bytearray(b'def') | buffer = bytearray(b'abc\\ndef') n = buffer.find(b'\\n') data = buffer.take\_bytes(n + 1) |413  | Разделить буфер по заданному разделителю; отбросить часть после разделителя | buffer = bytearray(b'abc\\ndef') n = buffer.find(b'\\n') data = bytes(buffer\[:n\]) buffer.clear() assert data == b'abc' assert len(buffer) == 0 | buffer = bytearray(b'abc\\ndef') n = buffer.find(b'\\n') buffer.resize(n) data = buffer.take\_bytes() |414415  (Разработано Cody Maloney в [gh-139871](https://python-all.ru/3.16/whatsnew/3.15.html).)416- Многие функции, связанные с компиляцией или разбором кода Python, такие как [`compile()`](https://python-all.ru/3.16/library/functions.html#compile), [`ast.parse()`](https://python-all.ru/3.16/library/ast.html#ast.parse), [`symtable.symtable()`](https://python-all.ru/3.16/library/symtable.html#symtable.symtable), и [`importlib.abc.InspectLoader.source_to_code()`](https://python-all.ru/3.16/library/importlib.html#importlib.abc.InspectLoader.source_to_code), теперь позволяют передавать имя модуля. Это необходимо для однозначной [фильтрации](https://python-all.ru/3.16/library/warnings.html#warning-filter) синтаксических предупреждений по имени модуля. (Разработано Serhiy Storchaka в [gh-135801](https://python-all.ru/3.16/whatsnew/3.15.html).)417- Разрешено определять *\_\_dict\_\_* и *\_\_weakref\_\_* [\_\_slots\_\_](https://python-all.ru/3.16/reference/datamodel.html#slots) для любого класса. (Разработано Serhiy Storchaka в [gh-41779](https://python-all.ru/3.16/whatsnew/3.15.html).)418- Разрешено определять любые [\_\_slots\_\_](https://python-all.ru/3.16/reference/datamodel.html#slots) для класса, производного от [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple) (включая классы, созданные с помощью [`collections.namedtuple()`](https://python-all.ru/3.16/library/collections.html#collections.namedtuple)). (Разработано Serhiy Storchaka в [gh-41779](https://python-all.ru/3.16/whatsnew/3.15.html).)419- Тип [`slice`](https://python-all.ru/3.16/library/functions.html#slice) теперь поддерживает подписку (subscription), что делает его [обобщённым типом](https://python-all.ru/3.16/glossary.html#term-generic-type). (Разработано James Hilton-Balfe в [gh-128335](https://python-all.ru/3.16/whatsnew/3.15.html).)420- Класс [`memoryview`](https://python-all.ru/3.16/library/stdtypes.html#memoryview) теперь поддерживает типы C float complex и double complex: символы форматирования `'Zf'` и `'Zd'` соответственно. (Разработано Victor Stinner в [gh-146151](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-148675](https://python-all.ru/3.16/whatsnew/3.15.html).)421- Разрешено передавать аргумент *count* функции [`bytes.replace()`](https://python-all.ru/3.16/library/stdtypes.html#bytes.replace) как именованный. (Разработано Stan Ulbrych в [gh-147856](https://python-all.ru/3.16/whatsnew/3.15.html).)422- Унарный плюс теперь принимается в литеральных шаблонах [`match`](https://python-all.ru/3.16/reference/compound_stmts.html#match), что отражает существующую поддержку унарного минуса. (Разработано Bartosz Sławecki в [gh-145239](https://python-all.ru/3.16/whatsnew/3.15.html).)423- Система импорта теперь захватывает блокировки на модули в иерархическом порядке (родительские пакеты перед их подмодулями). Это исправляет давнюю взаимоблокировку, когда один поток импортирует `pkg.sub`, а другой импортирует `pkg.sub.mod`, и каждый мог заблокировать другой, когда `pkg/sub/__init__.py` импортирует `pkg.sub.mod`. (Разработано Gregory P. Smith в [gh-83065](https://python-all.ru/3.16/whatsnew/3.15.html).)424425## Интерактивная оболочка по умолчанию426427- Завершение по табу теперь окрашивается по типу объекта, на основе [fancycompleter](https://python-all.ru/3.16/whatsnew/3.15.html). Установите [`PYTHON_BASIC_COMPLETER`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHON_BASIC_COMPLETER) для возврата к [`rlcompleter`](https://python-all.ru/3.16/library/rlcompleter.html#module-rlcompleter). Цвет также можно контролировать через [переменные окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Разработано Antonio Cuni и Pablo Galindo в [gh-130472](https://python-all.ru/3.16/whatsnew/3.15.html).)428429## Новые модули430431### math.integer432433Этот модуль предоставляет доступ к математическим функциям для целочисленных аргументов ([**PEP 791**](https://python-all.ru/3.16/whatsnew/3.15.html)). (Разработано Serhiy Storchaka в [gh-81313](https://python-all.ru/3.16/whatsnew/3.15.html).)434435## Улучшенные модули436437### argparse438439- Действие [`BooleanOptionalAction`](https://python-all.ru/3.16/library/argparse.html#argparse.BooleanOptionalAction) теперь поддерживает длинные опции с одним дефисом и альтернативные символы префикса. (Разработано Serhiy Storchaka в [gh-138525](https://python-all.ru/3.16/whatsnew/3.15.html).)440- Изменено значение по умолчанию параметра *suggest\_on\_error* функции [`argparse.ArgumentParser`](https://python-all.ru/3.16/library/argparse.html#argparse.ArgumentParser) на `True`. Это включает предложения для неправильно набранных аргументов по умолчанию. (Разработано Jakob Schluse в [gh-140450](https://python-all.ru/3.16/whatsnew/3.15.html).)441- Добавлена поддержка разметки обратными кавычками в тексте описания [`ArgumentParser`](https://python-all.ru/3.16/library/argparse.html#argparse.ArgumentParser) и эпилога для выделения встроенного кода при включённом цветном выводе. (Разработано Savannah Ostrowski в [gh-142390](https://python-all.ru/3.16/whatsnew/3.15.html).)442- Расширена разметка обратными кавычками на текст аргумента `help` и добавлена поддержка двойных обратных кавычек (стиль RST inline-literal). (Разработано Hugo van Kemenade в [gh-149375](https://python-all.ru/3.16/whatsnew/3.15.html).)443444### array445446- Поддержка типов C float complex и double complex: символы форматирования `'Zf'` и `'Zd'` соответственно. (Разработано Victor Stinner в [gh-146151](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-148675](https://python-all.ru/3.16/whatsnew/3.15.html).)447- Поддержка полуточных чисел (16-битный формат двоичного обмена IEEE 754): символ форматирования `'e'`. (Разработано Sergey B Kirpichev в [gh-146238](https://python-all.ru/3.16/whatsnew/3.15.html).)448- Тип [`array.typecodes`](https://python-all.ru/3.16/library/array.html#array.typecodes) изменён с [`str`](https://python-all.ru/3.16/library/stdtypes.html#str) на [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple) для поддержки кодов типов длиннее 1 символа (`Zf` и `Zd`). (Разработано Victor Stinner в [gh-148675](https://python-all.ru/3.16/whatsnew/3.15.html).)449450### ast451452>453454- Добавлен параметр *color* в [`dump()`](https://python-all.ru/3.16/library/ast.html#ast.dump). Если `True`, возвращаемая строка подсвечивается синтаксически с помощью ANSI-escape последовательностей. Если `False` (по умолчанию), цветной вывод всегда отключён. (Разработано Stan Ulbrych в [gh-148981](https://python-all.ru/3.16/whatsnew/3.15.html).)455- Вывод [командной строки](https://python-all.ru/3.16/library/ast.html#ast-cli) теперь по умолчанию подсвечивается синтаксически. Это можно [контролировать с помощью переменных окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Разработано Stan Ulbrych в [gh-148981](https://python-all.ru/3.16/whatsnew/3.15.html).)456457### asyncio458459- Добавлен [`TaskGroup.cancel`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.TaskGroup.cancel) для возможности досрочного завершения группы задач, например, когда цель задач достигнута или их услуги больше не нужны. Ранее для этого требовался неинтуитивный шаблонный код, например, дополнительная задача, вызывающая пользовательское исключение, которое затем подавлялось при выходе из группы задач. (Разработано John Belmonte в [gh-127214](https://python-all.ru/3.16/whatsnew/3.15.html).)460461### base64462463- Добавлен параметр *pad* в [`z85encode()`](https://python-all.ru/3.16/library/base64.html#base64.z85encode). (Разработано Hauke Dämpfling в [gh-143103](https://python-all.ru/3.16/whatsnew/3.15.html).)464- Добавлен параметр *padded* в [`b32encode()`](https://python-all.ru/3.16/library/base64.html#base64.b32encode), [`b32decode()`](https://python-all.ru/3.16/library/base64.html#base64.b32decode), [`b32hexencode()`](https://python-all.ru/3.16/library/base64.html#base64.b32hexencode), [`b32hexdecode()`](https://python-all.ru/3.16/library/base64.html#base64.b32hexdecode), [`b64encode()`](https://python-all.ru/3.16/library/base64.html#base64.b64encode), [`b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.b64decode), [`urlsafe_b64encode()`](https://python-all.ru/3.16/library/base64.html#base64.urlsafe_b64encode) и [`urlsafe_b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.urlsafe_b64decode). (Разработано Serhiy Storchaka в [gh-73613](https://python-all.ru/3.16/whatsnew/3.15.html).)465- Добавлен параметр *wrapcol* в [`b16encode()`](https://python-all.ru/3.16/library/base64.html#base64.b16encode), [`b32encode()`](https://python-all.ru/3.16/library/base64.html#base64.b32encode), [`b32hexencode()`](https://python-all.ru/3.16/library/base64.html#base64.b32hexencode), [`b64encode()`](https://python-all.ru/3.16/library/base64.html#base64.b64encode), [`b85encode()`](https://python-all.ru/3.16/library/base64.html#base64.b85encode) и [`z85encode()`](https://python-all.ru/3.16/library/base64.html#base64.z85encode). (Разработано Serhiy Storchaka в [gh-143214](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-146431](https://python-all.ru/3.16/whatsnew/3.15.html).)466- Добавлен параметр *ignorechars* в [`b16decode()`](https://python-all.ru/3.16/library/base64.html#base64.b16decode), [`b32decode()`](https://python-all.ru/3.16/library/base64.html#base64.b32decode), [`b32hexdecode()`](https://python-all.ru/3.16/library/base64.html#base64.b32hexdecode), [`b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.b64decode), [`b85decode()`](https://python-all.ru/3.16/library/base64.html#base64.b85decode) и [`z85decode()`](https://python-all.ru/3.16/library/base64.html#base64.z85decode). (Вклад Serhiy Storchaka в [gh-144001](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-146431](https://python-all.ru/3.16/whatsnew/3.15.html).)467- Добавлен параметр *canonical* в [`b32decode()`](https://python-all.ru/3.16/library/base64.html#base64.b32decode), [`b32hexdecode()`](https://python-all.ru/3.16/library/base64.html#base64.b32hexdecode), [`b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.b64decode), [`urlsafe_b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.urlsafe_b64decode), [`a85decode()`](https://python-all.ru/3.16/library/base64.html#base64.a85decode), [`b85decode()`](https://python-all.ru/3.16/library/base64.html#base64.b85decode) и [`z85decode()`](https://python-all.ru/3.16/library/base64.html#base64.z85decode), для отклонения кодировок с ненулевыми битами заполнения или другими неканоническими формами. (Вклад Gregory P. Smith в [gh-146311](https://python-all.ru/3.16/whatsnew/3.15.html).)468469### binascii470471- Добавлены функции для кодирования Base32:472473  - [`b2a_base32()`](https://python-all.ru/3.16/library/binascii.html#binascii.b2a_base32) и [`a2b_base32()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_base32)474475  (Вклад James Seo в [gh-146192](https://python-all.ru/3.16/whatsnew/3.15.html).)476- Добавлены функции для кодирования Ascii85, Base85 и Z85:477478  - [`b2a_ascii85()`](https://python-all.ru/3.16/library/binascii.html#binascii.b2a_ascii85) и [`a2b_ascii85()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_ascii85)479  - [`b2a_base85()`](https://python-all.ru/3.16/library/binascii.html#binascii.b2a_base85) и [`a2b_base85()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_base85)480481  (Вклад James Seo и Serhiy Storchaka в [gh-101178](https://python-all.ru/3.16/whatsnew/3.15.html).)482- Добавлен параметр *padded* в [`b2a_base32()`](https://python-all.ru/3.16/library/binascii.html#binascii.b2a_base32), [`a2b_base32()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_base32), [`b2a_base64()`](https://python-all.ru/3.16/library/binascii.html#binascii.b2a_base64) и [`a2b_base64()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_base64). (Вклад Serhiy Storchaka в [gh-73613](https://python-all.ru/3.16/whatsnew/3.15.html).)483- Добавлен параметр *wrapcol* в [`b2a_base64()`](https://python-all.ru/3.16/library/binascii.html#binascii.b2a_base64). (Вклад Serhiy Storchaka в [gh-143214](https://python-all.ru/3.16/whatsnew/3.15.html).)484- Добавлен параметр *alphabet* в [`b2a_base64()`](https://python-all.ru/3.16/library/binascii.html#binascii.b2a_base64) и [`a2b_base64()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_base64). (Вклад Serhiy Storchaka в [gh-145980](https://python-all.ru/3.16/whatsnew/3.15.html).)485- Добавлен параметр *ignorechars* в [`a2b_hex()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_hex), [`unhexlify()`](https://python-all.ru/3.16/library/binascii.html#binascii.unhexlify) и [`a2b_base64()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_base64). (Вклад Serhiy Storchaka в [gh-144001](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-146431](https://python-all.ru/3.16/whatsnew/3.15.html).)486- Добавлен параметр *canonical* в [`a2b_base64()`](https://python-all.ru/3.16/library/binascii.html#binascii.a2b_base64), для отклонения кодировок с ненулевыми битами заполнения. (Вклад Gregory P. Smith в [gh-146311](https://python-all.ru/3.16/whatsnew/3.15.html).)487488### calendar489490>491492- [Командной строки](https://python-all.ru/3.16/library/calendar.html#calendar-cli) [`calendar`](https://python-all.ru/3.16/library/calendar.html#module-calendar) текстовый вывод стал более цветным. Это можно настроить с помощью [переменных окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Вклад Hugo van Kemenade в [gh-148352](https://python-all.ru/3.16/whatsnew/3.15.html).)493- [Командной строки](https://python-all.ru/3.16/library/calendar.html#calendar-cli) [`calendar`](https://python-all.ru/3.16/library/calendar.html#module-calendar) HTML-вывод теперь принимает опцию «год-месяц»: `python -m calendar -t html 2009 06`. (Вклад Pål Grønås Drange в [gh-140212](https://python-all.ru/3.16/whatsnew/3.15.html).)494- Страницы календаря, создаваемые классом [`calendar.HTMLCalendar`](https://python-all.ru/3.16/library/calendar.html#calendar.HTMLCalendar), теперь поддерживают тёмный режим и были перенесены на стандарт HTML5 для улучшения доступности. (Вклад Jiahao Li и Hugo van Kemenade в [gh-137634](https://python-all.ru/3.16/whatsnew/3.15.html).)495496### collections497498- Добавлены `collections.Counter.__xor__()` и `collections.Counter.__ixor__()` для вычисления симметрической разности между объектами [`Counter`](https://python-all.ru/3.16/library/collections.html#collections.Counter). (Вклад Raymond Hettinger в [gh-138682](https://python-all.ru/3.16/whatsnew/3.15.html).)499500### concurrent.futures501502- Улучшено сообщение об ошибке при внезапном завершении дочернего процесса в [`concurrent.futures.ProcessPoolExecutor`](https://python-all.ru/3.16/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor). Теперь результирующий traceback будет показывать PID и код выхода завершившегося процесса. (Вклад Jonathan Berg в [gh-139486](https://python-all.ru/3.16/whatsnew/3.15.html).)503504### contextlib505506- Добавлена поддержка произвольных дескрипторов `__enter__()`, `__exit__()`, `__aenter__()` и `__aexit__()` в [`ExitStack`](https://python-all.ru/3.16/library/contextlib.html#contextlib.ExitStack) и [`contextlib.AsyncExitStack`](https://python-all.ru/3.16/library/contextlib.html#contextlib.AsyncExitStack), для согласованности с операторами [`with`](https://python-all.ru/3.16/reference/compound_stmts.html#with) и [`async with`](https://python-all.ru/3.16/reference/compound_stmts.html#async-with). (Вклад Serhiy Storchaka в [gh-144386](https://python-all.ru/3.16/whatsnew/3.15.html).)507- [`ContextDecorator`](https://python-all.ru/3.16/library/contextlib.html#contextlib.ContextDecorator) и [`AsyncContextDecorator`](https://python-all.ru/3.16/library/contextlib.html#contextlib.AsyncContextDecorator) (а следовательно [`contextmanager()`](https://python-all.ru/3.16/library/contextlib.html#contextlib.contextmanager) и [`asynccontextmanager()`](https://python-all.ru/3.16/library/contextlib.html#contextlib.asynccontextmanager), используемые как декораторы) теперь распознают функции-генераторы, корутинные функции и асинхронные функции-генераторы и держат контекстный менеджер открытым на протяжении итерации или ожидания. Ранее контекстный менеджер закрывался сразу после создания объекта генератора или корутины. (Вклад Alex Grönholm & Gregory P. Smith в [gh-125862](https://python-all.ru/3.16/whatsnew/3.15.html).)508509### dataclasses510511- Аннотации для сгенерированных методов `__init__` больше не включают внутренние имена типов.512513### dbm514515- Добавлены новые методы `reorganize()` в [`dbm.dumb`](https://python-all.ru/3.16/library/dbm.html#module-dbm.dumb) и [`dbm.sqlite3`](https://python-all.ru/3.16/library/dbm.html#module-dbm.sqlite3) для восстановления неиспользуемого свободного пространства, ранее занятого удалёнными записями. (Вклад Andrea Oliveri в [gh-134004](https://python-all.ru/3.16/whatsnew/3.15.html).)516517### difflib518519>520521- Введён необязательный параметр *color* в [`difflib.unified_diff()`](https://python-all.ru/3.16/library/difflib.html#difflib.unified_diff), позволяющий цветной вывод, аналогичный **git diff**. Это можно настроить с помощью [переменных окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Вклад Douglas Thor в [gh-133725](https://python-all.ru/3.16/whatsnew/3.15.html).)522- Улучшен стиль HTML-страниц diff, создаваемых классом [`difflib.HtmlDiff`](https://python-all.ru/3.16/library/difflib.html#difflib.HtmlDiff), и вывод перенесён на стандарт HTML5. (Вклад Jiahao Li в [gh-134580](https://python-all.ru/3.16/whatsnew/3.15.html).)523524### email525526- Генераторы электронной почты теперь вызывают ошибку, когда [`EmailMessage`](https://python-all.ru/3.16/library/email.message.html#email.message.EmailMessage) не может быть точно свёрнут из-за не-ASCII адреса электронной почты (почтового ящика) в заголовке адреса. Варианты поддержки интернационализации адресов электронной почты (EAI) обсуждаются в [`EmailPolicy.utf8`](https://python-all.ru/3.16/library/email.policy.html#email.policy.EmailPolicy.utf8). (Вклад R David Murray и Mike Edmunds в [gh-122540](https://python-all.ru/3.16/whatsnew/3.15.html).)527528### faulthandler529530- Добавлен параметр *max\_threads* в [`faulthandler.enable()`](https://python-all.ru/3.16/library/faulthandler.html#faulthandler.enable), [`faulthandler.dump_traceback()`](https://python-all.ru/3.16/library/faulthandler.html#faulthandler.dump_traceback), [`faulthandler.dump_traceback_later()`](https://python-all.ru/3.16/library/faulthandler.html#faulthandler.dump_traceback_later), и [`faulthandler.register()`](https://python-all.ru/3.16/library/faulthandler.html#faulthandler.register). (Автор: Eric Froemling в [gh-149085](https://python-all.ru/3.16/whatsnew/3.15.html).)531532### functools533534- [`singledispatchmethod()`](https://python-all.ru/3.16/library/functools.html#functools.singledispatchmethod) теперь поддерживает не-[дескрипторные](https://python-all.ru/3.16/glossary.html#term-descriptor) вызываемые объекты. (Автор: Serhiy Storchaka в [gh-140873](https://python-all.ru/3.16/whatsnew/3.15.html).)535- [`singledispatchmethod()`](https://python-all.ru/3.16/library/functools.html#functools.singledispatchmethod) теперь выполняет диспетчеризацию по второму аргументу, если он оборачивает обычный метод и вызывается как атрибут класса. (Автор: Bartosz Sławecki в [gh-143535](https://python-all.ru/3.16/whatsnew/3.15.html).)536537### gc538539- Python 3.14.0–3.14.4 поставлялся с новым инкрементальным сборщиком мусора. Однако из-за ряда [сообщений](https://python-all.ru/3.16/whatsnew/3.15.html) о значительном потреблении памяти в производственных средах было решено вернуться к поколенческому GC из версии 3.13. Этот GC используется в Python 3.14.5 и новее, а также в Python 3.15.540541### hashlib542543- Гарантирует, что хэш-функции, которые должны быть всегда *доступны*, существуют как атрибуты [`hashlib`](https://python-all.ru/3.16/library/hashlib.html#module-hashlib), даже если они не будут работать во время выполнения из-за отсутствия реализаций бэкенда. Например, `hashlib.md5` больше не будет вызывать [`AttributeError`](https://python-all.ru/3.16/library/exceptions.html#AttributeError), если OpenSSL недоступен, а Python был собран без поддержки MD5. (Автор: Bénédikt Tran в [gh-136929](https://python-all.ru/3.16/whatsnew/3.15.html).)544545### http.client546547- Новый параметр *max\_response\_headers*, передаваемый только по ключевому слову, добавлен в конструкторы [`HTTPConnection`](https://python-all.ru/3.16/library/http.client.html#http.client.HTTPConnection) и [`HTTPSConnection`](https://python-all.ru/3.16/library/http.client.html#http.client.HTTPSConnection). Этот параметр переопределяет максимальное количество разрешённых заголовков ответа по умолчанию. (Автор: Alexander Enrique Urieles Nieto в [gh-131724](https://python-all.ru/3.16/whatsnew/3.15.html).)548549### http.server550551>552553- Логирование [`BaseHTTPRequestHandler`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler), используемое [интерфейсом командной строки](https://python-all.ru/3.16/library/http.server.html#http-server-cli), по умолчанию выполняется с цветами. Это можно настраивать с помощью [переменных среды](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Автор: Hugo van Kemenade в [gh-146292](https://python-all.ru/3.16/whatsnew/3.15.html).)554- Добавлены [`default_content_type`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.default_content_type) и опция командной строки [`--content-type`](https://python-all.ru/3.16/library/http.server.html#cmdoption-http.server-content-type), позволяющие настраивать заголовок `Content-Type` по умолчанию для файлов с неизвестными расширениями. (Авторы: John Comeau и Hugo van Kemenade в [gh-113471](https://python-all.ru/3.16/whatsnew/3.15.html).)555- Добавлен новый именованный аргумент `extra_response_headers` в [`SimpleHTTPRequestHandler`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler) для поддержки пользовательских заголовков в HTTP-ответах. (Автор: Anton I. Sipos в [gh-135057](https://python-all.ru/3.16/whatsnew/3.15.html).)556- Добавлена опция `-H/--header` в **python -m http.server** интерфейс командной строки для поддержки пользовательских заголовков в HTTP-ответах. (Автор: Anton I. Sipos в [gh-135057](https://python-all.ru/3.16/whatsnew/3.15.html).)557558### importlib.metadata559560- Ранее при обращении к каталогу метаданных дистрибутива, не содержащему файла метаданных, `metadata()` и `Distribution.metadata()` возвращали пустой объект `PackageMetadata`, как если бы файл был, но пуст. Теперь выбрасывается исключение `MetadataNotFound`. См. [importlib\_metadata#493](https://python-all.ru/3.16/whatsnew/3.15.html) для контекста и обоснования, а также [gh-143387](https://python-all.ru/3.16/whatsnew/3.15.html) для обоснования вопросов совместимости. (Автор: Jason R. Coombs.)561562### inspect563564- Добавлены параметры *inherit\_class\_doc* и *fallback\_to\_class\_doc* для [`getdoc()`](https://python-all.ru/3.16/library/inspect.html#inspect.getdoc). (Автор: Serhiy Storchaka в [gh-132686](https://python-all.ru/3.16/whatsnew/3.15.html).)565566### json567568- Добавлен параметр *array\_hook* в функции [`load()`](https://python-all.ru/3.16/library/json.html#json.load) и [`loads()`](https://python-all.ru/3.16/library/json.html#json.loads): он позволяет задать колбэк для типов литералов массивов JSON, чтобы настраивать списки Python в результирующем декодированном объекте. Передача комбинированного [`frozendict`](https://python-all.ru/3.16/library/stdtypes.html#frozendict) в параметр *object\_pairs\_hook* и [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple) в `array_hook` даст глубоко вложенную неизменяемую структуру Python, представляющую данные JSON. (Автор: Joao S. O. Bueno в [gh-146440](https://python-all.ru/3.16/whatsnew/3.15.html).)569570### locale571572- [`setlocale()`](https://python-all.ru/3.16/library/locale.html#locale.setlocale) теперь поддерживает языковые коды с модификаторами `@`. Модификаторы `@` больше не отбрасываются молча в [`getlocale()`](https://python-all.ru/3.16/library/locale.html#locale.getlocale), а включаются в языковой код. (Автор: Serhiy Storchaka в [gh-137729](https://python-all.ru/3.16/whatsnew/3.15.html).)573- Отмена устаревания функции [`locale.getdefaultlocale()`](https://python-all.ru/3.16/library/locale.html#locale.getdefaultlocale). (Автор: Victor Stinner в [gh-130796](https://python-all.ru/3.16/whatsnew/3.15.html).)574575### math576577- Добавлены функции [`math.isnormal()`](https://python-all.ru/3.16/library/math.html#math.isnormal) и [`math.issubnormal()`](https://python-all.ru/3.16/library/math.html#math.issubnormal). (Автор: Sergey B Kirpichev в [gh-132908](https://python-all.ru/3.16/whatsnew/3.15.html).)578- Добавлены функции [`math.fmax()`](https://python-all.ru/3.16/library/math.html#math.fmax), [`math.fmin()`](https://python-all.ru/3.16/library/math.html#math.fmin) и [`math.signbit()`](https://python-all.ru/3.16/library/math.html#math.signbit). (Автор: Bénédikt Tran в [gh-135853](https://python-all.ru/3.16/whatsnew/3.15.html).)579580### mimetypes581582- Добавлено больше MIME-типов. (Авторы: Benedikt Johannes, Charlie Lin, Foolbar, Gil Forcada и John Franey в [gh-144217](https://python-all.ru/3.16/whatsnew/3.15.html), [gh-145720](https://python-all.ru/3.16/whatsnew/3.15.html), [gh-140937](https://python-all.ru/3.16/whatsnew/3.15.html), [gh-139959](https://python-all.ru/3.16/whatsnew/3.15.html), [gh-145698](https://python-all.ru/3.16/whatsnew/3.15.html), [gh-145718](https://python-all.ru/3.16/whatsnew/3.15.html), [gh-145918](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-144213](https://python-all.ru/3.16/whatsnew/3.15.html).)583- Переименован `application/x-texinfo` в `application/texinfo`. (Автор: Charlie Lin в [gh-140165](https://python-all.ru/3.16/whatsnew/3.15.html).)584- Изменён MIME-тип для файлов `.ai` на `application/pdf`. (Автор: Stan Ulbrych в [gh-141239](https://python-all.ru/3.16/whatsnew/3.15.html).)585586### mmap587588- [`mmap.mmap`](https://python-all.ru/3.16/library/mmap.html#mmap.mmap) теперь имеет параметр *trackfd* в Windows; если он равен `False`, дескриптор файла, соответствующий *fileno*, не будет дублироваться. (Предложено Serhiy Storchaka в [gh-78502](https://python-all.ru/3.16/whatsnew/3.15.html).)589- Добавлен метод [`mmap.mmap.set_name()`](https://python-all.ru/3.16/library/mmap.html#mmap.mmap.set_name) для аннотирования анонимного отображения памяти, если ядро Linux поддерживает *[PR\_SET\_VMA\_ANON\_NAME](https://python-all.ru/3.16/whatsnew/3.15.html)* (Linux 5.17 или новее). (Предложено Donghee Na в [gh-142419](https://python-all.ru/3.16/whatsnew/3.15.html).)590591### os592593- Добавлена [`os.statx()`](https://python-all.ru/3.16/library/os.html#os.statx) в ядре Linux версий 4.11 и новее с glibc версий 2.28 и новее. (Предложено Jeffrey Bosboom и Victor Stinner в [gh-83714](https://python-all.ru/3.16/whatsnew/3.15.html).)594- Функция [`os.makedirs()`](https://python-all.ru/3.16/library/os.html#os.makedirs) теперь имеет параметр *parent\_mode*, который позволяет задавать режим для промежуточных каталогов. Это можно использовать для воспроизведения поведения Python 3.6 и более ранних версий, передав `parent_mode=mode`. (Предложено Zackery Spytz и Gregory P. Smith в [gh-86533](https://python-all.ru/3.16/whatsnew/3.15.html).)595596### os.path597598- Добавлена поддержка режима «все, кроме последнего» в [`realpath()`](https://python-all.ru/3.16/library/os.path.html#os.path.realpath). (Предложено Serhiy Storchaka в [gh-71189](https://python-all.ru/3.16/whatsnew/3.15.html).)599- Параметр *strict* в [`os.path.realpath()`](https://python-all.ru/3.16/library/os.path.html#os.path.realpath) принимает новое значение, [`os.path.ALLOW_MISSING`](https://python-all.ru/3.16/library/os.path.html#os.path.ALLOW_MISSING). При его использовании ошибки, отличные от [`FileNotFoundError`](https://python-all.ru/3.16/library/exceptions.html#FileNotFoundError), будут возбуждаться повторно; результирующий путь может отсутствовать, но будет свободен от символических ссылок. (Предложено Petr Viktorin для [**CVE 2025-4517**](https://python-all.ru/3.16/whatsnew/3.15.html).)600601### pdb602603- Использовать новую интерактивную оболочку в качестве оболочки ввода по умолчанию для [`pdb`](https://python-all.ru/3.16/library/pdb.html#module-pdb). (Предложено Tian Gao в [gh-145379](https://python-all.ru/3.16/whatsnew/3.15.html).)604605### pickle606607- Добавлена поддержка сериализации закрытых методов и вложенных классов. (Предложено Zackery Spytz и Serhiy Storchaka в [gh-77188](https://python-all.ru/3.16/whatsnew/3.15.html).)608609### pickletools610611>612613- Вывод интерфейса командной строки [`pickletools`](https://python-all.ru/3.16/library/pickletools.html#module-pickletools) по умолчанию раскрашен. Это можно настроить с помощью [переменных окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Предложено Hugo van Kemenade в [gh-149026](https://python-all.ru/3.16/whatsnew/3.15.html).)614615### pprint616617- Добавлен именованный аргумент *expand* для [`pprint.pprint()`](https://python-all.ru/3.16/library/pprint.html#pprint.pprint), [`pprint.pformat()`](https://python-all.ru/3.16/library/pprint.html#pprint.pformat), [`pprint.pp()`](https://python-all.ru/3.16/library/pprint.html#pprint.pp). Если он истинен, вывод будет форматироваться аналогично pretty-printed [`json.dumps()`](https://python-all.ru/3.16/library/json.html#json.dumps), когда указан *indent*. (Предложено Stefan Todoran, Semyon Moroz и Hugo van Kemenade в [gh-112632](https://python-all.ru/3.16/whatsnew/3.15.html).)618- Добавлена поддержка t-строк в [`pprint`](https://python-all.ru/3.16/library/pprint.html#module-pprint). (Предложено Loïc Simon и Hugo van Kemenade в [gh-134551](https://python-all.ru/3.16/whatsnew/3.15.html).)619620### re621622- [`re.prefixmatch()`](https://python-all.ru/3.16/library/re.html#re.prefixmatch) и соответствующий [`re.Pattern.prefixmatch()`](https://python-all.ru/3.16/library/re.html#re.Pattern.prefixmatch) были добавлены как альтернативные, более явные имена для существующих и теперь [мягко устаревших](https://python-all.ru/3.16/glossary.html#term-soft-deprecated) [`re.match()`](https://python-all.ru/3.16/library/re.html#re.match) и [`re.Pattern.match()`](https://python-all.ru/3.16/library/re.html#re.Pattern.match) API. Они предназначены для устранения путаницы относительно того, что означает *match*, следуя мантре Дзена Python *«Явное лучше неявного»*. Большинство других библиотек регулярных выражений используют API с именем *match* для обозначения того, что в Python всегда называлось *search*. (Предложено Gregory P. Smith в [gh-86519](https://python-all.ru/3.16/whatsnew/3.15.html).)623624### resource625626- Добавлены новые константы: [`RLIMIT_NTHR`](https://python-all.ru/3.16/library/resource.html#resource.RLIMIT_NTHR), [`RLIMIT_UMTXP`](https://python-all.ru/3.16/library/resource.html#resource.RLIMIT_UMTXP), [`RLIMIT_THREADS`](https://python-all.ru/3.16/library/resource.html#resource.RLIMIT_THREADS), [`RLIM_SAVED_CUR`](https://python-all.ru/3.16/library/resource.html#resource.RLIM_SAVED_CUR) и [`RLIM_SAVED_MAX`](https://python-all.ru/3.16/library/resource.html#resource.RLIM_SAVED_MAX). (Предложено Serhiy Storchaka в [gh-137512](https://python-all.ru/3.16/whatsnew/3.15.html).)627628### shelve629630- Добавлен новый метод `reorganize()` к [`shelve`](https://python-all.ru/3.16/library/shelve.html#module-shelve), используемый для восстановления неиспользуемого свободного пространства, ранее занятого удалёнными записями. (Предложено Andrea Oliveri в [gh-134004](https://python-all.ru/3.16/whatsnew/3.15.html).)631- Добавлена поддержка пользовательских функций сериализации и десериализации в модуле [`shelve`](https://python-all.ru/3.16/library/shelve.html#module-shelve). (Предложено Furkan Onder в [gh-99631](https://python-all.ru/3.16/whatsnew/3.15.html).)632633### shutil634635- [`shutil.copyfile()`](https://python-all.ru/3.16/library/shutil.html#shutil.copyfile) теперь также вызывает [`SpecialFileError`](https://python-all.ru/3.16/library/shutil.html#shutil.SpecialFileError) для сокетов и файлов устройств. (Предложено Savannah Ostrowski в [gh-142693](https://python-all.ru/3.16/whatsnew/3.15.html).)636637### socket638639- Добавлены константы для протокола ISO-TP CAN. (Предложено Patrick Menschel и Stefan Tatschner в [gh-86819](https://python-all.ru/3.16/whatsnew/3.15.html).)640641### sqlite3642643- У [интерфейса командной строки](https://python-all.ru/3.16/library/sqlite3.html#sqlite3-cli) есть несколько новых возможностей:644645  - Автодополнение ключевых слов SQL по \<tab\>. (Предложено Long Tan в [gh-133393](https://python-all.ru/3.16/whatsnew/3.15.html).)646647  - Приглашения, сообщения об ошибках и справочный текст теперь раскрашены. Эта функция включена по умолчанию; подробнее см. [Управление цветом](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Предложено Stan Ulbrych и Łukasz Langa в [gh-133461](https://python-all.ru/3.16/whatsnew/3.15.html).)648  - Автодополнение таблиц, индексов, триггеров, представлений, столбцов, функций и схем по \<tab\>. (Предложено Long Tan в [gh-136101](https://python-all.ru/3.16/whatsnew/3.15.html).)649650### ssl651652- Указывает через [`ssl.HAS_PSK_TLS13`](https://python-all.ru/3.16/library/ssl.html#ssl.HAS_PSK_TLS13), поддерживает ли модуль [`ssl`](https://python-all.ru/3.16/library/ssl.html#module-ssl) «внешние PSK» в TLSv1.3, как описано в [**RFC 9258**](https://python-all.ru/3.16/whatsnew/3.15.html). (Автор: Will Childs-Klein в [gh-133624](https://python-all.ru/3.16/whatsnew/3.15.html).)653- Добавлены новые методы для управления группами, используемыми для согласования ключей SSL654655  - [`ssl.SSLContext.set_groups()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.set_groups) задаёт группы, разрешённые для согласования ключей, расширяя предыдущий метод [`ssl.SSLContext.set_ecdh_curve()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.set_ecdh_curve). Этот новый API позволяет перечислять несколько групп и поддерживает группы с фиксированным полем и постквантовые группы в дополнение к кривым ECDH. Этот метод также можно использовать для управления тем, какие доли ключа отправляются при рукопожатии TLS.656  - [`ssl.SSLSocket.group()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLSocket.group) возвращает группу, выбранную для согласования ключей на текущем соединении после завершения рукопожатия TLS. Этот вызов требует OpenSSL 3.2 или новее.657  - [`ssl.SSLContext.get_groups()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.get_groups) возвращает список всех доступных групп согласования ключей, совместимых с минимальной и максимальной версиями TLS, установленными в контексте. Этот вызов требует OpenSSL 3.5 или новее.658659  (Автор: Ron Frederick в [gh-136306](https://python-all.ru/3.16/whatsnew/3.15.html).)660- Добавлен новый метод [`ssl.SSLContext.set_ciphersuites()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.set_ciphersuites) для установки шифров TLS 1.3. Для TLS 1.2 и старше следует продолжать использовать [`ssl.SSLContext.set_ciphers()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.set_ciphers). Оба вызова можно выполнять в одном контексте, и выбранный набор шифров будет зависеть от версии TLS, согласованной при установке соединения. (Автор: Ron Frederick в [gh-137197](https://python-all.ru/3.16/whatsnew/3.15.html).)661- Добавлены новые методы для управления алгоритмами подписи:662663  - [`ssl.get_sigalgs()`](https://python-all.ru/3.16/library/ssl.html#ssl.get_sigalgs) возвращает список всех доступных алгоритмов подписи TLS. Этот вызов требует OpenSSL 3.4 или новее.664  - [`ssl.SSLContext.set_client_sigalgs()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.set_client_sigalgs) задаёт алгоритмы подписи, разрешённые для аутентификации клиента на основе сертификата.665  - [`ssl.SSLContext.set_server_sigalgs()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.set_server_sigalgs) задаёт алгоритмы подписи, разрешённые для завершения рукопожатия TLS сервером.666  - [`ssl.SSLSocket.client_sigalg()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLSocket.client_sigalg) возвращает алгоритм подписи, выбранный для аутентификации клиента на текущем соединении. Этот вызов требует OpenSSL 3.5 или новее.667  - [`ssl.SSLSocket.server_sigalg()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLSocket.server_sigalg) возвращает алгоритм подписи, выбранный для завершения сервером рукопожатия TLS на текущем соединении. Этот вызов требует OpenSSL 3.5 или новее.668669  (Автор: Ron Frederick в [gh-138252](https://python-all.ru/3.16/whatsnew/3.15.html).)670671### подпроцесс672673- [`subprocess.Popen.wait()`](https://python-all.ru/3.16/library/subprocess.html#subprocess.Popen.wait): если `timeout` не равно `None` и платформа поддерживает это, используется эффективный механизм, управляемый событиями, для ожидания завершения процесса:674675  - Linux \>= 5.3 использует [`os.pidfd_open()`](https://python-all.ru/3.16/library/os.html#os.pidfd_open) + [`select.poll()`](https://python-all.ru/3.16/library/select.html#select.poll).676  - macOS и другие варианты BSD используют [`select.kqueue()`](https://python-all.ru/3.16/library/select.html#select.kqueue) + `KQ_FILTER_PROC` + `KQ_NOTE_EXIT`.677  - Windows продолжает использовать `WaitForSingleObject` (без изменений).678679  Если ни один из этих механизмов недоступен, функция возвращается к tрадиционному циклу ожидания (неблокирующий вызов и короткие паузы). (Автор: Giampaolo Rodola в [gh-83069](https://python-all.ru/3.16/whatsnew/3.15.html).)680681### symtable682683- Добавлены методы [`symtable.Function.get_cells()`](https://python-all.ru/3.16/library/symtable.html#symtable.Function.get_cells) и [`symtable.Symbol.is_cell()`](https://python-all.ru/3.16/library/symtable.html#symtable.Symbol.is_cell). (Автор: Yashp002 в [gh-143504](https://python-all.ru/3.16/whatsnew/3.15.html).)684685### sys686687- Добавлено пространство имён [`sys.abi_info`](https://python-all.ru/3.16/library/sys.html#sys.abi_info) для улучшения доступа к информации об ABI. (Автор: Klaus Zimmermann в [gh-137476](https://python-all.ru/3.16/whatsnew/3.15.html).)688689### sys.monitoring690691- События [другие](https://python-all.ru/3.16/library/sys.monitoring.html#monitoring-event-global) ([`PY_THROW`](https://python-all.ru/3.16/library/sys.monitoring.html#monitoring-event-PY_THROW), [`PY_UNWIND`](https://python-all.ru/3.16/library/sys.monitoring.html#monitoring-event-PY_UNWIND), [`RAISE`](https://python-all.ru/3.16/library/sys.monitoring.html#monitoring-event-RAISE), [`EXCEPTION_HANDLED`](https://python-all.ru/3.16/library/sys.monitoring.html#monitoring-event-EXCEPTION_HANDLED) и [`RERAISE`](https://python-all.ru/3.16/library/sys.monitoring.html#monitoring-event-RERAISE)) теперь можно включать и отключать для каждого объекта кода. Возврат [`DISABLE`](https://python-all.ru/3.16/library/sys.monitoring.html#sys.monitoring.DISABLE) из колбэка для одного из этих событий отключает событие для всего объекта кода (для текущего инструмента), а не вызывает исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError), как в предыдущих версиях. (Автор: Gabriele N. Tornetta в [gh-146182](https://python-all.ru/3.16/whatsnew/3.15.html).)692693### tarfile694695- [`data_filter()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.data_filter) теперь нормализует цели символических ссылок для предотвращения атак с обходом пути. (Вклад Petr Viktorin в [gh-127987](https://python-all.ru/3.16/whatsnew/3.15.html) и [**CVE 2025-4138**](https://python-all.ru/3.16/whatsnew/3.15.html).)696- [`extractall()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.TarFile.extractall) теперь пропускает исправление атрибутов каталога, если каталог был удалён или заменён файлом другого типа. (Вклад Petr Viktorin в [gh-127987](https://python-all.ru/3.16/whatsnew/3.15.html) и [**CVE 2024-12718**](https://python-all.ru/3.16/whatsnew/3.15.html).)697- [`extract()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.TarFile.extract) и [`extractall()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.TarFile.extractall) теперь (повторно) применяют фильтр извлечения при замене ссылки (жёсткой или символической) копией другого члена архива, а также при исправлении атрибутов каталога. Первое вызывает новое исключение [`LinkFallbackError`](https://python-all.ru/3.16/library/tarfile.html#tarfile.LinkFallbackError). (Вклад Petr Viktorin для [**CVE 2025-4330**](https://python-all.ru/3.16/whatsnew/3.15.html) и [**CVE 2024-12718**](https://python-all.ru/3.16/whatsnew/3.15.html).)698- [`extract()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.TarFile.extract) и [`extractall()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.TarFile.extractall) больше не извлекают отклонённые элементы, когда [`errorlevel()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.TarFile.errorlevel) равно нулю. (Вклад Matt Prodani и Petr Viktorin в [gh-112887](https://python-all.ru/3.16/whatsnew/3.15.html) и [**CVE 2025-4435**](https://python-all.ru/3.16/whatsnew/3.15.html).)699- [`extract()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.TarFile.extract) и [`extractall()`](https://python-all.ru/3.16/library/tarfile.html#tarfile.TarFile.extractall) теперь заменяют косые черты на обратные косые черты в целях символических ссылок в Windows, чтобы предотвратить создание повреждённых ссылок. (Автор: Christoph Walcher в [gh-57911](https://python-all.ru/3.16/whatsnew/3.15.html).)700701### threading702703- Добавлены [`serialize_iterator`](https://python-all.ru/3.16/library/threading.html#threading.serialize_iterator), [`synchronized_iterator()`](https://python-all.ru/3.16/library/threading.html#threading.synchronized_iterator) и [`concurrent_tee()`](https://python-all.ru/3.16/library/threading.html#threading.concurrent_tee) для поддержки конкурентного доступа к генераторам и итераторам. (Автор: Raymond Hettinger в [gh-124397](https://python-all.ru/3.16/whatsnew/3.15.html).)704705### timeit706707>708709- Вывод интерфейса командной строки [`timeit`](https://python-all.ru/3.16/library/timeit.html#module-timeit) по умолчанию цветной. Это можно контролировать с помощью [переменных окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Автор: Hugo van Kemenade в [gh-146609](https://python-all.ru/3.16/whatsnew/3.15.html).)710- Интерфейс командной строки теперь по умолчанию раскрашивает трассировки ошибок. Это можно настроить с помощью [переменных окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Автор: Yi Hong в [gh-139374](https://python-all.ru/3.16/whatsnew/3.15.html).)711- Сделать целевое время [`timeit.Timer.autorange()`](https://python-all.ru/3.16/library/timeit.html#timeit.Timer.autorange) настраиваемым и добавить опцию `--target-time` в интерфейс командной строки. (Автор: Alessandro Cucci и Miikka Koskinen в [gh-80642](https://python-all.ru/3.16/whatsnew/3.15.html).)712713### tkinter714715- Метод `tkinter.Text.search()` теперь поддерживает два дополнительных аргумента: *nolinestop*, позволяющий продолжать поиск через границы строк; и *strictlimits*, ограничивающий поиск заданным диапазоном. (Автор: Rihaan Meher в [gh-130848](https://python-all.ru/3.16/whatsnew/3.15.html).)716- Был добавлен новый метод `tkinter.Text.search_all()`. Этот метод позволяет искать все совпадения с шаблоном с использованием опций `-all` и `-overlap` Tcl. (Автор: Rihaan Meher в [gh-130848](https://python-all.ru/3.16/whatsnew/3.15.html).)717- Добавлены новые методы `pack_content()`, `place_content()` и `grid_content()`, которые используют новые имена команд Tk (представленные в Tk 8.6) вместо методов `*_slaves()`, использующих устаревшие имена. (Автор: Serhiy Storchaka в [gh-143754](https://python-all.ru/3.16/whatsnew/3.15.html).)718- Добавлены атрибуты `Event`: `user_data` для виртуальных событий Tk и `detail` для событий `Enter`, `Leave`, `FocusIn`, `FocusOut` и `ConfigureRequest`. (Автор: Matthias Kievernagel и Serhiy Storchaka в [gh-47655](https://python-all.ru/3.16/whatsnew/3.15.html).)719720### tokenize721722>723724- Вывод [`tokenize`](https://python-all.ru/3.16/library/tokenize.html#module-tokenize) [интерфейса командной строки](https://python-all.ru/3.16/library/tokenize.html#tokenize-cli) по умолчанию раскрашивается. Это можно настроить с помощью [переменных окружения](https://python-all.ru/3.16/using/cmdline.html#using-on-controlling-color). (Автор: Hugo van Kemenade в [gh-148991](https://python-all.ru/3.16/whatsnew/3.15.html).)725726### tomllib727728- Модуль [`tomllib`](https://python-all.ru/3.16/library/tomllib.html#module-tomllib) теперь поддерживает TOML 1.1.0. Это обновление обратно совместимо, то есть все корректные документы TOML 1.0.0 разбираются так же, как и раньше.729730  Изменения, согласно [официальному журналу изменений TOML](https://python-all.ru/3.16/whatsnew/3.15.html):731732  - Разрешены переводы строк и конечные запятые во встроенных таблицах.733734    Раньше встроенная таблица должна была быть в одной строке и не могла заканчиваться конечной запятой. Теперь это ограничение снято, так что следующее допустимо:735736    ```toml737    tbl = {738       key      = "a string",739       moar-tbl =  {740          key = 1,741       },742    }743    ```744  - Добавлена нотация `\xHH` для базовых строк для кодовых точек ниже 255, и управляющая последовательность `\e` для символа экранирования:745746    ```toml747    null = "null byte: \x00; letter a: \x61"748    csi = "\e["749    ```750  - Секунды в значениях даты-времени и времени теперь необязательны. Следующие теперь допустимы:751752    ```toml753    dt = 2010-02-03 14:15754    t  = 14:15755    ```756757  (Автор: Taneli Hukkinen в [gh-142956](https://python-all.ru/3.16/whatsnew/3.15.html).)758759### types760761- Предоставлен прокси-тип с сквозной записью [`locals()`](https://python-all.ru/3.16/library/functions.html#locals) как [`types.FrameLocalsProxyType`](https://python-all.ru/3.16/library/types.html#types.FrameLocalsProxyType). Он представляет тип атрибута [`frame.f_locals`](https://python-all.ru/3.16/reference/datamodel.html#frame.f_locals), как описано в [**PEP 667**](https://python-all.ru/3.16/whatsnew/3.15.html).762763### typing764765- [**PEP 747**](https://python-all.ru/3.16/whatsnew/3.15.html): Добавлено [`TypeForm`](https://python-all.ru/3.16/library/typing.html#typing.TypeForm), новая специальная форма для аннотирования значений, которые сами являются выражениями типов. `TypeForm[T]` означает «объект формы типа, описывающий `T` (или тип, присваиваемый `T`)». Во время выполнения `TypeForm(x)` просто возвращает `x`, что позволяет явно аннотировать значения формы типа без изменения поведения.766767  Это помогает библиотекам, которые принимают предоставленные пользователем выражения типов (например, классы `int`, `str | None`, [`TypedDict`](https://python-all.ru/3.16/library/typing.html#typing.TypedDict) или `list[int]`), предоставлять точные сигнатуры:768769  ```python770  from typing import Any, TypeForm771772  def cast[T](typ: TypeForm[T], value: Any) -> T: ...773  ```774775  (Автор: Jelle Zijlstra в [gh-145033](https://python-all.ru/3.16/whatsnew/3.15.html).)776777- [**PEP 728**](https://python-all.ru/3.16/whatsnew/3.15.html): Добавлена поддержка в [`TypedDict`](https://python-all.ru/3.16/library/typing.html#typing.TypedDict) для аргументов класса *closed* и *extra\_items*. Закрытый `TypedDict` не допускает дополнительных ключей, кроме указанных в теле класса, в то время как `TypedDict` с `extra_items` допускает произвольные дополнительные элементы, значения которых относятся к указанному типу. (Автор: Angela Liss в [gh-137840](https://python-all.ru/3.16/whatsnew/3.15.html).)778- Код вида `class ExtraTypeVars(P1[S], Protocol[T, T2]): ...` теперь вызывает [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), потому что `S` не указан в параметрах `Protocol`. (Автор: Nikita Sobolev в [gh-137191](https://python-all.ru/3.16/whatsnew/3.15.html).)779- Код вида `class B2(A[T2], Protocol[T1, T2]): ...` теперь корректно обрабатывает порядок параметров типа: это `(T1, T2)`, а не `(T2, T1)`, как ранее ошибочно определялось во время выполнения. (Автор: Nikita Sobolev в [gh-137191](https://python-all.ru/3.16/whatsnew/3.15.html).)780- [**PEP 800**](https://python-all.ru/3.16/whatsnew/3.15.html): Добавлен [`@typing.disjoint_base`](https://python-all.ru/3.16/library/typing.html#typing.disjoint_base), новый декоратор, помечающий класс как непересекающуюся базу. Это расширенная возможность, предназначенная в первую очередь для того, чтобы проверяющие типы могли точно отражать семантику времени выполнения типов, определённых как встроенные или в скомпилированных расширениях. Если класс `C` является непересекающейся базой, то дочерние классы этого класса не могут наследовать от других непересекающихся баз, которые не являются родительскими или дочерними классами `C`. (Автор: Jelle Zijlstra в [gh-148639](https://python-all.ru/3.16/whatsnew/3.15.html).)781- [`TypeVarTuple`](https://python-all.ru/3.16/library/typing.html#typing.TypeVarTuple) теперь принимает именованные аргументы `bound`, `covariant`, `contravariant` и `infer_variance`, соответствующие интерфейсу [`TypeVar`](https://python-all.ru/3.16/library/typing.html#typing.TypeVar) и [`ParamSpec`](https://python-all.ru/3.16/library/typing.html#typing.ParamSpec). Семантика `bound` остаётся неопределённой в спецификации.782783### unicodedata784785- База данных Unicode обновлена до версии 17.0.0.786- Добавлены функции [`unicodedata.isxidstart()`](https://python-all.ru/3.16/library/unicodedata.html#unicodedata.isxidstart) и [`unicodedata.isxidcontinue()`](https://python-all.ru/3.16/library/unicodedata.html#unicodedata.isxidcontinue) для проверки, может ли символ начинать или продолжать идентификатор в соответствии с [Приложением №31 к Стандарту Unicode](https://python-all.ru/3.16/whatsnew/3.15.html). (Автор: Stan Ulbrych в [gh-129117](https://python-all.ru/3.16/whatsnew/3.15.html).)787- Добавлена функция [`iter_graphemes()`](https://python-all.ru/3.16/library/unicodedata.html#unicodedata.iter_graphemes) для перебора графемных кластеров в соответствии с правилами, определёнными в [Приложении №29 к Стандарту Unicode, «Сегментация текста Unicode»](https://python-all.ru/3.16/whatsnew/3.15.html). Добавлены функции [`grapheme_cluster_break()`](https://python-all.ru/3.16/library/unicodedata.html#unicodedata.grapheme_cluster_break), [`indic_conjunct_break()`](https://python-all.ru/3.16/library/unicodedata.html#unicodedata.indic_conjunct_break) и [`extended_pictographic()`](https://python-all.ru/3.16/library/unicodedata.html#unicodedata.extended_pictographic) для получения свойств символа, связанных с указанным алгоритмом. (Автор: Serhiy Storchaka и Guillaume Sanchez в [gh-74902](https://python-all.ru/3.16/whatsnew/3.15.html).)788- Добавлена функция [`block()`](https://python-all.ru/3.16/library/unicodedata.html#unicodedata.block), возвращающая [блок Юникода](https://python-all.ru/3.16/whatsnew/3.15.html) для заданного символа. (Автор: Stan Ulbrych в [gh-66802](https://python-all.ru/3.16/whatsnew/3.15.html).)789790### unittest791792- [`unittest.TestCase.assertLogs()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertLogs) теперь принимает форматтер для управления форматированием сообщений. (Автор: Garry Cairns в [gh-134567](https://python-all.ru/3.16/whatsnew/3.15.html).)793- [`unittest.TestCase.assertWarns()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertWarns) и [`unittest.TestCase.assertWarnsRegex()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertWarnsRegex) больше не подавляют предупреждения, не соответствующие указанной категории или регулярному выражению. Теперь поддерживаются вложенные менеджеры контекста. (Автор: Serhiy Storchaka в [gh-143231](https://python-all.ru/3.16/whatsnew/3.15.html).)794795### urllib.parse796797- Добавлен параметр *missing\_as\_none* в функции [`urlsplit()`](https://python-all.ru/3.16/library/urllib.parse.html#urllib.parse.urlsplit), [`urlparse()`](https://python-all.ru/3.16/library/urllib.parse.html#urllib.parse.urlparse) и [`urldefrag()`](https://python-all.ru/3.16/library/urllib.parse.html#urllib.parse.urldefrag). Добавлен параметр *keep\_empty* в функции [`urlunsplit()`](https://python-all.ru/3.16/library/urllib.parse.html#urllib.parse.urlunsplit) и [`urlunparse()`](https://python-all.ru/3.16/library/urllib.parse.html#urllib.parse.urlunparse). Это позволяет различать пустые и неопределённые компоненты URI, а также сохранять пустые компоненты. (Автор: Serhiy Storchaka в [gh-67041](https://python-all.ru/3.16/whatsnew/3.15.html).)798799### venv800801- На платформах POSIX каталоги platlib будут создаваться при необходимости во время создания виртуальных окружений, вместо использования символической ссылки `lib64 -> lib`. Это означает, что purelib и platlib виртуальных окружений больше не используют общий каталог `lib` на платформах, где [`sys.platlibdir`](https://python-all.ru/3.16/library/sys.html#sys.platlibdir) не равно `lib`. (Автор: Rui Xi в [gh-133951](https://python-all.ru/3.16/whatsnew/3.15.html).)802803### warnings804805- Улучшена фильтрация по модулю в [`warnings.warn_explicit()`](https://python-all.ru/3.16/library/warnings.html#warnings.warn_explicit), если не передан аргумент *module*. Теперь регулярное выражение модуля в фильтре предупреждений проверяется не только на соответствие имени файла с удалённым `.py`, но и на соответствие именам модулей, построенным начиная с разных родительских каталогов файла (с удалёнными `/__init__.py`, `.py` и, в Windows, `.pyw`). (Автор: Serhiy Storchaka в [gh-135801](https://python-all.ru/3.16/whatsnew/3.15.html).)806807### wave808809- Добавлена поддержка WAVE-аудио в формате IEEE с плавающей точкой (`WAVE_FORMAT_IEEE_FLOAT`) в [`wave`](https://python-all.ru/3.16/library/wave.html#module-wave).810- Добавлены [`wave.Wave_read.getformat()`](https://python-all.ru/3.16/library/wave.html#wave.Wave_read.getformat), [`wave.Wave_write.getformat()`](https://python-all.ru/3.16/library/wave.html#wave.Wave_write.getformat), и [`wave.Wave_write.setformat()`](https://python-all.ru/3.16/library/wave.html#wave.Wave_write.setformat) для явной обработки формата кадров.811- [`wave.Wave_write.setparams()`](https://python-all.ru/3.16/library/wave.html#wave.Wave_write.setparams) принимает как кортежи из 7 элементов, включающие `format`, так и кортежи из 6 элементов для обратной совместимости (по умолчанию `WAVE_FORMAT_PCM`).812- Вывод `WAVE_FORMAT_IEEE_FLOAT` теперь включает чанк `fact`, как требуется для не-PCM форматов WAVE.813814(Авторы: Lionel Koenig и Michiel W. Beijen в [gh-60729](https://python-all.ru/3.16/whatsnew/3.15.html).)815816### webbrowser817818- На macOS новый класс `webbrowser.MacOS` открывает URL через **/usr/bin/open** вместо создания и выполнения AppleScript через **osascript**. Браузер по умолчанию определяется из файла настроек LaunchServices с помощью [`plistlib`](https://python-all.ru/3.16/library/plistlib.html#module-plistlib), с `com.apple.Safari` в качестве запасного варианта на свежих установках. Для URL, отличных от HTTP(S), используется **open -b \<bundle-id\>**, чтобы направить URL через браузер, а не через обработчик файлов ОС, предотвращая атаки с внедрением файлов. (Автор: Jeff Lyon в [gh-137586](https://python-all.ru/3.16/whatsnew/3.15.html).)819820### xml821822- Добавлена функция [`xml.is_valid_name()`](https://python-all.ru/3.16/library/xml.html#xml.is_valid_name) для проверки, может ли строка использоваться как имя элемента или атрибута в XML. (Автор: Serhiy Storchaka в [gh-139489](https://python-all.ru/3.16/whatsnew/3.15.html).)823- Добавлена функция [`xml.is_valid_text()`](https://python-all.ru/3.16/library/xml.html#xml.is_valid_text), позволяющая проверить, может ли строка использоваться в XML-документе. (Автор: Serhiy Storchaka в [gh-139489](https://python-all.ru/3.16/whatsnew/3.15.html).)824825### xml.parsers.expat826827- Добавлены [`SetAllocTrackerActivationThreshold()`](https://python-all.ru/3.16/library/pyexpat.html#xml.parsers.expat.xmlparser.SetAllocTrackerActivationThreshold) и [`SetAllocTrackerMaximumAmplification()`](https://python-all.ru/3.16/library/pyexpat.html#xml.parsers.expat.xmlparser.SetAllocTrackerMaximumAmplification) в объекты [xmlparser](https://python-all.ru/3.16/library/pyexpat.html#xmlparser-objects) для настройки защиты от непропорционально большого использования динамической памяти внутри парсера Expat. (Автор: Bénédikt Tran в [gh-90949](https://python-all.ru/3.16/whatsnew/3.15.html).)828- Добавлены [`SetBillionLaughsAttackProtectionActivationThreshold()`](https://python-all.ru/3.16/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBillionLaughsAttackProtectionActivationThreshold) и [`SetBillionLaughsAttackProtectionMaximumAmplification()`](https://python-all.ru/3.16/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBillionLaughsAttackProtectionMaximumAmplification) в объекты [xmlparser](https://python-all.ru/3.16/library/pyexpat.html#xmlparser-objects) для настройки защиты от атак [«billion laughs»](https://python-all.ru/3.16/whatsnew/3.15.html). (Автор: Bénédikt Tran в [gh-90949](https://python-all.ru/3.16/whatsnew/3.15.html).)829830### zlib831832- Разрешено объединение двух контрольных сумм Adler-32 с помощью [`adler32_combine()`](https://python-all.ru/3.16/library/zlib.html#zlib.adler32_combine). (Авторы: Callum Attryde и Bénédikt Tran в [gh-134635](https://python-all.ru/3.16/whatsnew/3.15.html).)833- Разрешено объединение двух контрольных сумм CRC-32 с помощью [`crc32_combine()`](https://python-all.ru/3.16/library/zlib.html#zlib.crc32_combine). (Автор: Bénédikt Tran в [gh-134635](https://python-all.ru/3.16/whatsnew/3.15.html).)834835## Оптимизации836837- `mimalloc` теперь используется в качестве распределителя по умолчанию для выделения сырой памяти, например через [`PyMem_RawMalloc()`](https://python-all.ru/3.16/c-api/memory.html#c.PyMem_RawMalloc), для повышения производительности на [сборках со свободной многопоточностью](https://python-all.ru/3.16/glossary.html#term-free-threaded-build). (Автор: Kumar Aditya в [gh-144914](https://python-all.ru/3.16/whatsnew/3.15.html).)838839### base64 & binascii840841- Базовая реализация base64 в CPython теперь кодирует в 2 раза быстрее и декодирует в 3 раза быстрее благодаря простым оптимизациям конвейеризации CPU. (Авторы: Gregory P. Smith и Serhiy Storchaka в [gh-143262](https://python-all.ru/3.16/whatsnew/3.15.html).)842- Реализация кодирования Ascii85, Base85 и Z85 переписана на C. Кодирование и декодирование теперь на два порядка быстрее и потребляют на два порядка меньше памяти. (Авторы: James Seo и Serhiy Storchaka в [gh-101178](https://python-all.ru/3.16/whatsnew/3.15.html).)843- Реализация Base32 переписана на C. Кодирование и декодирование теперь на два порядка быстрее. (Автор: James Seo в [gh-146192](https://python-all.ru/3.16/whatsnew/3.15.html).)844845### csv846847- [`csv.Sniffer.sniff()`](https://python-all.ru/3.16/library/csv.html#csv.Sniffer.sniff) определение разделителя теперь работает до 1.6 раз быстрее. (Автор: Maurycy Pawłowski-Wieroński в [gh-137628](https://python-all.ru/3.16/whatsnew/3.15.html).)848849### Улучшенный JIT-компилятор850851Результаты набора тестов [pyperformance](https://python-all.ru/3.16/whatsnew/3.15.html) показывают [8-9%](https://python-all.ru/3.16/whatsnew/3.15.html) среднее геометрическое улучшение производительности JIT по сравнению со стандартным интерпретатором CPython, собранным со всеми оптимизациями, на x86-64 Linux. На AArch64 macOS JIT имеет [12-13%](https://python-all.ru/3.16/whatsnew/3.15.html) ускорение по сравнению с [интерпретатором с хвостовыми вызовами](https://python-all.ru/3.16/whatsnew/3.14.html#whatsnew314-tail-call-interpreter) со всеми включёнными оптимизациями. Ускорение сборок с JIT относительно сборок без JIT варьируется от примерно 15% замедления до более чем 100% ускорения (без учёта микробенчмарка `unpack_sequence`) на системах x86-64 Linux и AArch64 macOS.852853> **Внимание**854>855> Основные улучшения JIT:856857Основные улучшения JIT:858859- Новый интерфейс трассировки860- Базовая регистровая аллокация в JIT861- Больше оптимизаций JIT862- More JIT optimizations863- GDB and GNU `backtrace()` unwinding support864- Улучшенная генерация машинного кода865866LLVM 21 build-time dependency867868The JIT compiler now uses LLVM 21 for build-time stencil generation. As always, LLVM is only needed when building CPython with the JIT enabled; end users running Python do not need LLVM installed. Instructions for installing LLVM can be found in the [JIT compiler documentation](https://python-all.ru/3.16/whatsnew/3.15.html) for all supported platforms. (Contributed by Savannah Ostrowski in [gh-140973](https://python-all.ru/3.16/whatsnew/3.15.html).)869870A new tracing frontend871872The JIT compiler now supports significantly more bytecode operations and control flow than in Python 3.14, enabling speedups on a wider variety of code. For example, simple Python object creation is now understood by the 3.15 JIT compiler. Overloaded operations and generators are also partially supported. This was made possible by an overhauled JIT tracing frontend that records actual execution paths through code, rather than estimating them as the previous implementation did. (Contributed by Ken Jin in [gh-139109](https://python-all.ru/3.16/whatsnew/3.15.html). Support for Windows added by Mark Shannon in [gh-141703](https://python-all.ru/3.16/whatsnew/3.15.html).)873874Basic register allocation in the JIT875876A basic form of register allocation has been added to the JIT compiler’s optimizer. This allows the JIT compiler to avoid certain stack operations altogether and instead operate on registers. This allows the JIT to produce more efficient traces by avoiding reads and writes to memory. (Contributed by Mark Shannon in [gh-135379](https://python-all.ru/3.16/whatsnew/3.15.html).)877878More JIT optimizations879880Теперь выполняется больше [распространения констант](https://python-all.ru/3.16/whatsnew/3.15.html). Это означает, что когда JIT-компилятор обнаруживает, что определённый пользовательский код приводит к константам, код может быть упрощён JIT. (Авторы: Ken Jin и Savannah Ostrowski в [gh-132732](https://python-all.ru/3.16/whatsnew/3.15.html).)881882[Счётчики ссылок](https://python-all.ru/3.16/glossary.html#term-reference-count) избегаются везде, где это безопасно. Это в целом снижает стоимость большинства операций в Python. (Авторы: Ken Jin, Donghee Na, Zheao Li, Hai Zhu, Savannah Ostrowski, Reiden Ong, Noam Cohen, Tomas Roun, PuQing, Cajetan Rodrigues и Sacul в [gh-134584](https://python-all.ru/3.16/whatsnew/3.15.html).)883884Отслеживая уникальные ссылки на объекты, оптимизатор JIT теперь может исключать обновления счётчика ссылок и выполнять операции на месте с int и float. (Авторы: Reiden Ong и Pieter Eendebak в [gh-143414](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-146306](https://python-all.ru/3.16/whatsnew/3.15.html).)885886Поддержка раскрутки стека в GDB и GNU [gh-131798](https://python-all.ru/3.16/whatsnew/3.15.html)887888GDB and GNU `backtrace()` unwinding support889890The JIT compiler now publishes unwind information for generated machine code to the GDB interface on supported Linux ELF platforms. When libgcc frame registration is available, the same unwind information is also registered for GNU `backtrace()` stack walkers. This allows native debuggers, crash handlers, and diagnostic tools using these mechanisms to unwind through JIT frames instead of stopping at generated code. (Contributed by Diego Russo and Pablo Galindo Salgado in [gh-146071](https://python-all.ru/3.16/whatsnew/3.15.html) and [gh-149104](https://python-all.ru/3.16/whatsnew/3.15.html).)891892Better machine code generation893894The JIT compiler’s machine code generator now produces better machine code for x86-64 and AArch64 macOS and Linux targets. In general, users should experience lower memory usage for generated machine code and more efficient machine code versus 3.14. (Contributed by Brandt Bucher in [gh-136528](https://python-all.ru/3.16/whatsnew/3.15.html) and [gh-135905](https://python-all.ru/3.16/whatsnew/3.15.html). Implementation for AArch64 contributed by Mark Shannon in [gh-139855](https://python-all.ru/3.16/whatsnew/3.15.html). Additional optimizations for AArch64 contributed by Mark Shannon and Diego Russo in [gh-140683](https://python-all.ru/3.16/whatsnew/3.15.html) and [gh-142305](https://python-all.ru/3.16/whatsnew/3.15.html).)895896Maintainability897898The JIT optimizer’s operations have been simplified. This was made possible by a refactoring of JIT data structures. (Contributed by Zhongtian Zheng in [gh-148211](https://python-all.ru/3.16/whatsnew/3.15.html) and Hai Zhu in [gh-143421](https://python-all.ru/3.16/whatsnew/3.15.html).)899900## Удалено901902### ast903904- Конструкторы [узлов AST](https://python-all.ru/3.16/library/ast.html#ast-nodes) теперь вызывают [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), когда пропущен обязательный аргумент или передан именованный аргумент, не соответствующий полю узла AST. Ранее в этих случаях начиная с Python 3.13 вызывалось [`DeprecationWarning`](https://python-all.ru/3.16/library/exceptions.html#DeprecationWarning). (Авторы: Brian Schubert и Jelle Zijlstra в [gh-137600](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-105858](https://python-all.ru/3.16/whatsnew/3.15.html).)905906### collections.abc907908- [`collections.abc.ByteString`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.ByteString) удалён из `collections.abc.__all__`. `collections.abc.ByteString` устарел начиная с Python 3.12, и запланирован к удалению в Python 3.17.909910### ctypes911912- Удалена недокументированная функция `ctypes.SetPointerType()`, которая была устаревшей начиная с Python 3.13. (Автор: Bénédikt Tran в [gh-133866](https://python-all.ru/3.16/whatsnew/3.15.html).)913- Изменены [`_type_`](https://python-all.ru/3.16/library/ctypes.html#ctypes._SimpleCData._type_) [`c_float_complex`](https://python-all.ru/3.16/library/ctypes.html#ctypes.c_float_complex), [`c_double_complex`](https://python-all.ru/3.16/library/ctypes.html#ctypes.c_double_complex) и [`c_longdouble_complex`](https://python-all.ru/3.16/library/ctypes.html#ctypes.c_longdouble_complex) с `F`, `D` и `G` на `Zf`, `Zd` и `Zg` для совместимости с numpy. (Автор: Victor Stinner в [gh-148675](https://python-all.ru/3.16/whatsnew/3.15.html).)914915### datetime916917- [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) теперь возбуждает [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError), если строка формата содержит `%d` (день месяца) без указания года. Это поведение устарело начиная с Python 3.13. (Авторы: Stan Ulbrych и Gregory P. Smith в [gh-70647](https://python-all.ru/3.16/whatsnew/3.15.html).)918919### glob920921- Удалены недокументированные функции `glob.glob0()` и `glob.glob1()`, которые были устаревшими начиная с Python 3.13. Используйте [`glob.glob()`](https://python-all.ru/3.16/library/glob.html#glob.glob) и передайте каталог в его аргумент *root\_dir*. (Автор: Barney Gale в [gh-137466](https://python-all.ru/3.16/whatsnew/3.15.html).)922923### http.server924925- Удалены класс `CGIHTTPRequestHandler` и флаг `--cgi` из интерфейса командной строки **python -m http.server**. Они были объявлены устаревшими в Python 3.13. (Автор: Bénédikt Tran в [gh-133810](https://python-all.ru/3.16/whatsnew/3.15.html).)926927### importlib.resources928929- Удалён устаревший параметр `package` из функции [`importlib.resources.files()`](https://python-all.ru/3.16/library/importlib.resources.html#importlib.resources.files). (Автор: Semyon Moroz в [gh-138044](https://python-all.ru/3.16/whatsnew/3.15.html).)930931### pathlib932933- [`pathlib.Path.mkdir()`](https://python-all.ru/3.16/library/pathlib.html#pathlib.Path.mkdir) теперь имеет параметр *parent\_mode*, позволяющий указывать режим для промежуточных каталогов при `parents=True`. (Автор: Gregory P. Smith в [gh-86533](https://python-all.ru/3.16/whatsnew/3.15.html).)934- Удалено устаревшее `pathlib.PurePath.is_reserved()`. Используйте [`os.path.isreserved()`](https://python-all.ru/3.16/library/os.path.html#os.path.isreserved) для обнаружения зарезервированных путей в Windows. (Автор: Nikita Sobolev в [gh-133875](https://python-all.ru/3.16/whatsnew/3.15.html).)935936### platform937938- Удалена функция `platform.java_ver()`, которая была устаревшей начиная с Python 3.13. (Автор: Alexey Makridenko в [gh-133604](https://python-all.ru/3.16/whatsnew/3.15.html).)939940### sre\_\*941942- Удалены модули `sre_compile`, `sre_constants` и `sre_parse`. (Автор: Stan Ulbrych в [gh-135994](https://python-all.ru/3.16/whatsnew/3.15.html).)943944### sysconfig945946- Удалён параметр *check\_home* у [`sysconfig.is_python_build()`](https://python-all.ru/3.16/library/sysconfig.html#sysconfig.is_python_build). (Автор: Filipe Laíns в [gh-92897](https://python-all.ru/3.16/whatsnew/3.15.html).)947948### threading949950- Удалена поддержка произвольных позиционных или именованных аргументов в C-реализации объектов [`RLock`](https://python-all.ru/3.16/library/threading.html#threading.RLock). Это было объявлено устаревшим в Python 3.14. (Автор: Bénédikt Tran в [gh-134087](https://python-all.ru/3.16/whatsnew/3.15.html).)951952### types953954- Удалён устаревший в [**PEP 626**](https://python-all.ru/3.16/whatsnew/3.15.html) начиная с Python 3.12 `codeobject.co_lnotab` из [`types.CodeType`](https://python-all.ru/3.16/library/types.html#types.CodeType). (Автор: Nikita Sobolev в [gh-134690](https://python-all.ru/3.16/whatsnew/3.15.html).)955956### typing957958- [`typing.ByteString`](https://python-all.ru/3.16/library/typing.html#typing.ByteString) удалён из `typing.__all__`. `typing.ByteString` устарел начиная с Python 3.9 и запланирован к удалению в Python 3.17.959- Недокументированный синтаксис именованных аргументов для создания классов [`NamedTuple`](https://python-all.ru/3.16/library/typing.html#typing.NamedTuple) (например, `Point = NamedTuple("Point", x=int, y=int)`) больше не поддерживается. Используйте вместо него синтаксис на основе класса или функциональный синтаксис. (Автор: Bénédikt Tran в [gh-133817](https://python-all.ru/3.16/whatsnew/3.15.html).)960- Использование `TD = TypedDict("TD")` или `TD = TypedDict("TD", None)` для создания типа [`TypedDict`](https://python-all.ru/3.16/library/typing.html#typing.TypedDict) с нулевым количеством полей больше не поддерживается. Используйте `class TD(TypedDict): pass` или `TD = TypedDict("TD", {})` вместо этого. (Автор: Bénédikt Tran в [gh-133823](https://python-all.ru/3.16/whatsnew/3.15.html).)961- Устаревшее `@typing.no_type_check_decorator` удалено. (Автор: Nikita Sobolev в [gh-133601](https://python-all.ru/3.16/whatsnew/3.15.html).)962963### wave964965- Удалены методы `getmark()`, `setmark()` и `getmarkers()` классов [`Wave_read`](https://python-all.ru/3.16/library/wave.html#wave.Wave_read) и [`Wave_write`](https://python-all.ru/3.16/library/wave.html#wave.Wave_write), которые были устаревшими начиная с Python 3.13. (Автор: Bénédikt Tran в [gh-133873](https://python-all.ru/3.16/whatsnew/3.15.html).)966967### zipimport968969- Удалено устаревшее `zipimport.zipimporter.load_module()`. Вместо него используйте [`zipimport.zipimporter.exec_module()`](https://python-all.ru/3.16/library/zipimport.html#zipimport.zipimporter.exec_module). (Автор: Jiahao Li в [gh-133656](https://python-all.ru/3.16/whatsnew/3.15.html).)970971## Устарело972973### Новые устаревания974975- [`ast`](https://python-all.ru/3.16/library/ast.html#module-ast)976977  - Создание экземпляров абстрактных узлов AST (таких как [`ast.AST`](https://python-all.ru/3.16/library/ast.html#ast.AST) или `ast.expr`) устарело и будет вызывать ошибку в Python 3.20.978979    (Автор: Brian Schubert в [gh-116021](https://python-all.ru/3.16/whatsnew/3.15.html).)980- [`base64`](https://python-all.ru/3.16/library/base64.html#module-base64):981982  - Принятие символов `+` и `/` с альтернативным алфавитом в [`b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.b64decode) и [`urlsafe_b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.urlsafe_b64decode) теперь устарело. В будущих версиях Python они будут вызывать ошибку в строгом режиме и отбрасываться в нестрогом режиме. (Автор: Serhiy Storchaka в [gh-125346](https://python-all.ru/3.16/whatsnew/3.15.html).)983- CLI:984985  - Устарели параметры командной строки [`-b`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-b) и `-bb` и запланированы к превращению в заглушки в Python 3.17. Они были в основном помощниками для перехода с Python 2 на 3. Начиная с Python 3.17, [`BytesWarning`](https://python-all.ru/3.16/library/exceptions.html#BytesWarning) не будет вызываться для этих случаев; вместо этого используйте средство проверки типов.986987    (Автор: Nikita Sobolev в [gh-136355](https://python-all.ru/3.16/whatsnew/3.15.html).)988- [`collections.abc`](https://python-all.ru/3.16/library/collections.abc.html#module-collections.abc)989990  - Следующие инструкции теперь вызывают выдачу `DeprecationWarning` во время выполнения:991992    - `from collections.abc import ByteString`993    - `import collections.abc; collections.abc.ByteString`.994995    `DeprecationWarning` уже выдавались, если [`collections.abc.ByteString`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.ByteString) был подклассом или использовался в качестве второго аргумента для [`isinstance()`](https://python-all.ru/3.16/library/functions.html#isinstance) или [`issubclass()`](https://python-all.ru/3.16/library/functions.html#issubclass), но предупреждения ранее не выдавались, если он просто импортировался или получался из модуля `collections.abc`.996- [`hashlib`](https://python-all.ru/3.16/library/hashlib.html#module-hashlib):997998  - В конструкторах хеш-функций, таких как [`new()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.new) или прямых конструкторах с именем хеша, таких как [`md5()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.md5) и [`sha256()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.sha256), необязательный параметр начальных данных мог также передаваться как именованный аргумент с именем `data=` или `string=` в различных реализациях [`hashlib`](https://python-all.ru/3.16/library/hashlib.html#module-hashlib).9991000    Поддержка имени именованного аргумента `string` теперь устарела и запланирована к удалению в Python 3.19. Предпочтительнее передавать начальные данные как позиционный аргумент для максимальной обратной совместимости.10011002    (Автор: Bénédikt Tran в [gh-134978](https://python-all.ru/3.16/whatsnew/3.15.html).)1003- [`http.cookies`](https://python-all.ru/3.16/library/http.cookies.html#module-http.cookies):10041005  - [`Morsel.js_output`](https://python-all.ru/3.16/library/http.cookies.html#http.cookies.Morsel.js_output) и [`BaseCookie.js_output`](https://python-all.ru/3.16/library/http.cookies.html#http.cookies.BaseCookie.js_output) устарели и будут удалены в Python 3.19. Используйте [`Morsel.output`](https://python-all.ru/3.16/library/http.cookies.html#http.cookies.Morsel.output) или [`BaseCookie.output`](https://python-all.ru/3.16/library/http.cookies.html#http.cookies.BaseCookie.output) вместо. (Автор: kishorhange111 в [gh-148849](https://python-all.ru/3.16/whatsnew/3.15.html).)1006- [`imaplib`](https://python-all.ru/3.16/library/imaplib.html#module-imaplib):10071008  - Изменение [`IMAP4.file`](https://python-all.ru/3.16/library/imaplib.html#imaplib.IMAP4.file) теперь устарело и запланировано к удалению в Python 3.19. Это свойство теперь не используется, и изменение его значения *не* закрывает текущий файл явно.1009- [`re`](https://python-all.ru/3.16/library/re.html#module-re):10101011  - [`re.match()`](https://python-all.ru/3.16/library/re.html#re.match) и [`re.Pattern.match()`](https://python-all.ru/3.16/library/re.html#re.Pattern.match) теперь [мягко устарели](https://python-all.ru/3.16/glossary.html#term-soft-deprecated) в пользу новых API [`re.prefixmatch()`](https://python-all.ru/3.16/library/re.html#re.prefixmatch) и [`re.Pattern.prefixmatch()`](https://python-all.ru/3.16/library/re.html#re.Pattern.prefixmatch), которые были добавлены как альтернативные, более явные имена. Они предназначены для устранения путаницы относительно того, что означает *match*, следуя мантре Дзена Python *«Явное лучше неявного»*. Большинство других библиотек регулярных выражений используют API с именем *match* для обозначения того, что в Python всегда называлось *search*.10121013    Мы **не** планируем удалять старое имя `match()`, так как оно используется в коде более 30 лет. Код, поддерживающий старые версии Python, должен продолжать использовать `match()`, а в новом коде следует предпочитать `prefixmatch()`. См. [prefixmatch() vs. match()](https://python-all.ru/3.16/library/re.html#prefixmatch-vs-match).10141015    (Авторы: Gregory P. Smith, [gh-86519](https://python-all.ru/3.16/whatsnew/3.15.html), и Hugo van Kemenade, [gh-148100](https://python-all.ru/3.16/whatsnew/3.15.html).)1016- [`struct`](https://python-all.ru/3.16/library/struct.html#module-struct):10171018  - Вызов `Struct.__new__()` без обязательного аргумента теперь устарел и будет удален в Python 3.20. Вызов метода [`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__) на инициализированном объекте [`Struct`](https://python-all.ru/3.16/library/struct.html#struct.Struct) устарел и будет удален в Python 3.20.10191020    (Вклад: Sergey B Kirpichev и Serhiy Storchaka в [gh-143715](https://python-all.ru/3.16/whatsnew/3.15.html).)1021  - Использование кодов типов `'F'` и `'D'` теперь [мягко устарели](https://python-all.ru/3.16/glossary.html#term-soft-deprecated) в пользу двухбуквенных форм `'Zf'` и `'Zd'`. (Автор: Sergey B Kirpichev в [gh-121249](https://python-all.ru/3.16/whatsnew/3.15.html).)1022- [`typing`](https://python-all.ru/3.16/library/typing.html#module-typing):10231024  - Следующие инструкции теперь вызывают выдачу `DeprecationWarning` во время выполнения:10251026    - `from typing import ByteString`1027    - `import typing; typing.ByteString`.10281029    `DeprecationWarning` уже выдавались, если [`typing.ByteString`](https://python-all.ru/3.16/library/typing.html#typing.ByteString) был подклассом или использовался в качестве второго аргумента для [`isinstance()`](https://python-all.ru/3.16/library/functions.html#isinstance) или [`issubclass()`](https://python-all.ru/3.16/library/functions.html#issubclass), но предупреждения ранее не выдавались, если он просто импортировался или получался из модуля `typing`.1030- [`webbrowser`](https://python-all.ru/3.16/library/webbrowser.html#module-webbrowser):10311032  - `webbrowser.MacOSXOSAScript` устарел в пользу `webbrowser.MacOS` и запланирован к удалению в Python 3.17. (Автор: Jeff Lyon в [gh-137586](https://python-all.ru/3.16/whatsnew/3.15.html).)1033- `__version__`10341035  - Атрибуты `__version__`, `version` и `VERSION` были объявлены устаревшими в этих модулях стандартной библиотеки и будут удалены в Python 3.20. Вместо них используйте [`sys.version_info`](https://python-all.ru/3.16/library/sys.html#sys.version_info).10361037    - [`argparse`](https://python-all.ru/3.16/library/argparse.html#module-argparse)1038    - [`csv`](https://python-all.ru/3.16/library/csv.html#module-csv)1039    - [`ctypes`](https://python-all.ru/3.16/library/ctypes.html#module-ctypes)1040    - `ctypes.macholib`1041    - [`decimal`](https://python-all.ru/3.16/library/decimal.html#module-decimal) (используйте [`decimal.SPEC_VERSION`](https://python-all.ru/3.16/library/decimal.html#decimal.SPEC_VERSION) вместо)1042    - [`http.server`](https://python-all.ru/3.16/library/http.server.html#module-http.server)1043    - [`imaplib`](https://python-all.ru/3.16/library/imaplib.html#module-imaplib)1044    - [`ipaddress`](https://python-all.ru/3.16/library/ipaddress.html#module-ipaddress)1045    - [`json`](https://python-all.ru/3.16/library/json.html#module-json)1046    - [`logging`](https://python-all.ru/3.16/library/logging.html#module-logging) (`__date__` также устарел)1047    - [`optparse`](https://python-all.ru/3.16/library/optparse.html#module-optparse)1048    - [`pickle`](https://python-all.ru/3.16/library/pickle.html#module-pickle)1049    - [`platform`](https://python-all.ru/3.16/library/platform.html#module-platform)1050    - [`re`](https://python-all.ru/3.16/library/re.html#module-re)1051    - [`socketserver`](https://python-all.ru/3.16/library/socketserver.html#module-socketserver)1052    - [`tabnanny`](https://python-all.ru/3.16/library/tabnanny.html#module-tabnanny)1053    - [`tarfile`](https://python-all.ru/3.16/library/tarfile.html#module-tarfile)1054    - [`tkinter.font`](https://python-all.ru/3.16/library/tkinter.font.html#module-tkinter.font)1055    - [`tkinter.ttk`](https://python-all.ru/3.16/library/tkinter.ttk.html#module-tkinter.ttk)1056    - [`wsgiref.simple_server`](https://python-all.ru/3.16/library/wsgiref.html#module-wsgiref.simple_server)1057    - [`xml.etree.ElementTree`](https://python-all.ru/3.16/library/xml.etree.elementtree.html#module-xml.etree.ElementTree)1058    - `xml.sax.expatreader`1059    - [`xml.sax.handler`](https://python-all.ru/3.16/library/xml.sax.handler.html#module-xml.sax.handler)1060    - [`zlib`](https://python-all.ru/3.16/library/zlib.html#module-zlib)10611062    (Вклад: Hugo van Kemenade и Stan Ulbrych в [gh-76007](https://python-all.ru/3.16/whatsnew/3.15.html).)10631064### Запланировано к удалению в Python 3.1610651066- Система импорта:10671068  - Установка [`__loader__`](https://python-all.ru/3.16/reference/datamodel.html#module.__loader__) в модуле при отсутствии [`__spec__.loader`](https://python-all.ru/3.16/library/importlib.html#importlib.machinery.ModuleSpec.loader) устарела. В Python 3.16 `__loader__` перестанет устанавливаться или учитываться системой импорта или стандартной библиотекой.1069  - Установка [`__package__`](https://python-all.ru/3.16/reference/datamodel.html#module.__package__) в модуле при отсутствии [`__spec__.parent`](https://python-all.ru/3.16/library/importlib.html#importlib.machinery.ModuleSpec.parent) устарела. В Python 3.16 `__package__` перестанет устанавливаться или учитываться системой импорта или стандартной библиотекой. ([gh-97879](https://python-all.ru/3.16/whatsnew/3.15.html))1070- Встроенная копия `libmpdec`.1071- [`array`](https://python-all.ru/3.16/library/array.html#module-array):10721073  - Код формата `'u'` (`wchar_t`) устарел в документации начиная с Python 3.3 и во время выполнения начиная с Python 3.13. Используйте код формата `'w'` ([`Py_UCS4`](https://python-all.ru/3.16/c-api/unicode.html#c.Py_UCS4)) для символов Unicode.1074- [`asyncio`](https://python-all.ru/3.16/library/asyncio.html#module-asyncio):10751076  - `asyncio.iscoroutinefunction()` устарело и будет удалено в Python 3.16; используйте [`inspect.iscoroutinefunction()`](https://python-all.ru/3.16/library/inspect.html#inspect.iscoroutinefunction) вместо этого. (Предложено Jiahao Li и Kumar Aditya в [gh-122875](https://python-all.ru/3.16/whatsnew/3.15.html).)1077  - Система политик [`asyncio`](https://python-all.ru/3.16/library/asyncio.html#module-asyncio) устарела и будет удалена в Python 3.16. В частности, следующие классы и функции устарели:10781079    - `asyncio.AbstractEventLoopPolicy`1080    - `asyncio.DefaultEventLoopPolicy`1081    - `asyncio.WindowsSelectorEventLoopPolicy`1082    - `asyncio.WindowsProactorEventLoopPolicy`1083    - `asyncio.get_event_loop_policy()`1084    - `asyncio.set_event_loop_policy()`10851086    Для использования нужной реализации цикла событий следует применять [`asyncio.run()`](https://python-all.ru/3.16/library/asyncio-runner.html#asyncio.run) или [`asyncio.Runner`](https://python-all.ru/3.16/library/asyncio-runner.html#asyncio.Runner) с параметром *loop\_factory*.10871088    Например, чтобы использовать [`asyncio.SelectorEventLoop`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.SelectorEventLoop) в Windows:10891090    ```python1091    import asyncio10921093    async def main():1094        ...10951096    asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)1097    ```10981099    (Предложено Kumar Aditya в [gh-127949](https://python-all.ru/3.16/whatsnew/3.15.html).)1100- [`builtins`](https://python-all.ru/3.16/library/builtins.html#module-builtins):11011102  - Поразрядная инверсия для булевых типов, `~True` или `~False` устарела начиная с Python 3.12, поскольку даёт неожиданные и неинтуитивные результаты (`-2` и `-1`). Используйте `not x` для логического отрицания булевого значения. В редких случаях, когда требуется поразрядная инверсия базового целого числа, явно преобразуйте в `int` (`~int(x)`).1103- [`functools`](https://python-all.ru/3.16/library/functools.html#module-functools):11041105  - Вызов реализации [`functools.reduce()`](https://python-all.ru/3.16/library/functools.html#functools.reduce) на Python с *function* или *sequence* в качестве именованных аргументов устарел начиная с Python 3.14.1106- [`logging`](https://python-all.ru/3.16/library/logging.html#module-logging):11071108  - Поддержка пользовательских обработчиков логирования с аргументом *strm* устарела и запланирована к удалению в Python 3.16. Вместо этого определяйте обработчики с аргументом *stream*. (Предложено Mariusz Felisiak в [gh-115032](https://python-all.ru/3.16/whatsnew/3.15.html).)1109- [`mimetypes`](https://python-all.ru/3.16/library/mimetypes.html#module-mimetypes):11101111  - Допустимые расширения начинаются с точки ‘.’ или пусты для [`mimetypes.MimeTypes.add_type()`](https://python-all.ru/3.16/library/mimetypes.html#mimetypes.MimeTypes.add_type). Расширения без точки устарели и будут вызывать [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) в Python 3.16. (Предложено Hugo van Kemenade в [gh-75223](https://python-all.ru/3.16/whatsnew/3.15.html).)1112- [`shutil`](https://python-all.ru/3.16/library/shutil.html#module-shutil):11131114  - Исключение `ExecError` устарело начиная с Python 3.14. Оно не используется ни одной функцией в `shutil` начиная с Python 3.4 и теперь является псевдонимом [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).1115- [`symtable`](https://python-all.ru/3.16/library/symtable.html#module-symtable):11161117  - Метод `symtable.Class.get_methods()` устарел начиная с Python 3.14.1118- [`sys`](https://python-all.ru/3.16/library/sys.html#module-sys):11191120  - Функция `_enablelegacywindowsfsencoding()` устарела начиная с Python 3.13. Используйте переменную окружения [`PYTHONLEGACYWINDOWSFSENCODING`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONLEGACYWINDOWSFSENCODING).1121- [`sysconfig`](https://python-all.ru/3.16/library/sysconfig.html#module-sysconfig):11221123  - Функция `sysconfig.expand_makefile_vars()` устарела начиная с Python 3.14. Используйте аргумент `vars` из [`sysconfig.get_paths()`](https://python-all.ru/3.16/library/sysconfig.html#sysconfig.get_paths).1124- [`tarfile`](https://python-all.ru/3.16/library/tarfile.html#module-tarfile):11251126  - Недокументированный и неиспользуемый атрибут `TarInfo.tarfile` устарел начиная с Python 3.13.11271128### Запланировано к удалению в Python 3.1711291130- [`datetime`](https://python-all.ru/3.16/library/datetime.html#module-datetime):11311132  - [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) вызовы со строкой формата, содержащей `%e` (день месяца) без указания года. Это объявлено устаревшим начиная с Python 3.15. (Автор: Stan Ulbrych в [gh-70647](https://python-all.ru/3.16/whatsnew/3.15.html).)1133- [`collections.abc`](https://python-all.ru/3.16/library/collections.abc.html#module-collections.abc):11341135  - [`collections.abc.ByteString`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.ByteString) запланирован к удалению в Python 3.17.11361137    Используйте `isinstance(obj, collections.abc.Buffer)` для проверки, реализует ли `obj` [протокол буфера](https://python-all.ru/3.16/c-api/buffer.html#bufferobjects) во время выполнения. Для использования в аннотациях типов используйте [`Buffer`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.Buffer) или объединение, которое явно указывает типы, поддерживаемые вашим кодом (например, `bytes | bytearray | memoryview`).11381139    `ByteString` изначально задумывался как абстрактный класс, который должен был служить супертипом как для [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes), так и для [`bytearray`](https://python-all.ru/3.16/library/stdtypes.html#bytearray). Однако, поскольку у ABC никогда не было методов, знание того, что объект является экземпляром `ByteString`, никогда не давало полезной информации об объекте. Другие распространённые типы буферов, такие как [`memoryview`](https://python-all.ru/3.16/library/stdtypes.html#memoryview), также никогда не рассматривались как подтипы `ByteString` (ни во время выполнения, ни статическими проверками типов).11401141    См. [**PEP 688**](https://python-all.ru/3.16/whatsnew/3.15.html) для получения подробностей. (Автор: Shantanu Jain в [gh-91896](https://python-all.ru/3.16/whatsnew/3.15.html).)1142- [`encodings`](https://python-all.ru/3.16/library/codecs.html#module-encodings):11431144  - Передача *кодировок*, не являющихся ASCII, в [`encodings.normalize_encoding()`](https://python-all.ru/3.16/library/codecs.html#encodings.normalize_encoding) объявлена устаревшей и запланирована к удалению в Python 3.17. (Автор: Stan Ulbrych в [gh-136702](https://python-all.ru/3.16/whatsnew/3.15.html).)1145- [`webbrowser`](https://python-all.ru/3.16/library/webbrowser.html#module-webbrowser):11461147  - `webbrowser.MacOSXOSAScript` объявлен устаревшим в пользу `webbrowser.MacOS`. ([gh-137586](https://python-all.ru/3.16/whatsnew/3.15.html))1148- [`typing`](https://python-all.ru/3.16/library/typing.html#module-typing):11491150  - До Python 3.14 старые объединения реализовывались с помощью приватного класса `typing._UnionGenericAlias`. Этот класс больше не нужен для реализации, но он сохранён для обратной совместимости, его удаление запланировано на Python 3.17. Пользователям следует использовать документированные вспомогательные средства интроспекции, такие как [`typing.get_origin()`](https://python-all.ru/3.16/library/typing.html#typing.get_origin) и [`typing.get_args()`](https://python-all.ru/3.16/library/typing.html#typing.get_args), вместо того чтобы полагаться на детали приватной реализации.1151  - [`typing.ByteString`](https://python-all.ru/3.16/library/typing.html#typing.ByteString), устаревший с Python 3.9, запланирован к удалению в Python 3.17.11521153    Используйте `isinstance(obj, collections.abc.Buffer)` для проверки, реализует ли `obj` [протокол буфера](https://python-all.ru/3.16/c-api/buffer.html#bufferobjects) во время выполнения. Для использования в аннотациях типов используйте [`Buffer`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.Buffer) или объединение, которое явно указывает типы, поддерживаемые вашим кодом (например, `bytes | bytearray | memoryview`).11541155    `ByteString` изначально задумывался как абстрактный класс, который должен был служить супертипом как для [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes), так и для [`bytearray`](https://python-all.ru/3.16/library/stdtypes.html#bytearray). Однако, поскольку у ABC никогда не было методов, знание того, что объект является экземпляром `ByteString`, никогда не давало полезной информации об объекте. Другие распространённые типы буферов, такие как [`memoryview`](https://python-all.ru/3.16/library/stdtypes.html#memoryview), также никогда не рассматривались как подтипы `ByteString` (ни во время выполнения, ни статическими проверками типов).11561157    См. [**PEP 688**](https://python-all.ru/3.16/whatsnew/3.15.html) для получения подробностей. (Автор: Shantanu Jain в [gh-91896](https://python-all.ru/3.16/whatsnew/3.15.html).)1158- [`tkinter`](https://python-all.ru/3.16/library/tkinter.html#module-tkinter):11591160  - Методы `tkinter.Variable`: `trace_variable()`, `trace()` (псевдоним `trace_variable()`), `trace_vdelete()` и `trace_vinfo()`, устаревшие с Python 3.14, запланированы к удалению в Python 3.17. Используйте `trace_add()`, `trace_remove()` и `trace_info()` вместо них. (Автор: Serhiy Storchaka в [gh-120220](https://python-all.ru/3.16/whatsnew/3.15.html).)11611162### Запланировано удаление в Python 3.1811631164- Больше не принимает логическое значение, если ожидается файловый дескриптор. (Автор: Serhiy Storchaka в [gh-82626](https://python-all.ru/3.16/whatsnew/3.15.html).)1165- [`decimal`](https://python-all.ru/3.16/library/decimal.html#module-decimal):11661167  - Нестандартный и недокументированный [`Decimal`](https://python-all.ru/3.16/library/decimal.html#decimal.Decimal) спецификатор формата `'N'`, который поддерживается только в реализации C модуля `decimal`, устарел с Python 3.13. (Автор: Serhiy Storchaka в [gh-89902](https://python-all.ru/3.16/whatsnew/3.15.html).)1168- Устаревшие элементы, определённые [**PEP 829**](https://python-all.ru/3.16/whatsnew/3.15.html):11691170  - Строки `import` в файлах `name.pth` молча игнорируются.11711172  (Вклад: Barry Warsaw в [gh-148641](https://python-all.ru/3.16/whatsnew/3.15.html).)11731174### Запланировано к удалению в Python 3.1911751176- [`ctypes`](https://python-all.ru/3.16/library/ctypes.html#module-ctypes):11771178  - Неявное переключение на совместимую с MSVC структуру путём установки [`_pack_`](https://python-all.ru/3.16/library/ctypes.html#ctypes.Structure._pack_) без [`_layout_`](https://python-all.ru/3.16/library/ctypes.html#ctypes.Structure._layout_) на платформах, отличных от Windows.1179- [`hashlib`](https://python-all.ru/3.16/library/hashlib.html#module-hashlib):11801181  - В конструкторах хеш-функций, таких как [`new()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.new), или прямых конструкторах, названных по имени хеша, таких как [`md5()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.md5) и [`sha256()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.sha256), их необязательный параметр начальных данных мог также передаваться как именованный аргумент с именем `data=` или `string=` в различных реализациях `hashlib`.11821183    Поддержка имени именованного аргумента `string` теперь устарела и будет удалена в Python 3.19.11841185    До Python 3.13 именованный параметр `string` не поддерживался правильно в зависимости от реализации хеш-функций на стороне бэкенда. Предпочтительно передавать начальные данные как позиционный аргумент для максимальной обратной совместимости.1186- [`http.cookies`](https://python-all.ru/3.16/library/http.cookies.html#module-http.cookies):11871188  - [`http.cookies.Morsel.js_output()`](https://python-all.ru/3.16/library/http.cookies.html#http.cookies.Morsel.js_output) устарело и будет удалено в Python 3.19.1189  - [`http.cookies.BaseCookie.js_output()`](https://python-all.ru/3.16/library/http.cookies.html#http.cookies.BaseCookie.js_output) устарело и будет удалено в Python 3.19.1190- [`imaplib`](https://python-all.ru/3.16/library/imaplib.html#module-imaplib):11911192  - Изменение [`IMAP4.file`](https://python-all.ru/3.16/library/imaplib.html#imaplib.IMAP4.file) теперь устарело и будет удалено в Python 3.19. Это свойство теперь не используется, и изменение его значения не приводит к автоматическому закрытию текущего файла.11931194    До Python 3.14 это свойство использовалось для реализации соответствующих методов `read()` и `readline()` для [`IMAP4`](https://python-all.ru/3.16/library/imaplib.html#imaplib.IMAP4), но с тех пор это уже не так.11951196### Ожидается удаление в Python 3.2011971198- Вызов метода `__new__()` объекта [`struct.Struct`](https://python-all.ru/3.16/library/struct.html#struct.Struct) без аргумента *format* устарел и будет удалён в Python 3.20. Вызов [`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__) метода для инициализированных объектов `Struct` устарел и будет удалён в Python 3.20.11991200  (Вклад: Sergey B Kirpichev и Serhiy Storchaka в [gh-143715](https://python-all.ru/3.16/whatsnew/3.15.html).)1201- Атрибуты `__version__`, `version` и `VERSION` были объявлены устаревшими в этих модулях стандартной библиотеки и будут удалены в Python 3.20. Вместо них используйте [`sys.version_info`](https://python-all.ru/3.16/library/sys.html#sys.version_info).12021203  - [`argparse`](https://python-all.ru/3.16/library/argparse.html#module-argparse)1204  - [`csv`](https://python-all.ru/3.16/library/csv.html#module-csv)1205  - [`ctypes`](https://python-all.ru/3.16/library/ctypes.html#module-ctypes)1206  - `ctypes.macholib`1207  - [`decimal`](https://python-all.ru/3.16/library/decimal.html#module-decimal) (используйте [`decimal.SPEC_VERSION`](https://python-all.ru/3.16/library/decimal.html#decimal.SPEC_VERSION) вместо)1208  - [`http.server`](https://python-all.ru/3.16/library/http.server.html#module-http.server)1209  - [`imaplib`](https://python-all.ru/3.16/library/imaplib.html#module-imaplib)1210  - [`ipaddress`](https://python-all.ru/3.16/library/ipaddress.html#module-ipaddress)1211  - [`json`](https://python-all.ru/3.16/library/json.html#module-json)1212  - [`logging`](https://python-all.ru/3.16/library/logging.html#module-logging) (`__date__` также устарел)1213  - [`optparse`](https://python-all.ru/3.16/library/optparse.html#module-optparse)1214  - [`pickle`](https://python-all.ru/3.16/library/pickle.html#module-pickle)1215  - [`platform`](https://python-all.ru/3.16/library/platform.html#module-platform)1216  - [`re`](https://python-all.ru/3.16/library/re.html#module-re)1217  - [`socketserver`](https://python-all.ru/3.16/library/socketserver.html#module-socketserver)1218  - [`tabnanny`](https://python-all.ru/3.16/library/tabnanny.html#module-tabnanny)1219  - [`tarfile`](https://python-all.ru/3.16/library/tarfile.html#module-tarfile)1220  - [`tkinter.font`](https://python-all.ru/3.16/library/tkinter.font.html#module-tkinter.font)1221  - [`tkinter.ttk`](https://python-all.ru/3.16/library/tkinter.ttk.html#module-tkinter.ttk)1222  - [`wsgiref.simple_server`](https://python-all.ru/3.16/library/wsgiref.html#module-wsgiref.simple_server)1223  - [`xml.etree.ElementTree`](https://python-all.ru/3.16/library/xml.etree.elementtree.html#module-xml.etree.ElementTree)1224  - `xml.sax.expatreader`1225  - [`xml.sax.handler`](https://python-all.ru/3.16/library/xml.sax.handler.html#module-xml.sax.handler)1226  - [`zlib`](https://python-all.ru/3.16/library/zlib.html#module-zlib)12271228  (Вклад: Hugo van Kemenade и Stan Ulbrych в [gh-76007](https://python-all.ru/3.16/whatsnew/3.15.html).)1229- Устаревшие элементы, определённые [**PEP 829**](https://python-all.ru/3.16/whatsnew/3.15.html):12301231  - Предупреждения выводятся для строк `import`, найденных в `name.pth` файлах.1232  - Файлы `name.pth` больше не декодируются в кодировке локали по умолчанию. Они **ДОЛЖНЫ** быть закодированы в `utf-8-sig`.12331234  (Вклад: Barry Warsaw в [gh-148641](https://python-all.ru/3.16/whatsnew/3.15.html).)1235- [`ast`](https://python-all.ru/3.16/library/ast.html#module-ast):12361237  - Создание экземпляров абстрактных узлов AST (таких как [`ast.AST`](https://python-all.ru/3.16/library/ast.html#ast.AST) или `ast.expr`) устарело и будет вызывать ошибку в Python 3.20.12381239### Ожидается удаление в Python 3.2112401241- [`abc`](https://python-all.ru/3.16/library/abc.html#module-abc)12421243  > - Мягко устаревшие с Python 3.3 [`abc.abstractclassmethod`](https://python-all.ru/3.16/library/abc.html#abc.abstractclassmethod), [`abc.abstractstaticmethod`](https://python-all.ru/3.16/library/abc.html#abc.abstractstaticmethod) и [`abc.abstractproperty`](https://python-all.ru/3.16/library/abc.html#abc.abstractproperty) теперь вызывают [`DeprecationWarning`](https://python-all.ru/3.16/library/exceptions.html#DeprecationWarning). Эти классы будут удалены в Python 3.21, вместо них используйте [`abc.abstractmethod()`](https://python-all.ru/3.16/library/abc.html#abc.abstractmethod) с [`classmethod()`](https://python-all.ru/3.16/library/functions.html#classmethod), [`staticmethod()`](https://python-all.ru/3.16/library/functions.html#staticmethod) и [`property`](https://python-all.ru/3.16/library/functions.html#property) соответственно.1244- [`ast`](https://python-all.ru/3.16/library/ast.html#module-ast):12451246  - Классы `slice`, `Index`, `ExtSlice`, `Suite`, `Param`, `AugLoad` и `AugStore` будут удалены в Python 3.21. Эти типы не создаются синтаксическим анализатором и не принимаются генератором кода.1247  - Свойство `dims` объекта `ast.Tuple` будет удалено в Python 3.21. Используйте свойство `ast.Tuple.elts` вместо него.1248- [`struct`](https://python-all.ru/3.16/library/struct.html#module-struct):12491250  - Мягко устаревшие с Python 3.15, коды типов `'F'` и `'D'` теперь устарели. Эти коды будут удалены в Python 3.21. Используйте вместо них двухбуквенные формы `'Zf'` и `'Zd'`.1251- [`tempfile`](https://python-all.ru/3.16/library/tempfile.html#module-tempfile):12521253  - `tempfile._TemporaryFileWrapper` будет удалён в Python 3.21. Используйте публичный [`tempfile.TemporaryFileWrapper`](https://python-all.ru/3.16/library/tempfile.html#tempfile.TemporaryFileWrapper) вместо него.12541255### Будет удалено в будущих версиях12561257Следующие API будут удалены в будущем, хотя на данный момент нет запланированной даты их удаления.12581259- [`argparse`](https://python-all.ru/3.16/library/argparse.html#module-argparse):12601261  - Вложение групп аргументов и вложение взаимоисключающих групп устарело.1262  - Передача недокументированного именованного аргумента *prefix\_chars* в [`add_argument_group()`](https://python-all.ru/3.16/library/argparse.html#argparse.ArgumentParser.add_argument_group) теперь устарела.1263  - Конвертер типов [`argparse.FileType`](https://python-all.ru/3.16/library/argparse.html#argparse.FileType) устарел.1264- [`builtins`](https://python-all.ru/3.16/library/builtins.html#module-builtins):12651266  - Генераторы: сигнатура `throw(type, exc, tb)` и `athrow(type, exc, tb)` устарела: используйте `throw(exc)` и `athrow(exc)` вместо неё, сигнатуру с одним аргументом.1267  - В настоящее время Python принимает числовые литералы, за которыми сразу следуют ключевые слова, например `0in x`, `1or x`, `0if 1else 2`. Это допускает запутанные и неоднозначные выражения вроде `[0x1for x in y]` (которое может быть интерпретировано как `[0x1 for x in y]` или `[0x1f or x in y]`). Выдаётся предупреждение синтаксиса, если за числовым литералом сразу следует одно из ключевых слов [`and`](https://python-all.ru/3.16/reference/expressions.html#and), [`else`](https://python-all.ru/3.16/reference/compound_stmts.html#else), [`for`](https://python-all.ru/3.16/reference/compound_stmts.html#for), [`if`](https://python-all.ru/3.16/reference/compound_stmts.html#if), [`in`](https://python-all.ru/3.16/reference/expressions.html#in), [`is`](https://python-all.ru/3.16/reference/expressions.html#is) и [`or`](https://python-all.ru/3.16/reference/expressions.html#or). В будущем выпуске это будет изменено на синтаксическую ошибку. ([gh-87999](https://python-all.ru/3.16/whatsnew/3.15.html))1268  - Поддержка методов `__index__()` и `__int__()`, возвращающих не-int тип: эти методы должны будут возвращать экземпляр строгого подкласса [`int`](https://python-all.ru/3.16/library/functions.html#int).1269  - Поддержка метода `__float__()`, возвращающего строгий подкласс [`float`](https://python-all.ru/3.16/library/functions.html#float): эти методы должны будут возвращать экземпляр `float`.1270  - Поддержка метода `__complex__()`, возвращающего строгий подкласс [`complex`](https://python-all.ru/3.16/library/functions.html#complex): эти методы должны будут возвращать экземпляр `complex`.1271  - Передача комплексного числа в качестве аргумента *real* или *imag* в конструкторе [`complex()`](https://python-all.ru/3.16/library/functions.html#complex) теперь устарела; его следует передавать только как единственный позиционный аргумент. (Автор: Сергей Сторчака в [gh-109218](https://python-all.ru/3.16/whatsnew/3.15.html).)1272- [`calendar`](https://python-all.ru/3.16/library/calendar.html#module-calendar): константы `calendar.January` и `calendar.February` устарели и заменены на [`calendar.JANUARY`](https://python-all.ru/3.16/library/calendar.html#calendar.JANUARY) и [`calendar.FEBRUARY`](https://python-all.ru/3.16/library/calendar.html#calendar.FEBRUARY). (Автор: Prince Roshan в [gh-103636](https://python-all.ru/3.16/whatsnew/3.15.html).)1273- [`codecs`](https://python-all.ru/3.16/library/codecs.html#module-codecs): используйте [`open()`](https://python-all.ru/3.16/library/functions.html#open) вместо [`codecs.open()`](https://python-all.ru/3.16/library/codecs.html#codecs.open). ([gh-133038](https://python-all.ru/3.16/whatsnew/3.15.html))1274- `codeobject.co_lnotab`: используйте метод [`codeobject.co_lines()`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_lines) вместо этого.1275- [`datetime`](https://python-all.ru/3.16/library/datetime.html#module-datetime):12761277  - [`utcnow()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.utcnow): используйте `datetime.datetime.now(tz=datetime.UTC)`.1278  - [`utcfromtimestamp()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.utcfromtimestamp): используйте `datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)`.1279- [`gettext`](https://python-all.ru/3.16/library/gettext.html#module-gettext): значение множественного числа должно быть целым числом.1280- [`importlib`](https://python-all.ru/3.16/library/importlib.html#module-importlib):12811282  - [`cache_from_source()`](https://python-all.ru/3.16/library/importlib.html#importlib.util.cache_from_source): параметр *debug\_override* устарел: используйте параметр *optimization* вместо него.1283- [`importlib.metadata`](https://python-all.ru/3.16/library/importlib.metadata.html#module-importlib.metadata):12841285  - `EntryPoints`: интерфейс кортежа.1286  - Неявное `None` для возвращаемых значений.1287- [`logging`](https://python-all.ru/3.16/library/logging.html#module-logging): метод `warn()` устарел начиная с Python 3.3, используйте [`warning()`](https://python-all.ru/3.16/library/logging.html#logging.warning) вместо него.1288- [`mailbox`](https://python-all.ru/3.16/library/mailbox.html#module-mailbox): использование StringIO в режиме ввода и текстовом режиме устарело, используйте BytesIO и двоичный режим.1289- [`os`](https://python-all.ru/3.16/library/os.html#module-os): вызов [`os.register_at_fork()`](https://python-all.ru/3.16/library/os.html#os.register_at_fork) в многопоточном процессе.1290- [`os.path`](https://python-all.ru/3.16/library/os.path.html#module-os.path): [`os.path.commonprefix()`](https://python-all.ru/3.16/library/os.path.html#os.path.commonprefix) устарела, используйте [`os.path.commonpath()`](https://python-all.ru/3.16/library/os.path.html#os.path.commonpath) для префиксов путей. Функция `os.path.commonprefix()` объявлена устаревшей из-за вводящего в заблуждение названия и модуля. Эта функция небезопасна для использования в качестве префиксов путей, несмотря на то что находится в модуле для работы с путями, что означает, что легко случайно внести уязвимости обхода путей в программы на Python, используя эту функцию.1291- `pydoc.ErrorDuringImport`: кортежное значение для параметра *exc\_info* устарело, используйте экземпляр исключения.1292- [`re`](https://python-all.ru/3.16/library/re.html#module-re): теперь применяются более строгие правила для числовых ссылок на группы и имён групп в регулярных выражениях. В качестве числовой ссылки теперь принимается только последовательность цифр ASCII. Имя группы в байтовых шаблонах и строках замены теперь может содержать только буквы ASCII, цифры и знак подчёркивания. (Автор: Сергей Сторчака в [gh-91760](https://python-all.ru/3.16/whatsnew/3.15.html).)1293- [`shutil`](https://python-all.ru/3.16/library/shutil.html#module-shutil): параметр *onerror* метода [`rmtree()`](https://python-all.ru/3.16/library/shutil.html#shutil.rmtree) устарел в Python 3.12; используйте параметр *onexc* вместо него.1294- [`ssl`](https://python-all.ru/3.16/library/ssl.html#module-ssl): опции и протоколы:12951296  - [`ssl.SSLContext`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext) без аргумента протокол устарело.1297  - [`ssl.SSLContext`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext): [`set_npn_protocols()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.set_npn_protocols) и `selected_npn_protocol()` устарели: используйте ALPN вместо них.1298  - `ssl.OP_NO_SSL*`: опции1299  - `ssl.OP_NO_TLS*`: опции1300  - `ssl.PROTOCOL_SSLv3`1301  - `ssl.PROTOCOL_TLS`1302  - `ssl.PROTOCOL_TLSv1`1303  - `ssl.PROTOCOL_TLSv1_1`1304  - `ssl.PROTOCOL_TLSv1_2`1305  - `ssl.TLSVersion.SSLv3`1306  - `ssl.TLSVersion.TLSv1`1307  - `ssl.TLSVersion.TLSv1_1`1308- [`threading`](https://python-all.ru/3.16/library/threading.html#module-threading): методы13091310  - `threading.Condition.notifyAll()`: используйте [`notify_all()`](https://python-all.ru/3.16/library/threading.html#threading.Condition.notify_all).1311  - `threading.Event.isSet()`: используйте [`is_set()`](https://python-all.ru/3.16/library/threading.html#threading.Event.is_set).1312  - `threading.Thread.isDaemon()`, [`threading.Thread.setDaemon()`](https://python-all.ru/3.16/library/threading.html#threading.Thread.setDaemon): используйте атрибут [`threading.Thread.daemon`](https://python-all.ru/3.16/library/threading.html#threading.Thread.daemon).1313  - `threading.Thread.getName()`, [`threading.Thread.setName()`](https://python-all.ru/3.16/library/threading.html#threading.Thread.setName): используйте атрибут [`threading.Thread.name`](https://python-all.ru/3.16/library/threading.html#threading.Thread.name).1314  - `threading.currentThread()`: используйте [`threading.current_thread()`](https://python-all.ru/3.16/library/threading.html#threading.current_thread).1315  - `threading.activeCount()`: используйте [`threading.active_count()`](https://python-all.ru/3.16/library/threading.html#threading.active_count).1316- [`typing.Text`](https://python-all.ru/3.16/library/typing.html#typing.Text) ([gh-92332](https://python-all.ru/3.16/whatsnew/3.15.html)).1317- Внутренний класс `typing._UnionGenericAlias` больше не используется для реализации [`typing.Union`](https://python-all.ru/3.16/library/typing.html#typing.Union). Для сохранения совместимости с пользователями, использующими этот закрытый класс, будет предоставлена прослойка совместимости как минимум до Python 3.17. (Автор: Jelle Zijlstra, [gh-105499](https://python-all.ru/3.16/whatsnew/3.15.html).)1318- [`unittest.IsolatedAsyncioTestCase`](https://python-all.ru/3.16/library/unittest.html#unittest.IsolatedAsyncioTestCase): возврат значения, не являющегося `None`, из тестового примера устарел.1319- [`urllib.parse`](https://python-all.ru/3.16/library/urllib.parse.html#module-urllib.parse) устаревшие функции: используйте [`urlparse()`](https://python-all.ru/3.16/library/urllib.parse.html#urllib.parse.urlparse) вместо них.13201321  - `splitattr()`1322  - `splithost()`1323  - `splitnport()`1324  - `splitpasswd()`1325  - `splitport()`1326  - `splitquery()`1327  - `splittag()`1328  - `splittype()`1329  - `splituser()`1330  - `splitvalue()`1331  - `to_bytes()`1332- [`wsgiref`](https://python-all.ru/3.16/library/wsgiref.html#module-wsgiref): `SimpleHandler.stdout.write()` не должна выполнять частичную запись.1333- [`xml.etree.ElementTree`](https://python-all.ru/3.16/library/xml.etree.elementtree.html#module-xml.etree.ElementTree): проверка истинностного значения [`Element`](https://python-all.ru/3.16/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) устарела. В будущем выпуске она всегда будет возвращать `True`. Вместо этого используйте явные проверки `len(elem)` или `elem is not None`.1334- [`sys._clear_type_cache()`](https://python-all.ru/3.16/library/sys.html#sys._clear_type_cache) устарело: используйте [`sys._clear_internal_caches()`](https://python-all.ru/3.16/library/sys.html#sys._clear_internal_caches) вместо него.13351336### Мягкие устаревания13371338Планов по удалению [мягко устаревших](https://python-all.ru/3.16/glossary.html#term-soft-deprecated) API нет.13391340- [`re.match()`](https://python-all.ru/3.16/library/re.html#re.match) и [`re.Pattern.match()`](https://python-all.ru/3.16/library/re.html#re.Pattern.match) теперь [мягко устарели](https://python-all.ru/3.16/glossary.html#term-soft-deprecated) в пользу новых API [`re.prefixmatch()`](https://python-all.ru/3.16/library/re.html#re.prefixmatch) и [`re.Pattern.prefixmatch()`](https://python-all.ru/3.16/library/re.html#re.Pattern.prefixmatch), которые были добавлены как альтернативные, более явные имена. Они предназначены для устранения путаницы относительно того, что означает *match*, следуя мантре Дзена Python *«Явное лучше неявного»*. Большинство других библиотек регулярных выражений используют API с именем *match* для обозначения того, что в Python всегда называлось *search*.13411342  Мы **не** планируем удалять старое имя `match()`, так как оно используется в коде более 30 лет. Код, поддерживающий старые версии Python, должен продолжать использовать `match()`, а в новом коде следует предпочитать `prefixmatch()`. См. [prefixmatch() vs. match()](https://python-all.ru/3.16/library/re.html#prefixmatch-vs-match).13431344  (Авторы: Gregory P. Smith, [gh-86519](https://python-all.ru/3.16/whatsnew/3.15.html), и Hugo van Kemenade, [gh-148100](https://python-all.ru/3.16/whatsnew/3.15.html).)13451346## Изменения C API13471348### Новые возможности13491350- Добавлены функции [`PyArg_ParseArray()`](https://python-all.ru/3.16/c-api/arg.html#c.PyArg_ParseArray) и [`PyArg_ParseArrayAndKeywords()`](https://python-all.ru/3.16/c-api/arg.html#c.PyArg_ParseArrayAndKeywords) для разбора аргументов функций, использующих соглашение о вызове [`METH_FASTCALL`](https://python-all.ru/3.16/c-api/structures.html#c.METH_FASTCALL). (Автор: Victor Stinner в [gh-144175](https://python-all.ru/3.16/whatsnew/3.15.html).)1351- Добавлены следующие функции для нового типа [`frozendict`](https://python-all.ru/3.16/library/stdtypes.html#frozendict):13521353  - [`PyAnyDict_Check()`](https://python-all.ru/3.16/c-api/dict.html#c.PyAnyDict_Check)1354  - [`PyAnyDict_CheckExact()`](https://python-all.ru/3.16/c-api/dict.html#c.PyAnyDict_CheckExact)1355  - [`PyFrozenDict_Check()`](https://python-all.ru/3.16/c-api/dict.html#c.PyFrozenDict_Check)1356  - [`PyFrozenDict_CheckExact()`](https://python-all.ru/3.16/c-api/dict.html#c.PyFrozenDict_CheckExact)1357  - [`PyFrozenDict_New()`](https://python-all.ru/3.16/c-api/dict.html#c.PyFrozenDict_New)13581359  (Автор: Victor Stinner в [gh-141510](https://python-all.ru/3.16/whatsnew/3.15.html).)1360- Добавлена функция [`PyObject_CallFinalizerFromDealloc()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizerFromDealloc) в ограниченный C API. (Автор: Victor Stinner в [gh-146063](https://python-all.ru/3.16/whatsnew/3.15.html).)1361- Добавлены функции [`PySys_GetAttr()`](https://python-all.ru/3.16/c-api/sys.html#c.PySys_GetAttr), [`PySys_GetAttrString()`](https://python-all.ru/3.16/c-api/sys.html#c.PySys_GetAttrString), [`PySys_GetOptionalAttr()`](https://python-all.ru/3.16/c-api/sys.html#c.PySys_GetOptionalAttr) и [`PySys_GetOptionalAttrString()`](https://python-all.ru/3.16/c-api/sys.html#c.PySys_GetOptionalAttrString) в качестве замены для [`PySys_GetObject()`](https://python-all.ru/3.16/c-api/sys.html#c.PySys_GetObject). (Автор: Serhiy Storchaka в [gh-108512](https://python-all.ru/3.16/whatsnew/3.15.html).)1362- Добавлена [`PyUnstable_Unicode_GET_CACHED_HASH`](https://python-all.ru/3.16/c-api/unicode.html#c.PyUnstable_Unicode_GET_CACHED_HASH) для получения кешированного хеша строки. См. документацию по ограничениям. (Автор: Petr Viktorin в [gh-131510](https://python-all.ru/3.16/whatsnew/3.15.html).)1363- Добавлен API для проверки совместимости ABI модулей расширения: [`Py_mod_abi`](https://python-all.ru/3.16/c-api/module.html#c.Py_mod_abi), [`PyABIInfo_Check()`](https://python-all.ru/3.16/c-api/stable.html#c.PyABIInfo_Check) и [`PyABIInfo_VAR`](https://python-all.ru/3.16/c-api/stable.html#c.PyABIInfo_VAR). (Автор: Petr Viktorin в [gh-137210](https://python-all.ru/3.16/whatsnew/3.15.html).)13641365- Реализован [**PEP 782**](https://python-all.ru/3.16/whatsnew/3.15.html), [API PyBytesWriter](https://python-all.ru/3.16/c-api/bytes.html#pybyteswriter). Добавлены функции:13661367  - [`PyBytesWriter_Create()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_Create)1368  - [`PyBytesWriter_Discard()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_Discard)1369  - [`PyBytesWriter_FinishWithPointer()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_FinishWithPointer)1370  - [`PyBytesWriter_FinishWithSize()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_FinishWithSize)1371  - [`PyBytesWriter_Finish()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_Finish)1372  - [`PyBytesWriter_Format()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_Format)1373  - [`PyBytesWriter_GetData()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_GetData)1374  - [`PyBytesWriter_GetSize()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_GetSize)1375  - [`PyBytesWriter_GrowAndUpdatePointer()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_GrowAndUpdatePointer)1376  - [`PyBytesWriter_Grow()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_Grow)1377  - [`PyBytesWriter_Resize()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_Resize)1378  - [`PyBytesWriter_WriteBytes()`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter_WriteBytes)13791380  (Автор: Victor Stinner в [gh-129813](https://python-all.ru/3.16/whatsnew/3.15.html).)1381- [`PyCriticalSection`](https://python-all.ru/3.16/c-api/synchronization.html#c.PyCriticalSection) и связанные функции добавлены в стабильный ABI.13821383  (Вклад в [gh-149227](https://python-all.ru/3.16/whatsnew/3.15.html).)1384- Добавлен новый [`PyImport_CreateModuleFromInitfunc()`](https://python-all.ru/3.16/c-api/import.html#c.PyImport_CreateModuleFromInitfunc) C-API для создания модуля из *спецификации* и *функции инициализации*. (Автор: Itamar Oren в [gh-116146](https://python-all.ru/3.16/whatsnew/3.15.html).)1385- Добавлена [`PyTuple_FromArray()`](https://python-all.ru/3.16/c-api/tuple.html#c.PyTuple_FromArray) для создания [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple) из массива. (Автор: Victor Stinner в [gh-111489](https://python-all.ru/3.16/whatsnew/3.15.html).)1386- Добавлен новый хук экспорта модуля, [`PyModExport_*`](https://python-all.ru/3.16/c-api/extension-modules.html#c.PyModExport_modulename).13871388  (Автор: Petr Viktorin в [**PEP 793**](https://python-all.ru/3.16/whatsnew/3.15.html) и [gh-140550](https://python-all.ru/3.16/whatsnew/3.15.html).)1389- Добавлены функции, гарантированно безопасные для использования в обработчиках [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse): [`PyObject_GetTypeData_DuringGC()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GetTypeData_DuringGC), [`PyObject_GetItemData_DuringGC()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GetItemData_DuringGC), [`PyType_GetModuleState_DuringGC()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyType_GetModuleState_DuringGC), [`PyModule_GetState_DuringGC()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyModule_GetState_DuringGC), [`PyModule_GetToken_DuringGC()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyModule_GetToken_DuringGC), [`PyType_GetBaseByToken_DuringGC()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyType_GetBaseByToken_DuringGC), [`PyType_GetModule_DuringGC()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyType_GetModule_DuringGC), [`PyType_GetModuleByToken_DuringGC()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyType_GetModuleByToken_DuringGC). (Автор: Petr Viktorin в [gh-145925](https://python-all.ru/3.16/whatsnew/3.15.html).)1390- Добавлена [`PyObject_Dump()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Dump) для дампа объекта в `stderr`. Её следует использовать только для отладки. (Автор: Victor Stinner в [gh-141070](https://python-all.ru/3.16/whatsnew/3.15.html).)1391- Реализован [**PEP 820**](https://python-all.ru/3.16/whatsnew/3.15.html): `PySlot` – унифицированная система слотов для C API. См. [Definition slots](https://python-all.ru/3.16/c-api/slots.html#capi-slots) для документации.13921393  Добавлено:13941395  - Структура [`PySlot`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot);1396  - функция [`PyType_FromSlots()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromSlots);1397  - новые идентификаторы слотов: [`Py_slot_end`](https://python-all.ru/3.16/c-api/slots.html#c.Py_slot_end), [`Py_slot_invalid`](https://python-all.ru/3.16/c-api/slots.html#c.Py_slot_invalid); [`Py_slot_subslots`](https://python-all.ru/3.16/c-api/slots.html#c.Py_slot_subslots), [`Py_tp_slots`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_slots), [`Py_mod_slots`](https://python-all.ru/3.16/c-api/module.html#c.Py_mod_slots); [`Py_tp_name`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_name), [`Py_tp_basicsize`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_basicsize), [`Py_tp_extra_basicsize`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_extra_basicsize), [`Py_tp_itemsize`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_itemsize), [`Py_tp_flags`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_flags), [`Py_tp_metaclass`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_metaclass), [`Py_tp_module`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_module);1398  - удобные макросы: [`PySlot_DATA`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_DATA), [`PySlot_FUNC`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_FUNC), [`PySlot_SIZE`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_SIZE), [`PySlot_INT64`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_INT64), [`PySlot_UINT64`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_UINT64), [`PySlot_STATIC_DATA`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_STATIC_DATA), [`PySlot_END`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_END), [`PySlot_PTR`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_PTR), [`PySlot_PTR_STATIC`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot_PTR_STATIC).13991400  Функция [`PyModule_FromSlotsAndSpec()`](https://python-all.ru/3.16/c-api/module.html#c.PyModule_FromSlotsAndSpec) и `PyModExport` [хук экспорта модуля](https://python-all.ru/3.16/c-api/extension-modules.html#extension-export-hook) также используют новую структуру `PySlot`.14011402  Следующие функции помечены как [мягко устаревшие](https://python-all.ru/3.16/glossary.html#term-soft-deprecated):14031404  - [`PyType_FromSpec()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromSpec)1405  - [`PyType_FromSpecWithBases()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromSpecWithBases)1406  - [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromModuleAndSpec)1407  - [`PyType_FromMetaclass()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromMetaclass)1408  - [`PyModule_FromDefAndSpec()`](https://python-all.ru/3.16/c-api/module.html#c.PyModule_FromDefAndSpec)1409  - [`PyModule_FromDefAndSpec2()`](https://python-all.ru/3.16/c-api/module.html#c.PyModule_FromDefAndSpec2)1410  - [`PyModule_ExecDef()`](https://python-all.ru/3.16/c-api/module.html#c.PyModule_ExecDef)14111412  Слоты [`Py_tp_bases`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_bases) и [`Py_tp_base`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_base) теперь эквивалентны: их можно установить как на один тип, так и на кортеж типов. Слот `Py_tp_bases` предпочтительнее; другой игнорируется, если указаны оба.14131414  (Автор: Petr Viktorin в [gh-149044](https://python-all.ru/3.16/whatsnew/3.15.html).)1415- Добавлены функции [`PyUnstable_ThreadState_SetStackProtection()`](https://python-all.ru/3.16/c-api/threads.html#c.PyUnstable_ThreadState_SetStackProtection) и [`PyUnstable_ThreadState_ResetStackProtection()`](https://python-all.ru/3.16/c-api/threads.html#c.PyUnstable_ThreadState_ResetStackProtection) для установки базового адреса защиты стека и размера защиты стека состояния потока Python. (Автор: Victor Stinner в [gh-139653](https://python-all.ru/3.16/whatsnew/3.15.html).)1416- Добавлена [`PyUnstable_SetImmortal()`](https://python-all.ru/3.16/c-api/object.html#c.PyUnstable_SetImmortal) функция C API для пометки объектов как [бессмертных](https://python-all.ru/3.16/glossary.html#term-immortal). (Автор: Kumar Aditya в [gh-143300](https://python-all.ru/3.16/whatsnew/3.15.html).)1417- Восстановлена частная промежуточная `_Py_InitializeMain()` функция, удалённая в Python 3.14. (Автор: Victor Stinner в [gh-142417](https://python-all.ru/3.16/whatsnew/3.15.html).)1418- Добавлены функции [`PyUnstable_DumpTraceback()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyUnstable_DumpTraceback) и [`PyUnstable_DumpTracebackThreads()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyUnstable_DumpTracebackThreads) для вывода Python стек-трейсов. (Автор: Alex Malyshev в [gh-145559](https://python-all.ru/3.16/whatsnew/3.15.html).)14191420### Изменённые C API14211422- Если установлен флаг [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) или [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF), то [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) также должен быть установлен. (Автор: Sergey Miryanov в [gh-134786](https://python-all.ru/3.16/whatsnew/3.15.html).)1423- [`PyDateTime_IMPORT`](https://python-all.ru/3.16/c-api/datetime.html#c.PyDateTime_IMPORT) теперь потокобезопасен. Код, который напрямую проверяет `PyDateTimeAPI` на `NULL`, следует обновить, чтобы вместо этого вызывать `PyDateTime_IMPORT`. (Автор: Kumar Aditya в [gh-141563](https://python-all.ru/3.16/whatsnew/3.15.html).)14241425### Удалённые C API14261427- Удалены устаревшие `PyUnicode` функции:14281429  - `PyUnicode_AsDecodedObject()`: Вместо этого используйте [`PyCodec_Decode()`](https://python-all.ru/3.16/c-api/codec.html#c.PyCodec_Decode).1430  - `PyUnicode_AsDecodedUnicode()`: Используйте [`PyCodec_Decode()`](https://python-all.ru/3.16/c-api/codec.html#c.PyCodec_Decode) вместо неё; обратите внимание, что некоторые кодеки (например, «base64») могут возвращать тип, отличный от [`str`](https://python-all.ru/3.16/library/stdtypes.html#str), например [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes).1431  - `PyUnicode_AsEncodedObject()`: Вместо этого используйте [`PyCodec_Encode()`](https://python-all.ru/3.16/c-api/codec.html#c.PyCodec_Encode).1432  - `PyUnicode_AsEncodedUnicode()`: Используйте [`PyCodec_Encode()`](https://python-all.ru/3.16/c-api/codec.html#c.PyCodec_Encode) вместо него; обратите внимание, что некоторые кодеки (например, «base64») могут возвращать тип, отличный от [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes), например [`str`](https://python-all.ru/3.16/library/stdtypes.html#str).14331434  (Автор: Stan Ulbrych в [gh-133612](https://python-all.ru/3.16/whatsnew/3.15.html).)1435- `PyImport_ImportModuleNoBlock()`: устаревший псевдоним [`PyImport_ImportModule()`](https://python-all.ru/3.16/c-api/import.html#c.PyImport_ImportModule). (Автор: Bénédikt Tran в [gh-133644](https://python-all.ru/3.16/whatsnew/3.15.html).)1436- `PyWeakref_GetObject()` и `PyWeakref_GET_OBJECT`: используйте [`PyWeakref_GetRef()`](https://python-all.ru/3.16/c-api/weakref.html#c.PyWeakref_GetRef) вместо них. Проект [pythoncapi-compat](https://python-all.ru/3.16/whatsnew/3.15.html) можно использовать для получения `PyWeakref_GetRef()` на Python 3.12 и старше. (Автор: Bénédikt Tran в [gh-133644](https://python-all.ru/3.16/whatsnew/3.15.html).)1437- Удалён устаревший `PySys_ResetWarnOptions()`. Вместо этого очищайте [`sys.warnoptions`](https://python-all.ru/3.16/library/sys.html#sys.warnoptions) и `warnings.filters`.14381439  (Автор: Nikita Sobolev в [gh-138886](https://python-all.ru/3.16/whatsnew/3.15.html).)14401441Следующие функции удалены в пользу [`PyConfig_Get()`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig_Get). Проект [pythoncapi-compat](https://python-all.ru/3.16/whatsnew/3.15.html) можно использовать для получения `PyConfig_Get()` на Python 3.13 и старше.14421443- Функции инициализации Python:14441445  - `Py_GetExecPrefix()`: используйте [`PyConfig_Get("base_exec_prefix")`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig_Get) ([`sys.base_exec_prefix`](https://python-all.ru/3.16/library/sys.html#sys.base_exec_prefix)) вместо неё. Используйте `PyConfig_Get("exec_prefix")` ([`sys.exec_prefix`](https://python-all.ru/3.16/library/sys.html#sys.exec_prefix)), если необходимо обрабатывать [виртуальные окружения](https://python-all.ru/3.16/library/venv.html#venv-def).1446  - `Py_GetPath()`: используйте [`PyConfig_Get("module_search_paths")`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig_Get) ([`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path)) вместо него.1447  - `Py_GetPrefix()`: вместо этого используйте [`PyConfig_Get("base_prefix")`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig_Get) ([`sys.base_prefix`](https://python-all.ru/3.16/library/sys.html#sys.base_prefix)). Используйте `PyConfig_Get("prefix")` ([`sys.prefix`](https://python-all.ru/3.16/library/sys.html#sys.prefix)), если требуется работа с [виртуальными окружениями](https://python-all.ru/3.16/library/venv.html#venv-def).1448  - `Py_GetProgramFullPath()`: вместо этого используйте [`PyConfig_Get("executable")`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig_Get) ([`sys.executable`](https://python-all.ru/3.16/library/sys.html#sys.executable)).1449  - `Py_GetProgramName()`: вместо этого используйте [`PyConfig_Get("executable")`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig_Get) ([`sys.executable`](https://python-all.ru/3.16/library/sys.html#sys.executable)).1450  - `Py_GetPythonHome()`: вместо этого используйте [`PyConfig_Get("home")`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig_Get) или переменную окружения [`PYTHONHOME`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONHOME).14511452  (Автор: Bénédikt Tran в [gh-133644](https://python-all.ru/3.16/whatsnew/3.15.html).)14531454### Устаревшие C API14551456- Устарела поддержка [**PEP 456**](https://python-all.ru/3.16/whatsnew/3.15.html) для предоставления внешнего определения схемы хеширования строк. Удаление запланировано на Python 3.19.14571458  Ранее разработчики встраиваемых приложений могли определить [`Py_HASH_ALGORITHM`](https://python-all.ru/3.16/c-api/hash.html#c.Py_HASH_ALGORITHM) как `Py_HASH_EXTERNAL`, чтобы указать, что схема хеширования предоставляется извне, но эта возможность была недокументированной, непроверенной и, скорее всего, неиспользуемой.14591460  (Автор: Bénédikt Tran в [gh-141226](https://python-all.ru/3.16/whatsnew/3.15.html).)1461- Для форматов беззнаковых целых чисел в [`PyArg_ParseTuple()`](https://python-all.ru/3.16/c-api/arg.html#c.PyArg_ParseTuple) теперь объявлено устаревшим принятие целых чисел Python, значение которых больше максимального значения для типа C или меньше минимального значения для соответствующего знакового целого типа того же размера. (Автор: Serhiy Storchaka в [gh-132629](https://python-all.ru/3.16/whatsnew/3.15.html).)1462- [`PyBytes_FromStringAndSize(NULL, len)`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytes_FromStringAndSize) и [`_PyBytes_Resize()`](https://python-all.ru/3.16/c-api/bytes.html#c._PyBytes_Resize) [мягко устарели](https://python-all.ru/3.16/glossary.html#term-soft-deprecated); вместо них используйте API [`PyBytesWriter`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesWriter). (Автор: Victor Stinner в [gh-129813](https://python-all.ru/3.16/whatsnew/3.15.html).)1463- `_PyObject_CallMethodId()`, `_PyObject_GetAttrId()` и `_PyUnicode_FromId()` устарели с версии 3.15 и будут удалены в 3.20. Вместо этого используйте [`PyUnicode_InternFromString()`](https://python-all.ru/3.16/c-api/unicode.html#c.PyUnicode_InternFromString) и кешируйте результат в состоянии модуля, затем вызывайте [`PyObject_CallMethod()`](https://python-all.ru/3.16/c-api/call.html#c.PyObject_CallMethod) или [`PyObject_GetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GetAttr). (Предложено Виктором Стиннером в [gh-141049](https://python-all.ru/3.16/whatsnew/3.15.html).)1464- Устарело поле [`cval`](https://python-all.ru/3.16/c-api/complex.html#c.PyComplexObject.cval) типа [`PyComplexObject`](https://python-all.ru/3.16/c-api/complex.html#c.PyComplexObject). Используйте [`PyComplex_AsCComplex()`](https://python-all.ru/3.16/c-api/complex.html#c.PyComplex_AsCComplex) и [`PyComplex_FromCComplex()`](https://python-all.ru/3.16/c-api/complex.html#c.PyComplex_FromCComplex) для преобразования комплексного числа Python в/из представления C [`Py_complex`](https://python-all.ru/3.16/c-api/complex.html#c.Py_complex). (Автор: Sergey B Kirpichev в [gh-128813](https://python-all.ru/3.16/whatsnew/3.15.html).)1465- Функции [`_Py_c_sum()`](https://python-all.ru/3.16/c-api/complex.html#c._Py_c_sum), [`_Py_c_diff()`](https://python-all.ru/3.16/c-api/complex.html#c._Py_c_diff), [`_Py_c_neg()`](https://python-all.ru/3.16/c-api/complex.html#c._Py_c_neg), [`_Py_c_prod()`](https://python-all.ru/3.16/c-api/complex.html#c._Py_c_prod), [`_Py_c_quot()`](https://python-all.ru/3.16/c-api/complex.html#c._Py_c_quot), [`_Py_c_pow()`](https://python-all.ru/3.16/c-api/complex.html#c._Py_c_pow) и [`_Py_c_abs()`](https://python-all.ru/3.16/c-api/complex.html#c._Py_c_abs) [мягко устарели](https://python-all.ru/3.16/glossary.html#term-soft-deprecated). (Автор: Sergey B Kirpichev в [gh-128813](https://python-all.ru/3.16/whatsnew/3.15.html).)1466- [`bytes_warning`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.bytes_warning) устарело начиная с версии 3.15 и будет удалено в версии 3.17. (Автор: Nikita Sobolev в [gh-136355](https://python-all.ru/3.16/whatsnew/3.15.html).)1467- Макрос `Py_INFINITY` [мягко устарел](https://python-all.ru/3.16/glossary.html#term-soft-deprecated); используйте стандарт C11 `<math.h>` `INFINITY`. (Автор: Sergey B Kirpichev в [gh-141004](https://python-all.ru/3.16/whatsnew/3.15.html).)1468- Следующие макросы [мягко устарели](https://python-all.ru/3.16/glossary.html#term-soft-deprecated):14691470  - [`Py_ALIGNED`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ALIGNED): вместо этого используйте `alignas`.1471  - [`PY_FORMAT_SIZE_T`](https://python-all.ru/3.16/c-api/intro.html#c.PY_FORMAT_SIZE_T): используйте непосредственно `"z"`.1472  - [`Py_LL`](https://python-all.ru/3.16/c-api/intro.html#c.Py_LL) и [`Py_ULL`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ULL): используйте стандартные суффиксы: `LL` и `ULL`.1473  - [`PY_LONG_LONG`](https://python-all.ru/3.16/c-api/intro.html#c.PY_LONG_LONG), [`PY_LLONG_MIN`](https://python-all.ru/3.16/c-api/intro.html#c.PY_LLONG_MIN), [`PY_LLONG_MAX`](https://python-all.ru/3.16/c-api/intro.html#c.PY_LLONG_MAX), [`PY_ULLONG_MAX`](https://python-all.ru/3.16/c-api/intro.html#c.PY_ULLONG_MAX), [`PY_INT32_T`](https://python-all.ru/3.16/c-api/intro.html#c.PY_INT32_T), [`PY_UINT32_T`](https://python-all.ru/3.16/c-api/intro.html#c.PY_UINT32_T), [`PY_INT64_T`](https://python-all.ru/3.16/c-api/intro.html#c.PY_INT64_T), [`PY_UINT64_T`](https://python-all.ru/3.16/c-api/intro.html#c.PY_UINT64_T), [`PY_SIZE_MAX`](https://python-all.ru/3.16/c-api/intro.html#c.PY_SIZE_MAX): используйте типы/пределы C99.1474  - [`Py_UNICODE_SIZE`](https://python-all.ru/3.16/c-api/intro.html#c.Py_UNICODE_SIZE): используйте непосредственно `sizeof(wchar_t)`.1475  - [`Py_VA_COPY`](https://python-all.ru/3.16/c-api/intro.html#c.Py_VA_COPY): используйте непосредственно `va_copy`.14761477  Макрос [`Py_UNICODE_WIDE`](https://python-all.ru/3.16/c-api/intro.html#c.Py_UNICODE_WIDE), который планировался к удалению, теперь [мягко устарел](https://python-all.ru/3.16/glossary.html#term-soft-deprecated).14781479  (Автор: Petr Viktorin в [gh-146175](https://python-all.ru/3.16/whatsnew/3.15.html).)1480- `Py_MATH_El` и `Py_MATH_PIl` устарели начиная с версии 3.15 и будут удалены в версии 3.20. (Автор: Sergey B Kirpichev в [gh-141004](https://python-all.ru/3.16/whatsnew/3.15.html).)14811482## Изменения в сборке14831484- Удалён неявный откат к встроенной копии библиотеки `libmpdec`. Теперь эта возможность должна быть явно включена с помощью `--with-system-libmpdec`, установленного в `no`, или с помощью `--without-system-libmpdec`. (Автор: Sergey B Kirpichev в [gh-115119](https://python-all.ru/3.16/whatsnew/3.15.html).)1485- Новая опция configure [`--with-missing-stdlib-config=FILE`](https://python-all.ru/3.16/using/configure.html#cmdoption-with-missing-stdlib-config) позволяет дистрибьюторам передавать [JSON](https://python-all.ru/3.16/whatsnew/3.15.html)-файл конфигурации, содержащий пользовательские сообщения об ошибках для модулей [стандартной библиотеки](https://python-all.ru/3.16/glossary.html#term-standard-library), которые отсутствуют или упакованы отдельно. (Автор: Stan Ulbrych и Petr Viktorin в [gh-139707](https://python-all.ru/3.16/whatsnew/3.15.html).)1486- Новая опция configure [`--with-pymalloc-hugepages`](https://python-all.ru/3.16/using/configure.html#cmdoption-with-pymalloc-hugepages) включает поддержку больших страниц для арен [pymalloc](https://python-all.ru/3.16/c-api/memory.html#pymalloc). При включении размер арены увеличивается до 2 МиБ, а выделение использует `MAP_HUGETLB` (Linux) или `MEM_LARGE_PAGES` (Windows) с автоматическим откатом к обычным страницам. В Windows используйте `build.bat --pymalloc-hugepages`. Во время выполнения большие страницы должны быть явно включены установкой переменной окружения [`PYTHON_PYMALLOC_HUGEPAGES`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHON_PYMALLOC_HUGEPAGES) в значение `1`.1487- Теперь поддерживается аннотирование анонимного использования mmap, если ядро Linux поддерживает *[PR\_SET\_VMA\_ANON\_NAME](https://python-all.ru/3.16/whatsnew/3.15.html)* (Linux 5.17 или новее). Аннотации видны в `/proc/<pid>/maps`, если ядро поддерживает эту функцию и [`-X dev`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-X) передаётся Python или Python собран в [режиме отладки](https://python-all.ru/3.16/using/configure.html#debug-build). (Автор: Donghee Na в [gh-141770](https://python-all.ru/3.16/whatsnew/3.15.html).)1488- Теперь CPython собирается с включёнными по умолчанию указателями на кадры ([**PEP 831**](https://python-all.ru/3.16/whatsnew/3.15.html)). Передайте [`--without-frame-pointers`](https://python-all.ru/3.16/using/configure.html#cmdoption-without-frame-pointers), чтобы отказаться.14891490  Авторам C-расширений и нативных библиотек, собираемых с помощью пользовательских систем сборки, следует убедиться в целостности цепочки размотки (unwind chain). Обычно это делается путём добавления `-fno-omit-frame-pointer` и подобных флагов в `CFLAGS`. Обратитесь к документации [`--without-frame-pointers`](https://python-all.ru/3.16/using/configure.html#cmdoption-without-frame-pointers) для получения информации о конкретных флагах, используемых Python.14911492  (Автор: Pablo Galindo Salgado и Savannah Ostrowski в [gh-149201](https://python-all.ru/3.16/whatsnew/3.15.html).)14931494- 64-разрядные сборки с использованием Visual Studio 2026 (MSVC 18) теперь могут использовать новый [интерпретатор с хвостовыми вызовами](https://python-all.ru/3.16/whatsnew/3.14.html#whatsnew314-tail-call-interpreter). Результаты на Visual Studio 18.1.1 показывают ускорение [15-20%](https://python-all.ru/3.16/whatsnew/3.15.html) по среднему геометрическому pyperformance на Windows x86-64 по сравнению с интерпретатором на switch-case на AMD Ryzen 7 5800X. Мы наблюдали ускорение от 14% для крупных библиотек на чистом Python до 40% для долго работающих небольших скриптов на чистом Python в Windows. Это стало возможным благодаря новой возможности, представленной в MSVC 18, которую теперь используют официальные 64-разрядные двоичные файлы Windows на [python.org](https://python-all.ru/3.16/whatsnew/3.15.html). (Автор: Chris Eibl, Ken Jin и Brandt Bucher в [gh-143068](https://python-all.ru/3.16/whatsnew/3.15.html). Особая благодарность Steve Dower и команде MSVC, включая Hulon Jenkins.)14951496## Перенос на Python 3.1514971498В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.14991500- [`sqlite3.Connection`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection) API приведены в порядок.15011502  - Все параметры [`sqlite3.connect()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.connect), за исключением *database*, теперь являются только ключевыми.1503  - Первые три параметра методов [`create_function()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.create_function) и [`create_aggregate()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.create_aggregate) теперь являются только позиционными.1504  - Первый параметр методов [`set_authorizer()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.set_authorizer), [`set_progress_handler()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.set_progress_handler) и [`set_trace_callback()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.set_trace_callback) теперь является только позиционным.15051506  (Автор: Serhiy Storchaka в [gh-133595](https://python-all.ru/3.16/whatsnew/3.15.html).)1507- [`resource.RLIM_INFINITY`](https://python-all.ru/3.16/library/resource.html#resource.RLIM_INFINITY) теперь всегда положителен. Передача отрицательного целого значения, которое соответствовало его старому значению (например, `-1` или `-3`, в зависимости от платформы), в [`resource.setrlimit()`](https://python-all.ru/3.16/library/resource.html#resource.setrlimit) и [`resource.prlimit()`](https://python-all.ru/3.16/library/resource.html#resource.prlimit) теперь устарела. (Автор: Serhiy Storchaka в [gh-137044](https://python-all.ru/3.16/whatsnew/3.15.html).)1508- [`mmap.mmap.resize()`](https://python-all.ru/3.16/library/mmap.html#mmap.mmap.resize) удалён на платформах, не поддерживающих нижележащий системный вызов, вместо того чтобы выбрасывать [`SystemError`](https://python-all.ru/3.16/library/exceptions.html#SystemError).1509- Теперь выдаётся предупреждение о ресурсах для незакрытого итератора [`xml.etree.ElementTree.iterparse()`](https://python-all.ru/3.16/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse), если он открыл файл. Для закрытия следует использовать его метод `close()` или контекстный менеджер [`contextlib.closing()`](https://python-all.ru/3.16/library/contextlib.html#contextlib.closing). (Автор: Osama Abdelkader и Serhiy Storchaka в [gh-140601](https://python-all.ru/3.16/whatsnew/3.15.html).)1510- Если [`argparse.ArgumentParser.add_argument()`](https://python-all.ru/3.16/library/argparse.html#argparse.ArgumentParser.add_argument) переданы короткая опция и длинная опция с одним дефисом, то *dest* теперь определяется по длинной опции с одним дефисом. Например, в `add_argument('-f', '-foo')` *dest* теперь равен `'foo'` вместо `'f'`. Передайте явный аргумент *dest*, чтобы сохранить старое поведение. (Автор: Serhiy Storchaka в [gh-138697](https://python-all.ru/3.16/whatsnew/3.15.html).)1511- Дополнение входных данных больше не требуется в [`base64.urlsafe_b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.urlsafe_b64decode). Передайте новый аргумент `padded=True` или используйте [`base64.b64decode()`](https://python-all.ru/3.16/library/base64.html#base64.b64decode) с аргументом `altchars=b'-_'` (это работает со старыми версиями Python), чтобы сделать дополнение обязательным. (Автор: Serhiy Storchaka в [gh-73613](https://python-all.ru/3.16/whatsnew/3.15.html).)1512- Поскольку [`unittest.TestCase.assertWarns()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertWarns) и [`unittest.TestCase.assertWarnsRegex()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertWarnsRegex) больше не проглатывают предупреждения, которые не соответствуют указанной категории или регулярному выражению, ваши тесты могут начать пропускать некоторые предупреждения, которые ранее маскировались. Используйте фильтры предупреждений, чтобы подавить их, или дополнительные `assertWarns*()`, чтобы перехватывать и проверять их. (Автор: Serhiy Storchaka в [gh-143231](https://python-all.ru/3.16/whatsnew/3.15.html).)1513