Содержание страницы
Что нового в Python 3.15¶What’s new in Python 3.15
- Редактор:
Hugo van Kemenade
В этой статье описываются новые возможности Python 3.15 по сравнению с версией 3.14.
Подробнее см. в списке изменений.
Примечание
Пользователям предварительных версий следует знать, что этот документ пока является черновиком. Он будет существенно дорабатываться по мере приближения релиза Python 3.15, так что стоит заглядывать снова, даже если вы уже читали более ранние версии.
Итоги – основные изменения¶Summary – Release highlights
PEP 799: Специализированный пакет профилирования для организации инструментов профилирования Python
PEP 799: Tachyon: высокочастотный статистический семплирующий профилировщик
PEP 831: Указатели кадров включены по умолчанию для улучшения наблюдаемости на уровне системы
PEP 686: Python теперь использует UTF-8 в качестве кодировки по умолчанию
PEP 800: Непересекающиеся базовые классы в системе типов
PEP 782: Новый C API PyBytesWriter для создания объекта bytes в Python
PEP 803, 820, 793: Стабильный ABI для free-threaded сборок и связанный C API
JIT-компилятор был значительно обновлёнThe JIT compiler has been significantly upgraded
Официальные 64-битные сборки Windows теперь используют интерпретатор с хвостовыми вызовамиThe official Windows 64-bit binaries now use the tail-calling interpreter
Улучшенные сообщения об ошибкахImproved error messages
Больше цветаMore color
Новые возможности¶New features
PEP 810: Явные ленивые импорты¶PEP 810: Explicit lazy imports
Крупные приложения на Python часто страдают от медленного запуска. A значительный вклад в эту проблему вносит система импорта: при импорте модуля Python должен найти файл, прочитать его с диска, скомпилировать в байткод и выполнить весь код верхнего уровня. Для приложений с глубокими деревьями зависимостей этот процесс может занимать секунды, даже когда большая часть импортированного кода в конкретном запуске никогда не используется.
Разработчики обходили это, перенося импорты внутрь функций, используя
importlib для загрузки модулей по требованию, или перестраивая код, чтобы избежать
ненужных зависимостей. Эти подходы работают, но делают код сложнее для чтения
и поддержки, разбрасывают операторы импорта по всей кодовой базе и требуют
дисциплины для последовательного применения.
Python теперь предлагает более чистое решение через явные lazy
импорты с использованием нового мягкого ключевого слова lazy. Когда импорт помечается как
ленивый, Python откладывает фактическую загрузку модуля до первого использования
импортированного имени. Это даёт преимущества организации: объявление всех импортов
в начале файла, при этом затраты на загрузку возникают только для модулей,
которые действительно используются.
Ключевое слово lazy работает как с операторами import, так и from ... import
. При записи lazy import heavy_module Python не
загружает модуль немедленно. Вместо этого он создаёт легковесный объект-прокси.
Фактическая загрузка модуля происходит прозрачно при первом обращении к
имени:
lazy import json
lazy from pathlib import Path
print("Starting up...") # json и pathlib ещё не загружены
data = json.loads('{"key": "value"}') # здесь загружается json
p = Path(".") # здесь загружается pathlib
Этот механизм особенно полезен для приложений, которые импортируют много модулей на верхнем уровне, но могут использовать лишь часть из них в конкретном запуске. Отложенная загрузка снижает задержку запуска без необходимости перестройки кода или разбросанных по кодовой базе условных импортов.
В случае, если загрузка лениво импортированного модуля завершается ошибкой (например, если модуль не существует), Python возбуждает исключение в точке первого использования, а не во время импорта. Связанная трассировка включает как место, где было использовано имя, так и исходный оператор импорта, что упрощает диагностику и отладку сбоя.
Для случаев, когда нужно включить ленивую загрузку глобально без изменения
исходного кода, Python предоставляет опцию командной строки -X lazy_imports
и переменную окружения PYTHON_LAZY_IMPORTS. Обе
принимают два значения: all делает все импорты ленивыми по умолчанию, а normal
(по умолчанию) учитывает ключевое слово lazy в исходном коде.
Функции sys.set_lazy_imports() и sys.get_lazy_imports() позволяют
изменять и запрашивать этот режим во время выполнения.
Для более избирательного контроля sys.set_lazy_imports_filter() принимает
вызываемый объект, который определяет, должен ли конкретный модуль загружаться лениво.
Фильтр получает три аргумента: имя импортирующего модуля (или
None), имя импортируемого модуля и fromlist (или None для
обычных импортов). Он должен возвращать True, чтобы разрешить ленивый импорт,
или False, чтобы принудительно загрузить сразу. Это позволяет, например, сделать ленивыми только модули
вашего приложения, оставив сторонние зависимости обычными:
import sys
def myapp_filter(importing, imported, fromlist):
return imported.startswith("myapp.")
sys.set_lazy_imports_filter(myapp_filter)
sys.set_lazy_imports("all")
import myapp.slow_module # ленивый (соответствует фильтру)
import json # жадный (не соответствует фильтру)
Сам тип прокси доступен как types.LazyImportType для кода,
которому нужно программно обнаруживать ленивые импорты.
Существуют некоторые ограничения на то, где можно использовать ключевое слово lazy. Ленивые
импорты разрешены только на уровне модуля; использование lazy внутри
функции, тела класса или блока try/except/finally приводит к
SyntaxError. Ни звёздочные импорты, ни future-импорты не могут быть ленивыми
(lazy from module import * и lazy from __future__ import ... оба
приводят к SyntaxError).
Для кода, который не может напрямую использовать ключевое слово lazy (например, при
поддержке версий Python старше 3.15, но с использованием ленивых
импортов на 3.15+), модуль может определить
__lazy_modules__ как контейнер строк с полными именами
модулей. Обычные операторы import для этих модулей затем обрабатываются
как ленивые, с той же семантикой, что и ключевое слово lazy:
__lazy_modules__ = ["json", "pathlib"]
import json # ленивый
import os # всё ещё жадный
См. также
PEP 810 для полной спецификации и обоснования.
(Вклад Пабло Галиндо Сальгадо и Дино Виланда в gh-142349.)
PEP 814: Добавление встроенного типа frozendict¶PEP 814: Add frozendict built-in type
Новый неизменяемый тип, frozendict, добавлен в модуль builtins.
Он не допускает изменений после создания. frozendict не является подклассом dict;
он наследует напрямую от object. frozendict является хешируемым,
пока все его ключи и значения хешируемы. frozendict сохраняет
порядок вставки, но при сравнении порядок не учитывается.
Например:
>>> a = frozendict(x=1, y=2)
>>> a
frozendict({'x': 1, 'y': 2})
>>> a['z'] = 3
Traceback (most recent call last):
File "<python-input-2>", line 1, in <module>
a['z'] = 3
~^^^^^
TypeError: 'frozendict' object does not support item assignment
>>> b = frozendict(y=2, x=1)
>>> hash(a) == hash(b)
True
>>> a == b
True
Следующие модули стандартной библиотеки были обновлены для поддержки
frozendict: copy, decimal, json, marshal,
plistlib (только для сериализации), pickle, pprint и
xml.etree.ElementTree.
eval() и exec() принимают frozendict для globals, и
type() и str.maketrans() принимают frozendict для dict.
Код, проверяющий тип dict с помощью isinstance(arg, dict), может быть
обновлён до isinstance(arg, (dict, frozendict)), чтобы также принимать
тип frozendict, или до isinstance(arg, collections.abc.Mapping),
чтобы также принимать другие отображающие типы, такие как MappingProxyType.
См. также
PEP 814 для полной спецификации и обоснования.
(Вклад Виктора Стиннера и Донхи На в gh-141510.)
PEP 661: Добавление встроенного типа sentinel¶PEP 661: Add sentinel built-in type
Новый тип sentinel добавлен в модуль builtins для
создания уникальных sentinel-значений с кратким представлением. Sentinel-объекты
сохраняют идентичность при копировании, поддерживают использование в выражениях типов с
оператором | и могут быть сериализованы, если они импортируемы по модулю и
имени.
(PEP от Таля Эйната; вклад Йелле Зийлстры в gh-148829.)
См. также
PEP 661 для получения дополнительных сведений.
PEP 799: Выделенный пакет профилирования¶PEP 799: A dedicated profiling package
Добавлен новый модуль profiling, чтобы организовать встроенные
средства профилирования Python в едином согласованном пространстве имён. Этот модуль содержит:
profiling.tracing: детерминированная трассировка вызовов функций (перенесено изcProfile).profiling.sampling: новый статистический профилировщик с семплингом (назван Tachyon).
Модуль cProfile остаётся псевдонимом для обратной совместимости.
Модуль profile устарел и будет удалён в Python 3.17.
См. также
PEP 799 для получения дополнительных сведений.
(Авторы: Pablo Galindo и László Kiss Kollár в gh-138122.)
Tachyon: высокочастотный статистический профилировщик с семплингом¶Tachyon: High frequency statistical sampling profiler
Новый статистический профилировщик с семплингом (Tachyon) добавлен как
profiling.sampling. Этот профилировщик позволяет выполнять анализ производительности запущенных процессов Python с низкими накладными расходами, не требуя изменения кода или перезапуска процесса.
В отличие от детерминированных профилировщиков (таких как profiling.tracing), которые инструментируют каждый вызов функции, профилировщик с семплингом периодически собирает стек-трейсы из запущенных процессов. Такой подход обеспечивает практически нулевые накладные расходы при частоте семплинга до 1 000 000 Гц, что делает его самым быстрым профилировщиком с семплингом для Python (на момент его создания) и идеальным для отладки проблем производительности в рабочих средах. Эта возможность особенно ценна для отладки проблем производительности в production-системах, где традиционные подходы к профилированию оказываются слишком навязчивыми.
Ключевые возможности:
Профилирование с нулевыми накладными расходами: Подключение к любому запущенному процессу Python без влияния на его производительность. Идеально подходит для отладки в production, когда нельзя позволить себе перезапуск или замедление приложения.
Не требует изменения кода: Профилирует существующие приложения без перезапуска. Для начала сбора данных достаточно указать профилировщику PID запущенного процесса.
Гибкие режимы целевого профилирования:
Профилирование запущенных процессов по PID (
attach) – подключение к уже запущенным приложениямЗапуск и профилирование скриптов напрямую (
run) – профилирование с самого начала выполненияЗапуск и профилирование модулей (
run -m) – профилирование пакетов, запускаемых какpython -m moduleЗахват однократного снимка запущенного процесса (
dump) – вывод стек-трейса в стиле traceback для каждого потока (или всех задач asyncio с--async-aware). Полезно для исследования зависших процессов.
Несколько режимов профилирования: Выберите, что измерять, в зависимости от исследуемой проблемы производительности:
Стенное время (Wall clock time) (
--mode wall, по умолчанию): Измеряет реальное прошедшее время, включая ввод-вывод, ожидание сети и блокирующие операции. Используйте этот режим, чтобы понять, где программа проводит календарное время, включая время ожидания внешних ресурсов.Время CPU (
--mode cpu): Измеряет только активное время выполнения на CPU, исключая ожидание ввода-вывода и блокировки. Используйте этот режим для выявления узких мест, связанных с загрузкой CPU, и оптимизации вычислительной работы.Время удержания GIL (
--mode gil): Измеряет время, проведённое с удержанием глобальной блокировки интерпретатора Python (GIL). Используйте этот режим, чтобы определить, какие потоки доминируют по использованию GIL в многопоточных приложениях.Время обработки исключений (
--mode exception): Собирает семплы только из потоков с активным исключением. Используйте этот режим для анализа накладных расходов на обработку исключений.
Профилирование с учётом потоков: Возможность профилировать все потоки (
-a) или только главный поток – необходимо для понимания поведения многопоточных приложений.Несколько форматов вывода: Выберите визуализацию, которая лучше всего подходит для вашего рабочего процесса:
--pstats: Подробная табличная статистика, совместимая сpstats. Показывает временные характеристики на уровне функций с прямыми и кумулятивными семплами. Лучше всего подходит для детального анализа и интеграции с существующими инструментами профилирования Python.--collapsed: Создаёт свёрнутые стек-трейсы (одна строка на стек). Этот формат специально разработан для создания флейм-графиков с помощью внешних инструментов, таких как скрипты FlameGraph Брендана Грегга или speedscope.--flamegraph: Создаёт автономный интерактивный HTML-флейм-график с использованием D3.js. Открывается прямо в браузере для немедленного визуального анализа. Флейм-графики показывают иерархию вызовов, где ширина представляет затраченное время, что позволяет легко заметить узкие места с первого взгляда.--gecko: Генерирует формат Gecko Profiler, совместимый с Firefox Profiler. Загрузите результат в Firefox Profiler для расширенного анализа на основе временной шкалы с такими возможностями, как графики стеков, маркеры и сетевая активность.--heatmap: Создаёт интерактивную HTML-визуализацию в виде тепловой карты с количеством семплов на уровне строк. Создаёт директорию с тепловыми картами для каждого файла, точно показывающую, где тратится время на уровне исходного кода.
Интерактивный режим в реальном времени: TUI-профилировщик в реальном времени с интерфейсом наподобие top (
--live). Отслеживайте производительность во время работы приложения с интерактивной сортировкой и фильтрацией.Профилирование с учётом асинхронности: Профилирование async/await кода с восстановлением стеков на основе задач (
--async-aware). Позволяет увидеть, какие корутины потребляют время, с возможностью показывать только выполняющиеся задачи или все задачи, включая ожидающие.Профилирование на уровне опкодов: Сбор информации об опкодах байткода для профилирования на уровне инструкций (
--opcodes). Показывает, какие инструкции байткода выполняются, включая специализации от адаптивного интерпретатора.
См. profiling.sampling для получения полной документации, включая все доступные форматы вывода, режимы профилирования и параметры конфигурации.
(Авторы: Pablo Galindo и László Kiss Kollár в gh-135953 и gh-138122.)
PEP 831: Указатели фреймов включены по умолчанию¶PEP 831: Frame pointers enabled by default
CPython теперь собирается с указателями фреймов по умолчанию на платформах, которые их поддерживают. Для этого используются флаги компилятора -fno-omit-frame-pointer и -mno-omit-leaf-frame-pointer, что ускоряет и повышает надёжность размотки нативного стека для системных профилировщиков, отладчиков, инструментов анализа сбоев и средств наблюдения на основе eBPF.
Флаги доступны через sysconfig, поэтому модули расширения, собранные инструментами, которые используют конфигурацию сборки Python, наследуют указатели фреймов по умолчанию. Это распространение сделано намеренно: для смешанного профилирования Python/нативного кода требуется непрерывная цепочка указателей фреймов через интерпретатор, модули расширения, встраиваемые приложения и нативные библиотеки.
Важно
Сторонние бэкенды сборки и нативные системы сборки должны сохранять эти флаги, когда используют значения sysconfig от Python. Системы сборки, которые компилируют C, C++, Rust или другой нативный код без наследования флагов компилятора Python, должны сами включать эквивалентные флаги указателей фреймов. Один единственный нативный компонент, собранный без указателей фреймов, может нарушить размотку стека для всего процесса Python.
(Авторы: Pablo Galindo Salgado и Savannah Ostrowski в gh-149201; PEP 831 написан Pablo Galindo Salgado, Ken Jin, Savannah Ostrowski и Diego Russo.)
См. также
PEP 831 для получения дополнительных сведений.
PEP 798: Распаковка в генераторах списков¶PEP 798: Unpacking in comprehensions
Генераторы списков, множеств и словарей, а также выражения-генераторы теперь поддерживают распаковку с * и **. Это расширяет синтаксис распаковки из PEP 448 на генераторы, предоставляя новый синтаксис для объединения произвольного количества итерируемых объектов или словарей в единую плоскую структуру. Этот новый синтаксис является прямой альтернативой вложенным генераторам, itertools.chain() и itertools.chain.from_iterable(). Например:
>>> lists = [[1, 2], [3, 4], [5]]
>>> [*L for L in lists] # эквивалентно [x for L in lists for x in L]
[1, 2, 3, 4, 5]
>>> sets = [{1, 2}, {2, 3}, {3, 4}]
>>> {*s for s in sets} # эквивалентно {x for s in sets for x in s}
{1, 2, 3, 4}
>>> dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
>>> {**d for d in dicts} # эквивалентно {k: v for d in dicts for k,v in d.items()}
{'a': 3, 'b': 2}
Выражения-генераторы также могут использовать распаковку для получения значений из нескольких итерируемых объектов:
>>> gen = (*L for L in lists) # эквивалентно (x for L in lists for x in L)
>>> list(gen)
[1, 2, 3, 4, 5]
Это изменение также распространяется на асинхронные выражения-генераторы, так что, например, (*a async for a in agen()) эквивалентно (x async for a in
agen() for x in a).
См. также
PEP 798 для получения дополнительных сведений.
(Автор: Adam Hartz в gh-143055.)
PEP 829: Файлы конфигурации запуска пакетов¶PEP 829: Package startup configuration files
Загружаемые модулем site, когда -S не указан, файлы .pth могут содержать строки, которые как расширяют sys.path, так и выполняют произвольный код, если строка начинается с import (с последующим пробелом или табуляцией). Последняя функциональность может быть проблематичной, поскольку сложно точно знать, что именно выполняется при запуске Python.
В качестве шага по улучшению возможности аудита исполняемого кода до запуска, Python 3.15 вводит файлы .start, которые содержат спецификации точек входа в виде pkg.mod:callable, где pkg.mod – это путь импорта к указанной вызываемой сущности. При запуске Python вызываемая сущность находится и вызывается без аргументов.
Строки import в файлах .pth объявлены устаревшими без предупреждения. Если найден соответствующий файл .start, строки import в файлах .pth игнорируются. Для строк расширения sys.path в файлах .pth изменений нет.
Модуль site также предоставляет site.StartupState для пакетной обработки запуска для нескольких каталогов сайтов, гарантируя, что все статические расширения путей применяются до выполнения любого кода запуска. site.main() неявно использует экземпляр этого класса для пакетной обработки всех файлов конфигурации запуска при обычном запуске интерпретатора. Вызывающим сторонам, которым нужно такое же пакетное поведение, можно напрямую создать StartupState и управлять им с помощью addsitedir(), addusersitepackages() и addsitepackages(), а затем вызвать process() один раз в конце пакетной обработки.
PEP 803 – Стабильный ABI для сборок со свободными потоками¶PEP 803 – Stable ABI for free-threaded builds
Расширения C, предназначенные для Стабильного ABI, теперь могут быть скомпилированы для нового Стабильного ABI для сборок со свободными потоками (также известного как abi3t), что делает их совместимыми с сборками со свободными потоками CPython. Обычно это требует нетривиальных изменений в исходном коде; в частности:
Переход на API, введённый в PEP 697 (Python 3.12), такой как отрицательные
basicsizeиPyObject_GetTypeData(), вместо того чтобы делатьPyObjectчастью структуры экземпляра; иПереход от функции
PyInit_к новому хуку экспортаPyModExport_*, введённому для этой цели в PEP 793, с новой структуройPySlot, введённой в PEP 820.
Обратите внимание, что Стабильный ABI не предоставляет всей функциональности CPython. Расширения, которые не могут переключиться на abi3t, должны продолжать собираться для существующего Стабильного ABI (abi3) и версионно-специфичного ABI для свободных потоков (cp315t) по отдельности.
Стабильный ABI для сборок со свободными потоками обычно следует выбирать в инструменте сборки (например, Setuptools, meson-python, scikit-build-core или Maturin). На момент написания эти инструменты не поддерживали abi3t. Если это относится к вашему инструменту, компилируйте для cp315t отдельно. Если вы не используете инструмент сборки – или пишете такой инструмент – вы можете выбрать abi3t, установив макрос Py_TARGET_ABI3T, как описано в Компиляция для Стабильного ABI.
Доступно практическое руководство по миграции для перехода на abi3t.
См. также
PEP 803 для получения дополнительных сведений.
PEP 788: Защита C API от завершения работы интерпретатора¶PEP 788: Protecting the C API from interpreter finalization
В C API завершение работы интерпретатора может быть проблематичным для многих расширений, потому что присоединение состояния потока навсегда зависает поток, что приводит к взаимоблокировкам и другим ложным проблемам. Кроме того, исторически было невозможно безопасно проверить, жив ли интерпретатор, прежде чем использовать его, что приводило к сбоям, когда один поток одновременно удаляет интерпретатор, а другой пытается к нему присоединиться.
Теперь есть несколько новых наборов API для обхода этих проблем:
Охранники интерпретатора, которые предотвращают завершение работы интерпретатора.
Представления интерпретатора, которые обеспечивают потокобезопасный доступ к интерпретатору, который может одновременно завершать работу или быть удалён.
Новые API для автоматического присоединения и отсоединения состояний потоков со встроенной защитой от финализации.
Кроме того, API из семейства PyGILState (в первую очередь
PyGILState_Ensure() и PyGILState_Release()) стали мягко устаревшими. Не планируется удалять их, существующий
код продолжит работать, но в будущих версиях Python не будет новых API PyGILState.
См. также
PEP 788 для подробностей.
(Автор: Peter Bierma, gh-149101.)
Улучшенные сообщения об ошибках¶Improved error messages
Интерпретатор теперь даёт более полезные подсказки в исключениях
AttributeErrorпри обращении к несуществующему атрибуту объекта, если похожий атрибут доступен через один из его членов.Например, если у объекта есть атрибут, который сам предоставляет запрошенное имя, сообщение об ошибке предложит обратиться к нему через этот внутренний атрибут:
@dataclass class Circle: radius: float @property def area(self) -> float: return pi * self.radius**2 class Container: def __init__(self, inner: Circle) -> None: self.inner = inner circle = Circle(radius=4.0) container = Container(circle) print(container.area)
Теперь выполнение этого кода выдаёт более понятную подсказку:
Traceback (most recent call last): File "/home/pablogsal/github/python/main/lel.py", line 42, in <module> print(container.area) ^^^^^^^^^^^^^^ AttributeError: 'Container' object has no attribute 'area'. Did you mean '.inner.area' instead of '.area'?
Когда
AttributeErrorвстроенного типа не находит близкого совпадения по расстоянию Левенштейна, сообщение об ошибке теперь проверяет статическую таблицу распространённых имён методов из других языков (JavaScript, Java, Ruby, C#) и предлагает эквивалент на Python:>>> [1, 2, 3].push(4) Traceback (most recent call last): ... AttributeError: 'list' object has no attribute 'push'. Did you mean '.append'? >>> 'hello'.toUpperCase() Traceback (most recent call last): ... AttributeError: 'str' object has no attribute 'toUpperCase'. Did you mean '.upper'?
Если эквивалент на Python – языковая конструкция, а не метод, подсказка описывает её напрямую:
>>> {}.put("a", 1) Traceback (most recent call last): ... AttributeError: 'dict' object has no attribute 'put'. Use d[k] = v.
Когда изменяемый метод вызывается для неизменяемого типа, подсказка предлагает соответствующий изменяемый вариант:
>>> (1, 2, 3).append(4) Traceback (most recent call last): ... AttributeError: 'tuple' object has no attribute 'append'. Did you mean to use a 'list' object?
Эти подсказки также работают для подклассов встроенных типов.
(Автор: Matt Van Horn, gh-146406.)
Теперь интерпретатор пытается дать подсказку, когда
delattr()завершается ошибкой из-за отсутствующего атрибута. Если используется имя атрибута, очень похожее на существующий атрибут, интерпретатор предложит правильное имя атрибута в сообщении об ошибке. Например:>>> class A: ... pass >>> a = A() >>> a.abcde = 1 >>> del a.abcdf Traceback (most recent call last): ... AttributeError: 'A' object has no attribute 'abcdf'. Did you mean: 'abcde'?
(Авторы: Nikita Sobolev и Pranjal Prajapati, gh-136588.)
Несколько сообщений об ошибках, некорректно использовавших термин «argument», исправлены. (Автор: Stan Ulbrych, gh-133382.)
Прочие изменения в языке¶Other language changes
Python теперь использует UTF-8 в качестве кодировки по умолчанию независимо от окружения системы. Это означает, что операции ввода-вывода без явного указания кодировки, например
open('flying-circus.txt'), будут использовать UTF-8. UTF-8 – широко поддерживаемая Юникод-кодировка символов, ставшая фактическим стандартом представления текста, включая почти все веб-страницы в интернете, многие распространённые форматы файлов, языки программирования и другое.Это применимо только если аргумент
encodingне указан. Для наилучшей совместимости между версиями Python убедитесь, что явный аргументencodingвсегда предоставляется. Опциональное предупреждение о кодировке можно использовать для выявления кода, который может быть затронут этим изменением. Специальный аргументencoding='locale'использует кодировку текущей локали и поддерживается начиная с Python 3.10.Чтобы сохранить прежнее поведение, режим UTF-8 Python можно отключить с помощью переменной окружения
PYTHONUTF8=0или параметра командной строки-X utf8=0.См. также
PEP 686 для подробностей.
(Автор: Adam Turner, gh-133711; PEP 686 написан Inada Naoki.)
Справка интерпретатора (например
python --help) теперь цветная. Это можно контролировать переменными окружения. (Автор: Hugo van Kemenade, gh-148766.)Исключения, которые невозможно вызвать, теперь по умолчанию выделяются цветом. Это можно контролировать переменными окружения. (Автор: Peter Bierma, gh-134170.)
Больше цвета в argparse, ast, calendar, difflib, http.server, pickletools, автодополнении PyREPL, python –help, sqlite3, timeit, tokenize, невызываемых исключений (unraisable exceptions) и stdlib (ast, compileall, doctest, gzip, inspect, json.tool, pdb, profiling.sampling, random, regrtest, sqlite3, timeit, tokenize, trace, unittest, uuid, zipapp, zipfile) CLI help.
__repr__()уImportErrorиModuleNotFoundErrorтеперь показывает «name» и «path» какname=<name>иpath=<path>, если они были переданы в качестве именованных аргументов при создании. (Авторы: Serhiy Storchaka, Oleg Iarygin и Yoav Nir, gh-74185.)Дескрипторы
__dict__и__weakref__теперь используют один экземпляр дескриптора на интерпретатор, общий для всех типов, которым они нужны. Это ускоряет создание классов и помогает избежать циклов ссылок. (Автор: Petr Viktorin, gh-135228.)Опция
-Wи переменная окруженияPYTHONWARNINGSтеперь могут задавать регулярные выражения вместо строковых литералов для сопоставления с сообщением предупреждения и именем модуля, если соответствующее поле начинается и заканчивается косой чертой (/). (Автор: Serhiy Storchaka, gh-134716.)Функции, принимающие аргументы timestamp или timeout, теперь принимают любые вещественные числа (например
DecimalиFraction), а не только целые числа или числа с плавающей запятой, хотя это не повышает точность. (Автор: Serhiy Storchaka, gh-67795.)
Добавлен
bytearray.take_bytes(n=None, /)для извлечения байтов изbytearrayбез копирования. Это позволяет оптимизировать код, который должен возвращатьbytesпосле работы с изменяемым буфером байтов, например, буферизация данных, разбор сетевых протоколов, кодирование, декодирование и сжатие. Типичные шаблоны кода, которые можно оптимизировать с помощьюtake_bytes(), перечислены ниже.Предлагаемые оптимизирующие рефакторинги¶ Описание
Старое
Новое
def read() -> bytes: buffer = bytearray(1024) ... return bytes(buffer)
def read() -> bytes: buffer = bytearray(1024) ... return buffer.take_bytes()
Очистка буфера с получением байтов
buffer = bytearray(1024) ... data = bytes(buffer) buffer.clear()
buffer = bytearray(1024) ... data = buffer.take_bytes()
Разделить буфер по заданному разделителю
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)
Разделить буфер по заданному разделителю; отбросить часть после разделителя
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()
(Разработано Cody Maloney в gh-139871.)
Многие функции, связанные с компиляцией или разбором кода Python, такие как
compile(),ast.parse(),symtable.symtable(), иimportlib.abc.InspectLoader.source_to_code(), теперь позволяют передавать имя модуля. Это необходимо для однозначной фильтрации синтаксических предупреждений по имени модуля. (Разработано Serhiy Storchaka в gh-135801.)Разрешено определять __dict__ и __weakref__ __slots__ для любого класса. (Разработано Serhiy Storchaka в gh-41779.)
Разрешено определять любые __slots__ для класса, производного от
tuple(включая классы, созданные с помощьюcollections.namedtuple()). (Разработано Serhiy Storchaka в gh-41779.)Тип
sliceтеперь поддерживает подписку (subscription), что делает его обобщённым типом. (Разработано James Hilton-Balfe в gh-128335.)Класс
memoryviewтеперь поддерживает типы C float complex и double complex: символы форматирования'Zf'и'Zd'соответственно. (Разработано Victor Stinner в gh-146151 и gh-148675.)Разрешено передавать аргумент count функции
bytes.replace()как именованный. (Разработано Stan Ulbrych в gh-147856.)Унарный плюс теперь принимается в литеральных шаблонах
match, что отражает существующую поддержку унарного минуса. (Разработано Bartosz Sławecki в gh-145239.)Система импорта теперь захватывает блокировки на модули в иерархическом порядке (родительские пакеты перед их подмодулями). Это исправляет давнюю взаимоблокировку, когда один поток импортирует
pkg.sub, а другой импортируетpkg.sub.mod, и каждый мог заблокировать другой, когдаpkg/sub/__init__.pyимпортируетpkg.sub.mod. (Разработано Gregory P. Smith в gh-83065.)
Интерактивная оболочка по умолчанию¶Default interactive shell
Завершение по табу теперь окрашивается по типу объекта, на основе fancycompleter. Установите
PYTHON_BASIC_COMPLETERдля возврата кrlcompleter. Цвет также можно контролировать через переменные окружения. (Разработано Antonio Cuni и Pablo Galindo в gh-130472.)
Новые модули¶New modules
math.integer¶
Этот модуль предоставляет доступ к математическим функциям для целочисленных аргументов (PEP 791). (Разработано Serhiy Storchaka в gh-81313.)
Улучшенные модули¶Improved modules
argparse¶
Действие
BooleanOptionalActionтеперь поддерживает длинные опции с одним дефисом и альтернативные символы префикса. (Разработано Serhiy Storchaka в gh-138525.)Изменено значение по умолчанию параметра suggest_on_error функции
argparse.ArgumentParserнаTrue. Это включает предложения для неправильно набранных аргументов по умолчанию. (Разработано Jakob Schluse в gh-140450.)Добавлена поддержка разметки обратными кавычками в тексте описания
ArgumentParserи эпилога для выделения встроенного кода при включённом цветном выводе. (Разработано Savannah Ostrowski в gh-142390.)Расширена разметка обратными кавычками на текст аргумента
helpи добавлена поддержка двойных обратных кавычек (стиль RST inline-literal). (Разработано Hugo van Kemenade в gh-149375.)
array¶
Поддержка типов C float complex и double complex: символы форматирования
'Zf'и'Zd'соответственно. (Разработано Victor Stinner в gh-146151 и gh-148675.)Поддержка полуточных чисел (16-битный формат двоичного обмена IEEE 754): символ форматирования
'e'. (Разработано Sergey B Kirpichev в gh-146238.)Тип
array.typecodesизменён сstrнаtupleдля поддержки кодов типов длиннее 1 символа (ZfиZd). (Разработано Victor Stinner в gh-148675.)
ast¶
Добавлен параметр color в
dump(). ЕслиTrue, возвращаемая строка подсвечивается синтаксически с помощью ANSI-escape последовательностей. ЕслиFalse(по умолчанию), цветной вывод всегда отключён. (Разработано Stan Ulbrych в gh-148981.)Вывод командной строки теперь по умолчанию подсвечивается синтаксически. Это можно контролировать с помощью переменных окружения. (Разработано Stan Ulbrych в gh-148981.)
asyncio¶
Добавлен
TaskGroup.cancelдля возможности досрочного завершения группы задач, например, когда цель задач достигнута или их услуги больше не нужны. Ранее для этого требовался неинтуитивный шаблонный код, например, дополнительная задача, вызывающая пользовательское исключение, которое затем подавлялось при выходе из группы задач. (Разработано John Belmonte в gh-127214.)
base64¶
Добавлен параметр pad в
z85encode(). (Разработано Hauke Dämpfling в gh-143103.)Добавлен параметр padded в
b32encode(),b32decode(),b32hexencode(),b32hexdecode(),b64encode(),b64decode(),urlsafe_b64encode()иurlsafe_b64decode(). (Разработано Serhiy Storchaka в gh-73613.)Добавлен параметр wrapcol в
b16encode(),b32encode(),b32hexencode(),b64encode(),b85encode()иz85encode(). (Разработано Serhiy Storchaka в gh-143214 и gh-146431.)Добавлен параметр ignorechars в
b16decode(),b32decode(),b32hexdecode(),b64decode(),b85decode()иz85decode(). (Вклад Serhiy Storchaka в gh-144001 и gh-146431.)Добавлен параметр canonical в
b32decode(),b32hexdecode(),b64decode(),urlsafe_b64decode(),a85decode(),b85decode()иz85decode(), для отклонения кодировок с ненулевыми битами заполнения или другими неканоническими формами. (Вклад Gregory P. Smith в gh-146311.)
binascii¶
Добавлены функции для кодирования Base32:
(Вклад James Seo в gh-146192.)
Добавлены функции для кодирования Ascii85, Base85 и Z85:
(Вклад James Seo и Serhiy Storchaka в gh-101178.)
Добавлен параметр padded в
b2a_base32(),a2b_base32(),b2a_base64()иa2b_base64(). (Вклад Serhiy Storchaka в gh-73613.)Добавлен параметр wrapcol в
b2a_base64(). (Вклад Serhiy Storchaka в gh-143214.)Добавлен параметр alphabet в
b2a_base64()иa2b_base64(). (Вклад Serhiy Storchaka в gh-145980.)Добавлен параметр ignorechars в
a2b_hex(),unhexlify()иa2b_base64(). (Вклад Serhiy Storchaka в gh-144001 и gh-146431.)Добавлен параметр canonical в
a2b_base64(), для отклонения кодировок с ненулевыми битами заполнения. (Вклад Gregory P. Smith в gh-146311.)
calendar¶
Командной строки
calendarтекстовый вывод стал более цветным. Это можно настроить с помощью переменных окружения. (Вклад Hugo van Kemenade в gh-148352.)Командной строки
calendarHTML-вывод теперь принимает опцию «год-месяц»:python -m calendar -t html 2009 06. (Вклад Pål Grønås Drange в gh-140212.)Страницы календаря, создаваемые классом
calendar.HTMLCalendar, теперь поддерживают тёмный режим и были перенесены на стандарт HTML5 для улучшения доступности. (Вклад Jiahao Li и Hugo van Kemenade в gh-137634.)
collections¶
concurrent.futures¶
Улучшено сообщение об ошибке при внезапном завершении дочернего процесса в
concurrent.futures.ProcessPoolExecutor. Теперь результирующий traceback будет показывать PID и код выхода завершившегося процесса. (Вклад Jonathan Berg в gh-139486.)
contextlib¶
Добавлена поддержка произвольных дескрипторов
__enter__(),__exit__(),__aenter__()и__aexit__()вExitStackиcontextlib.AsyncExitStack, для согласованности с операторамиwithиasync with. (Вклад Serhiy Storchaka в gh-144386.)ContextDecoratorиAsyncContextDecorator(а следовательноcontextmanager()иasynccontextmanager(), используемые как декораторы) теперь распознают функции-генераторы, корутинные функции и асинхронные функции-генераторы и держат контекстный менеджер открытым на протяжении итерации или ожидания. Ранее контекстный менеджер закрывался сразу после создания объекта генератора или корутины. (Вклад Alex Grönholm & Gregory P. Smith в gh-125862.)
dataclasses¶
Аннотации для сгенерированных методов
__init__больше не включают внутренние имена типов.
dbm¶
Добавлены новые методы
reorganize()вdbm.dumbиdbm.sqlite3для восстановления неиспользуемого свободного пространства, ранее занятого удалёнными записями. (Вклад Andrea Oliveri в gh-134004.)
difflib¶
Введён необязательный параметр color в
difflib.unified_diff(), позволяющий цветной вывод, аналогичный git diff. Это можно настроить с помощью переменных окружения. (Вклад Douglas Thor в gh-133725.)Улучшен стиль HTML-страниц diff, создаваемых классом
difflib.HtmlDiff, и вывод перенесён на стандарт HTML5. (Вклад Jiahao Li в gh-134580.)
email¶
Генераторы электронной почты теперь вызывают ошибку, когда
EmailMessageне может быть точно свёрнут из-за не-ASCII адреса электронной почты (почтового ящика) в заголовке адреса. Варианты поддержки интернационализации адресов электронной почты (EAI) обсуждаются вEmailPolicy.utf8. (Вклад R David Murray и Mike Edmunds в gh-122540.)
faulthandler ¶
Добавлен параметр max_threads в
faulthandler.enable(),faulthandler.dump_traceback(),faulthandler.dump_traceback_later(), иfaulthandler.register(). (Автор: Eric Froemling в gh-149085.)
functools¶
singledispatchmethod()теперь поддерживает не-дескрипторные вызываемые объекты. (Автор: Serhiy Storchaka в gh-140873.)singledispatchmethod()теперь выполняет диспетчеризацию по второму аргументу, если он оборачивает обычный метод и вызывается как атрибут класса. (Автор: Bartosz Sławecki в gh-143535.)
gc¶
Python 3.14.0–3.14.4 поставлялся с новым инкрементальным сборщиком мусора. Однако из-за ряда сообщений о значительном потреблении памяти в производственных средах было решено вернуться к поколенческому GC из версии 3.13. Этот GC используется в Python 3.14.5 и новее, а также в Python 3.15.
hashlib¶
Гарантирует, что хэш-функции, которые должны быть всегда доступны, существуют как атрибуты
hashlib, даже если они не будут работать во время выполнения из-за отсутствия реализаций бэкенда. Например,hashlib.md5больше не будет вызыватьAttributeError, если OpenSSL недоступен, а Python был собран без поддержки MD5. (Автор: Bénédikt Tran в gh-136929.)
http.client¶
Новый параметр max_response_headers, передаваемый только по ключевому слову, добавлен в конструкторы
HTTPConnectionиHTTPSConnection. Этот параметр переопределяет максимальное количество разрешённых заголовков ответа по умолчанию. (Автор: Alexander Enrique Urieles Nieto в gh-131724.)
http.server¶
Логирование
BaseHTTPRequestHandler, используемое интерфейсом командной строки, по умолчанию выполняется с цветами. Это можно настраивать с помощью переменных среды. (Автор: Hugo van Kemenade в gh-146292.)Добавлены
default_content_typeи опция командной строки--content-type, позволяющие настраивать заголовокContent-Typeпо умолчанию для файлов с неизвестными расширениями. (Авторы: John Comeau и Hugo van Kemenade в gh-113471.)Добавлен новый именованный аргумент
extra_response_headersвSimpleHTTPRequestHandlerдля поддержки пользовательских заголовков в HTTP-ответах. (Автор: Anton I. Sipos в gh-135057.)Добавлена опция
-H/--headerв python -m http.server интерфейс командной строки для поддержки пользовательских заголовков в HTTP-ответах. (Автор: Anton I. Sipos в gh-135057.)
importlib.metadata¶
Ранее при обращении к каталогу метаданных дистрибутива, не содержащему файла метаданных,
metadata()иDistribution.metadata()возвращали пустой объектPackageMetadata, как если бы файл был, но пуст. Теперь выбрасывается исключениеMetadataNotFound. См. importlib_metadata#493 для контекста и обоснования, а также gh-143387 для обоснования вопросов совместимости. (Автор: Jason R. Coombs.)
inspect¶
json¶
Добавлен параметр array_hook в функции
load()иloads(): он позволяет задать колбэк для типов литералов массивов JSON, чтобы настраивать списки Python в результирующем декодированном объекте. Передача комбинированногоfrozendictв параметр object_pairs_hook иtupleвarray_hookдаст глубоко вложенную неизменяемую структуру Python, представляющую данные JSON. (Автор: Joao S. O. Bueno в gh-146440.)
locale¶
setlocale()теперь поддерживает языковые коды с модификаторами@. Модификаторы@больше не отбрасываются молча вgetlocale(), а включаются в языковой код. (Автор: Serhiy Storchaka в gh-137729.)Отмена устаревания функции
locale.getdefaultlocale(). (Автор: Victor Stinner в gh-130796.)
math¶
Добавлены функции
math.isnormal()иmath.issubnormal(). (Автор: Sergey B Kirpichev в gh-132908.)Добавлены функции
math.fmax(),math.fmin()иmath.signbit(). (Автор: Bénédikt Tran в gh-135853.)
mimetypes¶
Добавлено больше MIME-типов. (Авторы: Benedikt Johannes, Charlie Lin, Foolbar, Gil Forcada и John Franey в gh-144217, gh-145720, gh-140937, gh-139959, gh-145698, gh-145718, gh-145918 и gh-144213.)
Переименован
application/x-texinfoвapplication/texinfo. (Автор: Charlie Lin в gh-140165.)Изменён MIME-тип для файлов
.aiнаapplication/pdf. (Автор: Stan Ulbrych в gh-141239.)
mmap¶
mmap.mmapтеперь имеет параметр trackfd в Windows; если он равенFalse, дескриптор файла, соответствующий fileno, не будет дублироваться. (Предложено Serhiy Storchaka в gh-78502.)Добавлен метод
mmap.mmap.set_name()для аннотирования анонимного отображения памяти, если ядро Linux поддерживает PR_SET_VMA_ANON_NAME (Linux 5.17 или новее). (Предложено Donghee Na в gh-142419.)
os¶
Добавлена
os.statx()в ядре Linux версий 4.11 и новее с glibc версий 2.28 и новее. (Предложено Jeffrey Bosboom и Victor Stinner в gh-83714.)Функция
os.makedirs()теперь имеет параметр parent_mode, который позволяет задавать режим для промежуточных каталогов. Это можно использовать для воспроизведения поведения Python 3.6 и более ранних версий, передавparent_mode=mode. (Предложено Zackery Spytz и Gregory P. Smith в gh-86533.)
os.path¶
Добавлена поддержка режима «все, кроме последнего» в
realpath(). (Предложено Serhiy Storchaka в gh-71189.)Параметр strict в
os.path.realpath()принимает новое значение,os.path.ALLOW_MISSING. При его использовании ошибки, отличные отFileNotFoundError, будут возбуждаться повторно; результирующий путь может отсутствовать, но будет свободен от символических ссылок. (Предложено Petr Viktorin для CVE 2025-4517.)
pdb¶
pickle¶
Добавлена поддержка сериализации закрытых методов и вложенных классов. (Предложено Zackery Spytz и Serhiy Storchaka в gh-77188.)
pickletools¶
Вывод интерфейса командной строки
pickletoolsпо умолчанию раскрашен. Это можно настроить с помощью переменных окружения. (Предложено Hugo van Kemenade в gh-149026.)
pprint¶
Добавлен именованный аргумент expand для
pprint.pprint(),pprint.pformat(),pprint.pp(). Если он истинен, вывод будет форматироваться аналогично pretty-printedjson.dumps(), когда указан indent. (Предложено Stefan Todoran, Semyon Moroz и Hugo van Kemenade в gh-112632.)Добавлена поддержка t-строк в
pprint. (Предложено Loïc Simon и Hugo van Kemenade в gh-134551.)
re¶
re.prefixmatch()и соответствующийre.Pattern.prefixmatch()были добавлены как альтернативные, более явные имена для существующих и теперь мягко устаревшихre.match()иre.Pattern.match()API. Они предназначены для устранения путаницы относительно того, что означает match, следуя мантре Дзена Python «Явное лучше неявного». Большинство других библиотек регулярных выражений используют API с именем match для обозначения того, что в Python всегда называлось search. (Предложено Gregory P. Smith в gh-86519.)
resource¶
Добавлены новые константы:
RLIMIT_NTHR,RLIMIT_UMTXP,RLIMIT_THREADS,RLIM_SAVED_CURиRLIM_SAVED_MAX. (Предложено Serhiy Storchaka в gh-137512.)
shelve¶
Добавлен новый метод
reorganize()кshelve, используемый для восстановления неиспользуемого свободного пространства, ранее занятого удалёнными записями. (Предложено Andrea Oliveri в gh-134004.)Добавлена поддержка пользовательских функций сериализации и десериализации в модуле
shelve. (Предложено Furkan Onder в gh-99631.)
shutil¶
shutil.copyfile()теперь также вызываетSpecialFileErrorдля сокетов и файлов устройств. (Предложено Savannah Ostrowski в gh-142693.)
socket¶
Добавлены константы для протокола ISO-TP CAN. (Предложено Patrick Menschel и Stefan Tatschner в gh-86819.)
sqlite3¶
У интерфейса командной строки есть несколько новых возможностей:
Автодополнение ключевых слов SQL по <tab>. (Предложено Long Tan в gh-133393.)
Приглашения, сообщения об ошибках и справочный текст теперь раскрашены. Эта функция включена по умолчанию; подробнее см. Управление цветом. (Предложено Stan Ulbrych и Łukasz Langa в gh-133461.)
Автодополнение таблиц, индексов, триггеров, представлений, столбцов, функций и схем по <tab>. (Предложено Long Tan в gh-136101.)
ssl¶
Указывает через
ssl.HAS_PSK_TLS13, поддерживает ли модульssl«внешние PSK» в TLSv1.3, как описано в RFC 9258. (Автор: Will Childs-Klein в gh-133624.)Добавлены новые методы для управления группами, используемыми для согласования ключей SSL
ssl.SSLContext.set_groups()задаёт группы, разрешённые для согласования ключей, расширяя предыдущий методssl.SSLContext.set_ecdh_curve(). Этот новый API позволяет перечислять несколько групп и поддерживает группы с фиксированным полем и постквантовые группы в дополнение к кривым ECDH. Этот метод также можно использовать для управления тем, какие доли ключа отправляются при рукопожатии TLS.ssl.SSLSocket.group()возвращает группу, выбранную для согласования ключей на текущем соединении после завершения рукопожатия TLS. Этот вызов требует OpenSSL 3.2 или новее.ssl.SSLContext.get_groups()возвращает список всех доступных групп согласования ключей, совместимых с минимальной и максимальной версиями TLS, установленными в контексте. Этот вызов требует OpenSSL 3.5 или новее.
(Автор: Ron Frederick в gh-136306.)
Добавлен новый метод
ssl.SSLContext.set_ciphersuites()для установки шифров TLS 1.3. Для TLS 1.2 и старше следует продолжать использоватьssl.SSLContext.set_ciphers(). Оба вызова можно выполнять в одном контексте, и выбранный набор шифров будет зависеть от версии TLS, согласованной при установке соединения. (Автор: Ron Frederick в gh-137197.)Добавлены новые методы для управления алгоритмами подписи:
ssl.get_sigalgs()возвращает список всех доступных алгоритмов подписи TLS. Этот вызов требует OpenSSL 3.4 или новее.ssl.SSLContext.set_client_sigalgs()задаёт алгоритмы подписи, разрешённые для аутентификации клиента на основе сертификата.ssl.SSLContext.set_server_sigalgs()задаёт алгоритмы подписи, разрешённые для завершения рукопожатия TLS сервером.ssl.SSLSocket.client_sigalg()возвращает алгоритм подписи, выбранный для аутентификации клиента на текущем соединении. Этот вызов требует OpenSSL 3.5 или новее.ssl.SSLSocket.server_sigalg()возвращает алгоритм подписи, выбранный для завершения сервером рукопожатия TLS на текущем соединении. Этот вызов требует OpenSSL 3.5 или новее.
(Автор: Ron Frederick в gh-138252.)
подпроцесс¶subprocess
subprocess.Popen.wait(): еслиtimeoutне равноNoneи платформа поддерживает это, используется эффективный механизм, управляемый событиями, для ожидания завершения процесса:Linux >= 5.3 использует
os.pidfd_open()+select.poll().macOS и другие варианты BSD используют
select.kqueue()+KQ_FILTER_PROC+KQ_NOTE_EXIT.Windows продолжает использовать
WaitForSingleObject(без изменений).
Если ни один из этих механизмов недоступен, функция возвращается к tрадиционному циклу ожидания (неблокирующий вызов и короткие паузы). (Автор: Giampaolo Rodola в gh-83069.)
symtable¶
Добавлены методы
symtable.Function.get_cells()иsymtable.Symbol.is_cell(). (Автор: Yashp002 в gh-143504.)
sys¶
Добавлено пространство имён
sys.abi_infoдля улучшения доступа к информации об ABI. (Автор: Klaus Zimmermann в gh-137476.)
sys.monitoring¶
События другие (
PY_THROW,PY_UNWIND,RAISE,EXCEPTION_HANDLEDиRERAISE) теперь можно включать и отключать для каждого объекта кода. ВозвратDISABLEиз колбэка для одного из этих событий отключает событие для всего объекта кода (для текущего инструмента), а не вызывает исключениеValueError, как в предыдущих версиях. (Автор: Gabriele N. Tornetta в gh-146182.)
tarfile¶
data_filter()теперь нормализует цели символических ссылок для предотвращения атак с обходом пути. (Вклад Petr Viktorin в gh-127987 и CVE 2025-4138.)extractall()теперь пропускает исправление атрибутов каталога, если каталог был удалён или заменён файлом другого типа. (Вклад Petr Viktorin в gh-127987 и CVE 2024-12718.)extract()иextractall()теперь (повторно) применяют фильтр извлечения при замене ссылки (жёсткой или символической) копией другого члена архива, а также при исправлении атрибутов каталога. Первое вызывает новое исключениеLinkFallbackError. (Вклад Petr Viktorin для CVE 2025-4330 и CVE 2024-12718.)extract()иextractall()больше не извлекают отклонённые элементы, когдаerrorlevel()равно нулю. (Вклад Matt Prodani и Petr Viktorin в gh-112887 и CVE 2025-4435.)extract()иextractall()теперь заменяют косые черты на обратные косые черты в целях символических ссылок в Windows, чтобы предотвратить создание повреждённых ссылок. (Автор: Christoph Walcher в gh-57911.)
threading¶
Добавлены
serialize_iterator,synchronized_iterator()иconcurrent_tee()для поддержки конкурентного доступа к генераторам и итераторам. (Автор: Raymond Hettinger в gh-124397.)
timeit¶
Вывод интерфейса командной строки
timeitпо умолчанию цветной. Это можно контролировать с помощью переменных окружения. (Автор: Hugo van Kemenade в gh-146609.)Интерфейс командной строки теперь по умолчанию раскрашивает трассировки ошибок. Это можно настроить с помощью переменных окружения. (Автор: Yi Hong в gh-139374.)
Сделать целевое время
timeit.Timer.autorange()настраиваемым и добавить опцию--target-timeв интерфейс командной строки. (Автор: Alessandro Cucci и Miikka Koskinen в gh-80642.)
tkinter¶
Метод
tkinter.Text.search()теперь поддерживает два дополнительных аргумента: nolinestop, позволяющий продолжать поиск через границы строк; и strictlimits, ограничивающий поиск заданным диапазоном. (Автор: Rihaan Meher в gh-130848.)Был добавлен новый метод
tkinter.Text.search_all(). Этот метод позволяет искать все совпадения с шаблоном с использованием опций-allи-overlapTcl. (Автор: Rihaan Meher в gh-130848.)Добавлены новые методы
pack_content(),place_content()иgrid_content(), которые используют новые имена команд Tk (представленные в Tk 8.6) вместо методов*_slaves(), использующих устаревшие имена. (Автор: Serhiy Storchaka в gh-143754.)Добавлены атрибуты
Event:user_dataдля виртуальных событий Tk иdetailдля событийEnter,Leave,FocusIn,FocusOutиConfigureRequest. (Автор: Matthias Kievernagel и Serhiy Storchaka в gh-47655.)
tokenize¶
Вывод
tokenizeинтерфейса командной строки по умолчанию раскрашивается. Это можно настроить с помощью переменных окружения. (Автор: Hugo van Kemenade в gh-148991.)
tomllib¶
Модуль
tomllibтеперь поддерживает TOML 1.1.0. Это обновление обратно совместимо, то есть все корректные документы TOML 1.0.0 разбираются так же, как и раньше.Изменения, согласно официальному журналу изменений TOML:
Разрешены переводы строк и конечные запятые во встроенных таблицах.
Раньше встроенная таблица должна была быть в одной строке и не могла заканчиваться конечной запятой. Теперь это ограничение снято, так что следующее допустимо:
tbl = { key = "a string", moar-tbl = { key = 1, }, }
Добавлена нотация
\xHHдля базовых строк для кодовых точек ниже 255, и управляющая последовательность\eдля символа экранирования:null = "null byte: \x00; letter a: \x61" csi = "\e["
Секунды в значениях даты-времени и времени теперь необязательны. Следующие теперь допустимы:
dt = 2010-02-03 14:15 t = 14:15
(Автор: Taneli Hukkinen в gh-142956.)
types¶
Предоставлен прокси-тип с сквозной записью
locals()какtypes.FrameLocalsProxyType. Он представляет тип атрибутаframe.f_locals, как описано в PEP 667.
typing¶
PEP 747: Добавлено
TypeForm, новая специальная форма для аннотирования значений, которые сами являются выражениями типов.TypeForm[T]означает «объект формы типа, описывающийT(или тип, присваиваемыйT)». Во время выполненияTypeForm(x)просто возвращаетx, что позволяет явно аннотировать значения формы типа без изменения поведения.Это помогает библиотекам, которые принимают предоставленные пользователем выражения типов (например, классы
int,str | None,TypedDictилиlist[int]), предоставлять точные сигнатуры:from typing import Any, TypeForm def cast[T](typ: TypeForm[T], value: Any) -> T: ...
(Автор: Jelle Zijlstra в gh-145033.)
PEP 728: Добавлена поддержка в
TypedDictдля аргументов класса closed и extra_items. ЗакрытыйTypedDictне допускает дополнительных ключей, кроме указанных в теле класса, в то время какTypedDictсextra_itemsдопускает произвольные дополнительные элементы, значения которых относятся к указанному типу. (Автор: Angela Liss в gh-137840.)Код вида
class ExtraTypeVars(P1[S], Protocol[T, T2]): ...теперь вызываетTypeError, потому чтоSне указан в параметрахProtocol. (Автор: Nikita Sobolev в gh-137191.)Код вида
class B2(A[T2], Protocol[T1, T2]): ...теперь корректно обрабатывает порядок параметров типа: это(T1, T2), а не(T2, T1), как ранее ошибочно определялось во время выполнения. (Автор: Nikita Sobolev в gh-137191.)PEP 800: Добавлен
@typing.disjoint_base, новый декоратор, помечающий класс как непересекающуюся базу. Это расширенная возможность, предназначенная в первую очередь для того, чтобы проверяющие типы могли точно отражать семантику времени выполнения типов, определённых как встроенные или в скомпилированных расширениях. Если классCявляется непересекающейся базой, то дочерние классы этого класса не могут наследовать от других непересекающихся баз, которые не являются родительскими или дочерними классамиC. (Автор: Jelle Zijlstra в gh-148639.)TypeVarTupleтеперь принимает именованные аргументыbound,covariant,contravariantиinfer_variance, соответствующие интерфейсуTypeVarиParamSpec. Семантикаboundостаётся неопределённой в спецификации.
unicodedata¶
База данных Unicode обновлена до версии 17.0.0.
Добавлены функции
unicodedata.isxidstart()иunicodedata.isxidcontinue()для проверки, может ли символ начинать или продолжать идентификатор в соответствии с Приложением №31 к Стандарту Unicode. (Автор: Stan Ulbrych в gh-129117.)Добавлена функция
iter_graphemes()для перебора графемных кластеров в соответствии с правилами, определёнными в Приложении №29 к Стандарту Unicode, «Сегментация текста Unicode». Добавлены функцииgrapheme_cluster_break(),indic_conjunct_break()иextended_pictographic()для получения свойств символа, связанных с указанным алгоритмом. (Автор: Serhiy Storchaka и Guillaume Sanchez в gh-74902.)Добавлена функция
block(), возвращающая блок Юникода для заданного символа. (Автор: Stan Ulbrych в gh-66802.)
unittest¶
unittest.TestCase.assertLogs()теперь принимает форматтер для управления форматированием сообщений. (Автор: Garry Cairns в gh-134567.)unittest.TestCase.assertWarns()иunittest.TestCase.assertWarnsRegex()больше не подавляют предупреждения, не соответствующие указанной категории или регулярному выражению. Теперь поддерживаются вложенные менеджеры контекста. (Автор: Serhiy Storchaka в gh-143231.)
urllib.parse¶
Добавлен параметр missing_as_none в функции
urlsplit(),urlparse()иurldefrag(). Добавлен параметр keep_empty в функцииurlunsplit()иurlunparse(). Это позволяет различать пустые и неопределённые компоненты URI, а также сохранять пустые компоненты. (Автор: Serhiy Storchaka в gh-67041.)
venv¶
На платформах POSIX каталоги platlib будут создаваться при необходимости во время создания виртуальных окружений, вместо использования символической ссылки
lib64 -> lib. Это означает, что purelib и platlib виртуальных окружений больше не используют общий каталогlibна платформах, гдеsys.platlibdirне равноlib. (Автор: Rui Xi в gh-133951.)
warnings¶
Улучшена фильтрация по модулю в
warnings.warn_explicit(), если не передан аргумент module. Теперь регулярное выражение модуля в фильтре предупреждений проверяется не только на соответствие имени файла с удалённым.py, но и на соответствие именам модулей, построенным начиная с разных родительских каталогов файла (с удалёнными/__init__.py,.pyи, в Windows,.pyw). (Автор: Serhiy Storchaka в gh-135801.)
wave¶
Добавлена поддержка WAVE-аудио в формате IEEE с плавающей точкой (
WAVE_FORMAT_IEEE_FLOAT) вwave.Добавлены
wave.Wave_read.getformat(),wave.Wave_write.getformat(), иwave.Wave_write.setformat()для явной обработки формата кадров.wave.Wave_write.setparams()принимает как кортежи из 7 элементов, включающиеformat, так и кортежи из 6 элементов для обратной совместимости (по умолчаниюWAVE_FORMAT_PCM).Вывод
WAVE_FORMAT_IEEE_FLOATтеперь включает чанкfact, как требуется для не-PCM форматов WAVE.
(Авторы: Lionel Koenig и Michiel W. Beijen в gh-60729.)
webbrowser¶
На macOS новый класс
webbrowser.MacOSоткрывает URL через /usr/bin/open вместо создания и выполнения AppleScript через osascript. Браузер по умолчанию определяется из файла настроек LaunchServices с помощьюplistlib, сcom.apple.Safariв качестве запасного варианта на свежих установках. Для URL, отличных от HTTP(S), используется open -b <bundle-id>, чтобы направить URL через браузер, а не через обработчик файлов ОС, предотвращая атаки с внедрением файлов. (Автор: Jeff Lyon в gh-137586.)
xml¶
Добавлена функция
xml.is_valid_name()для проверки, может ли строка использоваться как имя элемента или атрибута в XML. (Автор: Serhiy Storchaka в gh-139489.)Добавлена функция
xml.is_valid_text(), позволяющая проверить, может ли строка использоваться в XML-документе. (Автор: Serhiy Storchaka в gh-139489.)
xml.parsers.expat¶
Добавлены
SetAllocTrackerActivationThreshold()иSetAllocTrackerMaximumAmplification()в объекты xmlparser для настройки защиты от непропорционально большого использования динамической памяти внутри парсера Expat. (Автор: Bénédikt Tran в gh-90949.)Добавлены
SetBillionLaughsAttackProtectionActivationThreshold()иSetBillionLaughsAttackProtectionMaximumAmplification()в объекты xmlparser для настройки защиты от атак «billion laughs». (Автор: Bénédikt Tran в gh-90949.)
zlib¶
Разрешено объединение двух контрольных сумм Adler-32 с помощью
adler32_combine(). (Авторы: Callum Attryde и Bénédikt Tran в gh-134635.)Разрешено объединение двух контрольных сумм CRC-32 с помощью
crc32_combine(). (Автор: Bénédikt Tran в gh-134635.)
Оптимизации¶Optimizations
mimallocтеперь используется в качестве распределителя по умолчанию для выделения сырой памяти, например черезPyMem_RawMalloc(), для повышения производительности на сборках со свободной многопоточностью. (Автор: Kumar Aditya в gh-144914.)
base64 & binascii¶
Базовая реализация base64 в CPython теперь кодирует в 2 раза быстрее и декодирует в 3 раза быстрее благодаря простым оптимизациям конвейеризации CPU. (Авторы: Gregory P. Smith и Serhiy Storchaka в gh-143262.)
Реализация кодирования Ascii85, Base85 и Z85 переписана на C. Кодирование и декодирование теперь на два порядка быстрее и потребляют на два порядка меньше памяти. (Авторы: James Seo и Serhiy Storchaka в gh-101178.)
Реализация Base32 переписана на C. Кодирование и декодирование теперь на два порядка быстрее. (Автор: James Seo в gh-146192.)
csv¶
csv.Sniffer.sniff()определение разделителя теперь работает до 1.6 раз быстрее. (Автор: Maurycy Pawłowski-Wieroński в gh-137628.)
Улучшенный JIT-компилятор¶Upgraded JIT compiler
Результаты набора тестов pyperformance
показывают
8-9%
среднее геометрическое улучшение производительности JIT по сравнению со стандартным интерпретатором CPython, собранным со всеми оптимизациями, на x86-64 Linux. На AArch64 macOS JIT имеет
12-13%
ускорение по сравнению с интерпретатором с хвостовыми вызовами
со всеми включёнными оптимизациями. Ускорение сборок с JIT относительно сборок без JIT варьируется от примерно 15% замедления до более чем 100% ускорения (без учёта микробенчмарка unpack_sequence) на системах x86-64 Linux и AArch64 macOS.
Внимание
Основные улучшения JIT:
Основные улучшения JIT:
Новый интерфейс трассировки
Базовая регистровая аллокация в JIT
Больше оптимизаций JIT
More JIT optimizations
GDB and GNU
backtrace()unwinding supportУлучшенная генерация машинного кода
LLVM 21 build-time dependency
The 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 for all supported platforms. (Contributed by Savannah Ostrowski in gh-140973.)
A new tracing frontend
The 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. Support for Windows added by Mark Shannon in gh-141703.)
Basic register allocation in the JIT
A 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.)
More JIT optimizations
Теперь выполняется больше распространения констант. Это означает, что когда JIT-компилятор обнаруживает, что определённый пользовательский код приводит к константам, код может быть упрощён JIT. (Авторы: Ken Jin и Savannah Ostrowski в gh-132732.)
Счётчики ссылок избегаются везде, где это безопасно. Это в целом снижает стоимость большинства операций в Python. (Авторы: Ken Jin, Donghee Na, Zheao Li, Hai Zhu, Savannah Ostrowski, Reiden Ong, Noam Cohen, Tomas Roun, PuQing, Cajetan Rodrigues и Sacul в gh-134584.)
Отслеживая уникальные ссылки на объекты, оптимизатор JIT теперь может исключать обновления счётчика ссылок и выполнять операции на месте с int и float. (Авторы: Reiden Ong и Pieter Eendebak в gh-143414 и gh-146306.)
Поддержка раскрутки стека в GDB и GNU gh-131798
GDB and GNU backtrace() unwinding support
The 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 and
gh-149104.)
Better machine code generation
The 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 and gh-135905. Implementation for AArch64 contributed by Mark Shannon in gh-139855. Additional optimizations for AArch64 contributed by Mark Shannon and Diego Russo in gh-140683 and gh-142305.)
Maintainability
The 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 and Hai Zhu in gh-143421.)
Удалено¶Removed
ast¶
Конструкторы узлов AST теперь вызывают
TypeError, когда пропущен обязательный аргумент или передан именованный аргумент, не соответствующий полю узла AST. Ранее в этих случаях начиная с Python 3.13 вызывалосьDeprecationWarning. (Авторы: Brian Schubert и Jelle Zijlstra в gh-137600 и gh-105858.)
collections.abc¶
collections.abc.ByteStringудалён изcollections.abc.__all__.collections.abc.ByteStringустарел начиная с Python 3.12, и запланирован к удалению в Python 3.17.
ctypes¶
Удалена недокументированная функция
ctypes.SetPointerType(), которая была устаревшей начиная с Python 3.13. (Автор: Bénédikt Tran в gh-133866.)Изменены
_type_c_float_complex,c_double_complexиc_longdouble_complexсF,DиGнаZf,ZdиZgдля совместимости с numpy. (Автор: Victor Stinner в gh-148675.)
datetime¶
strptime()теперь возбуждаетValueError, если строка формата содержит%d(день месяца) без указания года. Это поведение устарело начиная с Python 3.13. (Авторы: Stan Ulbrych и Gregory P. Smith в gh-70647.)
glob¶
Удалены недокументированные функции
glob.glob0()иglob.glob1(), которые были устаревшими начиная с Python 3.13. Используйтеglob.glob()и передайте каталог в его аргумент root_dir. (Автор: Barney Gale в gh-137466.)
http.server¶
Удалены класс
CGIHTTPRequestHandlerи флаг--cgiиз интерфейса командной строки python -m http.server. Они были объявлены устаревшими в Python 3.13. (Автор: Bénédikt Tran в gh-133810.)
importlib.resources¶
Удалён устаревший параметр
packageиз функцииimportlib.resources.files(). (Автор: Semyon Moroz в gh-138044.)
pathlib¶
pathlib.Path.mkdir()теперь имеет параметр parent_mode, позволяющий указывать режим для промежуточных каталогов приparents=True. (Автор: Gregory P. Smith в gh-86533.)Удалено устаревшее
pathlib.PurePath.is_reserved(). Используйтеos.path.isreserved()для обнаружения зарезервированных путей в Windows. (Автор: Nikita Sobolev в gh-133875.)
platform¶
Удалена функция
platform.java_ver(), которая была устаревшей начиная с Python 3.13. (Автор: Alexey Makridenko в gh-133604.)
sre_*¶
Удалены модули
sre_compile,sre_constantsиsre_parse. (Автор: Stan Ulbrych в gh-135994.)
sysconfig¶
Удалён параметр check_home у
sysconfig.is_python_build(). (Автор: Filipe Laíns в gh-92897.)
threading¶
types¶
Удалён устаревший в PEP 626 начиная с Python 3.12
codeobject.co_lnotabизtypes.CodeType. (Автор: Nikita Sobolev в gh-134690.)
typing¶
typing.ByteStringудалён изtyping.__all__.typing.ByteStringустарел начиная с Python 3.9 и запланирован к удалению в Python 3.17.Недокументированный синтаксис именованных аргументов для создания классов
NamedTuple(например,Point = NamedTuple("Point", x=int, y=int)) больше не поддерживается. Используйте вместо него синтаксис на основе класса или функциональный синтаксис. (Автор: Bénédikt Tran в gh-133817.)Использование
TD = TypedDict("TD")илиTD = TypedDict("TD", None)для создания типаTypedDictс нулевым количеством полей больше не поддерживается. Используйтеclass TD(TypedDict): passилиTD = TypedDict("TD", {})вместо этого. (Автор: Bénédikt Tran в gh-133823.)Устаревшее
@typing.no_type_check_decoratorудалено. (Автор: Nikita Sobolev в gh-133601.)
wave¶
Удалены методы
getmark(),setmark()иgetmarkers()классовWave_readиWave_write, которые были устаревшими начиная с Python 3.13. (Автор: Bénédikt Tran в gh-133873.)
zipimport¶
Удалено устаревшее
zipimport.zipimporter.load_module(). Вместо него используйтеzipimport.zipimporter.exec_module(). (Автор: Jiahao Li в gh-133656.)
Устарело¶Deprecated
Новые устаревания¶New deprecations
-
Принятие символов
+и/с альтернативным алфавитом вb64decode()иurlsafe_b64decode()теперь устарело. В будущих версиях Python они будут вызывать ошибку в строгом режиме и отбрасываться в нестрогом режиме. (Автор: Serhiy Storchaka в gh-125346.)
CLI:
Устарели параметры командной строки
-bи-bbи запланированы к превращению в заглушки в Python 3.17. Они были в основном помощниками для перехода с Python 2 на 3. Начиная с Python 3.17,BytesWarningне будет вызываться для этих случаев; вместо этого используйте средство проверки типов.(Автор: Nikita Sobolev в gh-136355.)
-
Следующие инструкции теперь вызывают выдачу
DeprecationWarningво время выполнения:from collections.abc import ByteStringimport collections.abc; collections.abc.ByteString.
DeprecationWarningуже выдавались, еслиcollections.abc.ByteStringбыл подклассом или использовался в качестве второго аргумента дляisinstance()илиissubclass(), но предупреждения ранее не выдавались, если он просто импортировался или получался из модуляcollections.abc.
-
В конструкторах хеш-функций, таких как
new()или прямых конструкторах с именем хеша, таких какmd5()иsha256(), необязательный параметр начальных данных мог также передаваться как именованный аргумент с именемdata=илиstring=в различных реализацияхhashlib.Поддержка имени именованного аргумента
stringтеперь устарела и запланирована к удалению в Python 3.19. Предпочтительнее передавать начальные данные как позиционный аргумент для максимальной обратной совместимости.(Автор: Bénédikt Tran в gh-134978.)
-
Morsel.js_outputиBaseCookie.js_outputустарели и будут удалены в Python 3.19. ИспользуйтеMorsel.outputилиBaseCookie.outputвместо. (Автор: kishorhange111 в gh-148849.)
-
Изменение
IMAP4.fileтеперь устарело и запланировано к удалению в Python 3.19. Это свойство теперь не используется, и изменение его значения не закрывает текущий файл явно.
re:re.match()иre.Pattern.match()теперь мягко устарели в пользу новых APIre.prefixmatch()иre.Pattern.prefixmatch(), которые были добавлены как альтернативные, более явные имена. Они предназначены для устранения путаницы относительно того, что означает match, следуя мантре Дзена Python «Явное лучше неявного». Большинство других библиотек регулярных выражений используют API с именем match для обозначения того, что в Python всегда называлось search.Мы не планируем удалять старое имя
match(), так как оно используется в коде более 30 лет. Код, поддерживающий старые версии Python, должен продолжать использоватьmatch(), а в новом коде следует предпочитатьprefixmatch(). См. prefixmatch() vs. match().(Авторы: Gregory P. Smith, gh-86519, и Hugo van Kemenade, gh-148100.)
-
Вызов
Struct.__new__()без обязательного аргумента теперь устарел и будет удален в Python 3.20. Вызов метода__init__()на инициализированном объектеStructустарел и будет удален в Python 3.20.(Вклад: Sergey B Kirpichev и Serhiy Storchaka в gh-143715.)
Использование кодов типов
'F'и'D'теперь мягко устарели в пользу двухбуквенных форм'Zf'и'Zd'. (Автор: Sergey B Kirpichev в gh-121249.)
-
Следующие инструкции теперь вызывают выдачу
DeprecationWarningво время выполнения:from typing import ByteStringimport typing; typing.ByteString.
DeprecationWarningуже выдавались, еслиtyping.ByteStringбыл подклассом или использовался в качестве второго аргумента дляisinstance()илиissubclass(), но предупреждения ранее не выдавались, если он просто импортировался или получался из модуляtyping.
-
webbrowser.MacOSXOSAScriptустарел в пользуwebbrowser.MacOSи запланирован к удалению в Python 3.17. (Автор: Jeff Lyon в gh-137586.)
__version__Атрибуты
__version__,versionиVERSIONбыли объявлены устаревшими в этих модулях стандартной библиотеки и будут удалены в Python 3.20. Вместо них используйтеsys.version_info.ctypes.macholibdecimal(используйтеdecimal.SPEC_VERSIONвместо)logging(__date__также устарел)xml.sax.expatreader
(Вклад: Hugo van Kemenade и Stan Ulbrych в gh-76007.)
Запланировано к удалению в Python 3.16¶Pending removal in Python 3.16
Система импорта:
Установка
__loader__в модуле при отсутствии__spec__.loaderустарела. В Python 3.16__loader__перестанет устанавливаться или учитываться системой импорта или стандартной библиотекой.Установка
__package__в модуле при отсутствии__spec__.parentустарела. В Python 3.16__package__перестанет устанавливаться или учитываться системой импорта или стандартной библиотекой. (gh-97879)
Встроенная копия
libmpdec.-
Код формата
'u'(wchar_t) устарел в документации начиная с Python 3.3 и во время выполнения начиная с Python 3.13. Используйте код формата'w'(Py_UCS4) для символов Unicode.
-
asyncio.iscoroutinefunction()устарело и будет удалено в Python 3.16; используйтеinspect.iscoroutinefunction()вместо этого. (Предложено Jiahao Li и Kumar Aditya в gh-122875.)Система политик
asyncioустарела и будет удалена в Python 3.16. В частности, следующие классы и функции устарели:asyncio.AbstractEventLoopPolicyasyncio.DefaultEventLoopPolicyasyncio.WindowsSelectorEventLoopPolicyasyncio.WindowsProactorEventLoopPolicyasyncio.get_event_loop_policy()asyncio.set_event_loop_policy()
Для использования нужной реализации цикла событий следует применять
asyncio.run()илиasyncio.Runnerс параметром loop_factory.Например, чтобы использовать
asyncio.SelectorEventLoopв Windows:import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Предложено Kumar Aditya в gh-127949.)
-
Поразрядная инверсия для булевых типов,
~Trueили~Falseустарела начиная с Python 3.12, поскольку даёт неожиданные и неинтуитивные результаты (-2и-1). Используйтеnot xдля логического отрицания булевого значения. В редких случаях, когда требуется поразрядная инверсия базового целого числа, явно преобразуйте вint(~int(x)).
-
Вызов реализации
functools.reduce()на Python с function или sequence в качестве именованных аргументов устарел начиная с Python 3.14.
-
Поддержка пользовательских обработчиков логирования с аргументом strm устарела и запланирована к удалению в Python 3.16. Вместо этого определяйте обработчики с аргументом stream. (Предложено Mariusz Felisiak в gh-115032.)
-
Допустимые расширения начинаются с точки ‘.’ или пусты для
mimetypes.MimeTypes.add_type(). Расширения без точки устарели и будут вызыватьValueErrorв Python 3.16. (Предложено Hugo van Kemenade в gh-75223.)
-
Исключение
ExecErrorустарело начиная с Python 3.14. Оно не используется ни одной функцией вshutilначиная с Python 3.4 и теперь является псевдонимомRuntimeError.
-
Метод
symtable.Class.get_methods()устарел начиная с Python 3.14.
sys:Функция
_enablelegacywindowsfsencoding()устарела начиная с Python 3.13. Используйте переменную окруженияPYTHONLEGACYWINDOWSFSENCODING.
-
Функция
sysconfig.expand_makefile_vars()устарела начиная с Python 3.14. Используйте аргументvarsизsysconfig.get_paths().
-
Недокументированный и неиспользуемый атрибут
TarInfo.tarfileустарел начиная с Python 3.13.
Запланировано к удалению в Python 3.17¶Pending removal in Python 3.17
-
strptime()вызовы со строкой формата, содержащей%e(день месяца) без указания года. Это объявлено устаревшим начиная с Python 3.15. (Автор: Stan Ulbrych в gh-70647.)
-
collections.abc.ByteStringзапланирован к удалению в Python 3.17.Используйте
isinstance(obj, collections.abc.Buffer)для проверки, реализует лиobjпротокол буфера во время выполнения. Для использования в аннотациях типов используйтеBufferили объединение, которое явно указывает типы, поддерживаемые вашим кодом (например,bytes | bytearray | memoryview).ByteStringизначально задумывался как абстрактный класс, который должен был служить супертипом как дляbytes, так и дляbytearray. Однако, поскольку у ABC никогда не было методов, знание того, что объект является экземпляромByteString, никогда не давало полезной информации об объекте. Другие распространённые типы буферов, такие какmemoryview, также никогда не рассматривались как подтипыByteString(ни во время выполнения, ни статическими проверками типов).См. PEP 688 для получения подробностей. (Автор: Shantanu Jain в gh-91896.)
-
Передача кодировок, не являющихся ASCII, в
encodings.normalize_encoding()объявлена устаревшей и запланирована к удалению в Python 3.17. (Автор: Stan Ulbrych в gh-136702.)
-
webbrowser.MacOSXOSAScriptобъявлен устаревшим в пользуwebbrowser.MacOS. (gh-137586)
-
До Python 3.14 старые объединения реализовывались с помощью приватного класса
typing._UnionGenericAlias. Этот класс больше не нужен для реализации, но он сохранён для обратной совместимости, его удаление запланировано на Python 3.17. Пользователям следует использовать документированные вспомогательные средства интроспекции, такие какtyping.get_origin()иtyping.get_args(), вместо того чтобы полагаться на детали приватной реализации.typing.ByteString, устаревший с Python 3.9, запланирован к удалению в Python 3.17.Используйте
isinstance(obj, collections.abc.Buffer)для проверки, реализует лиobjпротокол буфера во время выполнения. Для использования в аннотациях типов используйтеBufferили объединение, которое явно указывает типы, поддерживаемые вашим кодом (например,bytes | bytearray | memoryview).ByteStringизначально задумывался как абстрактный класс, который должен был служить супертипом как дляbytes, так и дляbytearray. Однако, поскольку у ABC никогда не было методов, знание того, что объект является экземпляромByteString, никогда не давало полезной информации об объекте. Другие распространённые типы буферов, такие какmemoryview, также никогда не рассматривались как подтипыByteString(ни во время выполнения, ни статическими проверками типов).См. PEP 688 для получения подробностей. (Автор: Shantanu Jain в gh-91896.)
-
Методы
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.)
Запланировано удаление в Python 3.18¶Pending removal in Python 3.18
Запланировано к удалению в Python 3.19¶Pending removal in Python 3.19
-
В конструкторах хеш-функций, таких как
new(), или прямых конструкторах, названных по имени хеша, таких какmd5()иsha256(), их необязательный параметр начальных данных мог также передаваться как именованный аргумент с именемdata=илиstring=в различных реализацияхhashlib.Поддержка имени именованного аргумента
stringтеперь устарела и будет удалена в Python 3.19.До Python 3.13 именованный параметр
stringне поддерживался правильно в зависимости от реализации хеш-функций на стороне бэкенда. Предпочтительно передавать начальные данные как позиционный аргумент для максимальной обратной совместимости.
-
http.cookies.Morsel.js_output()устарело и будет удалено в Python 3.19.http.cookies.BaseCookie.js_output()устарело и будет удалено в Python 3.19.
-
Изменение
IMAP4.fileтеперь устарело и будет удалено в Python 3.19. Это свойство теперь не используется, и изменение его значения не приводит к автоматическому закрытию текущего файла.До Python 3.14 это свойство использовалось для реализации соответствующих методов
read()иreadline()дляIMAP4, но с тех пор это уже не так.
Ожидается удаление в Python 3.20¶Pending removal in Python 3.20
Вызов метода
__new__()объектаstruct.Structбез аргумента format устарел и будет удалён в Python 3.20. Вызов__init__()метода для инициализированных объектовStructустарел и будет удалён в Python 3.20.(Вклад: Sergey B Kirpichev и Serhiy Storchaka в gh-143715.)
Атрибуты
__version__,versionиVERSIONбыли объявлены устаревшими в этих модулях стандартной библиотеки и будут удалены в Python 3.20. Вместо них используйтеsys.version_info.ctypes.macholibdecimal(используйтеdecimal.SPEC_VERSIONвместо)logging(__date__также устарел)xml.sax.expatreader
(Вклад: Hugo van Kemenade и Stan Ulbrych в gh-76007.)
Устаревшие элементы, определённые PEP 829:
Предупреждения выводятся для строк
import, найденных вname.pthфайлах.Файлы
name.pthбольше не декодируются в кодировке локали по умолчанию. Они ДОЛЖНЫ быть закодированы вutf-8-sig.
(Вклад: Barry Warsaw в gh-148641.)
ast:Создание экземпляров абстрактных узлов AST (таких как
ast.ASTилиast.expr) устарело и будет вызывать ошибку в Python 3.20.
Ожидается удаление в Python 3.21¶Pending removal in Python 3.21
-
Мягко устаревшие с Python 3.3
abc.abstractclassmethod,abc.abstractstaticmethodиabc.abstractpropertyтеперь вызываютDeprecationWarning. Эти классы будут удалены в Python 3.21, вместо них используйтеabc.abstractmethod()сclassmethod(),staticmethod()иpropertyсоответственно.
ast:Классы
slice,Index,ExtSlice,Suite,Param,AugLoadиAugStoreбудут удалены в Python 3.21. Эти типы не создаются синтаксическим анализатором и не принимаются генератором кода.Свойство
dimsобъектаast.Tupleбудет удалено в Python 3.21. Используйте свойствоast.Tuple.eltsвместо него.
-
Мягко устаревшие с Python 3.15, коды типов
'F'и'D'теперь устарели. Эти коды будут удалены в Python 3.21. Используйте вместо них двухбуквенные формы'Zf'и'Zd'.
-
tempfile._TemporaryFileWrapperбудет удалён в Python 3.21. Используйте публичныйtempfile.TemporaryFileWrapperвместо него.
Будет удалено в будущих версиях¶Pending removal in future versions
Следующие API будут удалены в будущем, хотя на данный момент нет запланированной даты их удаления.
-
Вложение групп аргументов и вложение взаимоисключающих групп устарело.
Передача недокументированного именованного аргумента prefix_chars в
add_argument_group()теперь устарела.Конвертер типов
argparse.FileTypeустарел.
-
Генераторы: сигнатура
throw(type, exc, tb)иathrow(type, exc, tb)устарела: используйтеthrow(exc)иathrow(exc)вместо неё, сигнатуру с одним аргументом.В настоящее время Python принимает числовые литералы, за которыми сразу следуют ключевые слова, например
0in x,1or x,0if 1else 2. Это допускает запутанные и неоднозначные выражения вроде[0x1for x in y](которое может быть интерпретировано как[0x1 for x in y]или[0x1f or x in y]). Выдаётся предупреждение синтаксиса, если за числовым литералом сразу следует одно из ключевых словand,else,for,if,in,isиor. В будущем выпуске это будет изменено на синтаксическую ошибку. (gh-87999)Поддержка методов
__index__()и__int__(), возвращающих не-int тип: эти методы должны будут возвращать экземпляр строгого подклассаint.Поддержка метода
__float__(), возвращающего строгий подклассfloat: эти методы должны будут возвращать экземплярfloat.Поддержка метода
__complex__(), возвращающего строгий подклассcomplex: эти методы должны будут возвращать экземплярcomplex.Передача комплексного числа в качестве аргумента real или imag в конструкторе
complex()теперь устарела; его следует передавать только как единственный позиционный аргумент. (Автор: Сергей Сторчака в gh-109218.)
calendar: константыcalendar.Januaryиcalendar.Februaryустарели и заменены наcalendar.JANUARYиcalendar.FEBRUARY. (Автор: Prince Roshan в gh-103636.)codecs: используйтеopen()вместоcodecs.open(). (gh-133038)codeobject.co_lnotab: используйте методcodeobject.co_lines()вместо этого.-
utcnow(): используйтеdatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): используйтеdatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: значение множественного числа должно быть целым числом.-
cache_from_source(): параметр debug_override устарел: используйте параметр optimization вместо него.
-
EntryPoints: интерфейс кортежа.Неявное
Noneдля возвращаемых значений.
logging: методwarn()устарел начиная с Python 3.3, используйтеwarning()вместо него.mailbox: использование StringIO в режиме ввода и текстовом режиме устарело, используйте BytesIO и двоичный режим.os: вызовos.register_at_fork()в многопоточном процессе.os.path:os.path.commonprefix()устарела, используйтеos.path.commonpath()для префиксов путей. Функцияos.path.commonprefix()объявлена устаревшей из-за вводящего в заблуждение названия и модуля. Эта функция небезопасна для использования в качестве префиксов путей, несмотря на то что находится в модуле для работы с путями, что означает, что легко случайно внести уязвимости обхода путей в программы на Python, используя эту функцию.pydoc.ErrorDuringImport: кортежное значение для параметра exc_info устарело, используйте экземпляр исключения.re: теперь применяются более строгие правила для числовых ссылок на группы и имён групп в регулярных выражениях. В качестве числовой ссылки теперь принимается только последовательность цифр ASCII. Имя группы в байтовых шаблонах и строках замены теперь может содержать только буквы ASCII, цифры и знак подчёркивания. (Автор: Сергей Сторчака в gh-91760.)shutil: параметр onerror методаrmtree()устарел в Python 3.12; используйте параметр onexc вместо него.ssl: опции и протоколы:ssl.SSLContextбез аргумента протокол устарело.ssl.SSLContext:set_npn_protocols()иselected_npn_protocol()устарели: используйте ALPN вместо них.ssl.OP_NO_SSL*: опцииssl.OP_NO_TLS*: опцииssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threading: методыthreading.Condition.notifyAll(): используйтеnotify_all().threading.Event.isSet(): используйтеis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): используйте атрибутthreading.Thread.daemon.threading.Thread.getName(),threading.Thread.setName(): используйте атрибутthreading.Thread.name.threading.currentThread(): используйтеthreading.current_thread().threading.activeCount(): используйтеthreading.active_count().
Внутренний класс
typing._UnionGenericAliasбольше не используется для реализацииtyping.Union. Для сохранения совместимости с пользователями, использующими этот закрытый класс, будет предоставлена прослойка совместимости как минимум до Python 3.17. (Автор: Jelle Zijlstra, gh-105499.)unittest.IsolatedAsyncioTestCase: возврат значения, не являющегосяNone, из тестового примера устарел.urllib.parseустаревшие функции: используйтеurlparse()вместо них.splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()не должна выполнять частичную запись.xml.etree.ElementTree: проверка истинностного значенияElementустарела. В будущем выпуске она всегда будет возвращатьTrue. Вместо этого используйте явные проверкиlen(elem)илиelem is not None.sys._clear_type_cache()устарело: используйтеsys._clear_internal_caches()вместо него.
Мягкие устаревания¶Soft deprecations
Планов по удалению мягко устаревших API нет.
re.match()иre.Pattern.match()теперь мягко устарели в пользу новых APIre.prefixmatch()иre.Pattern.prefixmatch(), которые были добавлены как альтернативные, более явные имена. Они предназначены для устранения путаницы относительно того, что означает match, следуя мантре Дзена Python «Явное лучше неявного». Большинство других библиотек регулярных выражений используют API с именем match для обозначения того, что в Python всегда называлось search.Мы не планируем удалять старое имя
match(), так как оно используется в коде более 30 лет. Код, поддерживающий старые версии Python, должен продолжать использоватьmatch(), а в новом коде следует предпочитатьprefixmatch(). См. prefixmatch() vs. match().(Авторы: Gregory P. Smith, gh-86519, и Hugo van Kemenade, gh-148100.)
Изменения C API¶C API changes
Новые возможности¶New features
Добавлены функции
PyArg_ParseArray()иPyArg_ParseArrayAndKeywords()для разбора аргументов функций, использующих соглашение о вызовеMETH_FASTCALL. (Автор: Victor Stinner в gh-144175.)Добавлены следующие функции для нового типа
frozendict:(Автор: Victor Stinner в gh-141510.)
Добавлена функция
PyObject_CallFinalizerFromDealloc()в ограниченный C API. (Автор: Victor Stinner в gh-146063.)Добавлены функции
PySys_GetAttr(),PySys_GetAttrString(),PySys_GetOptionalAttr()иPySys_GetOptionalAttrString()в качестве замены дляPySys_GetObject(). (Автор: Serhiy Storchaka в gh-108512.)Добавлена
PyUnstable_Unicode_GET_CACHED_HASHдля получения кешированного хеша строки. См. документацию по ограничениям. (Автор: Petr Viktorin в gh-131510.)Добавлен API для проверки совместимости ABI модулей расширения:
Py_mod_abi,PyABIInfo_Check()иPyABIInfo_VAR. (Автор: Petr Viktorin в gh-137210.)
Реализован PEP 782, API PyBytesWriter. Добавлены функции:
(Автор: Victor Stinner в gh-129813.)
PyCriticalSectionи связанные функции добавлены в стабильный ABI.(Вклад в gh-149227.)
Добавлен новый
PyImport_CreateModuleFromInitfunc()C-API для создания модуля из спецификации и функции инициализации. (Автор: Itamar Oren в gh-116146.)Добавлена
PyTuple_FromArray()для созданияtupleиз массива. (Автор: Victor Stinner в gh-111489.)Добавлен новый хук экспорта модуля,
PyModExport_*.Добавлены функции, гарантированно безопасные для использования в обработчиках
tp_traverse:PyObject_GetTypeData_DuringGC(),PyObject_GetItemData_DuringGC(),PyType_GetModuleState_DuringGC(),PyModule_GetState_DuringGC(),PyModule_GetToken_DuringGC(),PyType_GetBaseByToken_DuringGC(),PyType_GetModule_DuringGC(),PyType_GetModuleByToken_DuringGC(). (Автор: Petr Viktorin в gh-145925.)Добавлена
PyObject_Dump()для дампа объекта вstderr. Её следует использовать только для отладки. (Автор: Victor Stinner в gh-141070.)Реализован PEP 820:
PySlot– унифицированная система слотов для C API. См. Definition slots для документации.Добавлено:
Структура
PySlot;функция
PyType_FromSlots();новые идентификаторы слотов:
Py_slot_end,Py_slot_invalid;Py_slot_subslots,Py_tp_slots,Py_mod_slots;Py_tp_name,Py_tp_basicsize,Py_tp_extra_basicsize,Py_tp_itemsize,Py_tp_flags,Py_tp_metaclass,Py_tp_module;удобные макросы:
PySlot_DATA,PySlot_FUNC,PySlot_SIZE,PySlot_INT64,PySlot_UINT64,PySlot_STATIC_DATA,PySlot_END,PySlot_PTR,PySlot_PTR_STATIC.
Функция
PyModule_FromSlotsAndSpec()иPyModExportхук экспорта модуля также используют новую структуруPySlot.Следующие функции помечены как мягко устаревшие:
Слоты
Py_tp_basesиPy_tp_baseтеперь эквивалентны: их можно установить как на один тип, так и на кортеж типов. СлотPy_tp_basesпредпочтительнее; другой игнорируется, если указаны оба.(Автор: Petr Viktorin в gh-149044.)
Добавлены функции
PyUnstable_ThreadState_SetStackProtection()иPyUnstable_ThreadState_ResetStackProtection()для установки базового адреса защиты стека и размера защиты стека состояния потока Python. (Автор: Victor Stinner в gh-139653.)Добавлена
PyUnstable_SetImmortal()функция C API для пометки объектов как бессмертных. (Автор: Kumar Aditya в gh-143300.)Восстановлена частная промежуточная
_Py_InitializeMain()функция, удалённая в Python 3.14. (Автор: Victor Stinner в gh-142417.)Добавлены функции
PyUnstable_DumpTraceback()иPyUnstable_DumpTracebackThreads()для вывода Python стек-трейсов. (Автор: Alex Malyshev в gh-145559.)
Изменённые C API¶Changed C APIs
Если установлен флаг
Py_TPFLAGS_MANAGED_DICTилиPy_TPFLAGS_MANAGED_WEAKREF, тоPy_TPFLAGS_HAVE_GCтакже должен быть установлен. (Автор: Sergey Miryanov в gh-134786.)PyDateTime_IMPORTтеперь потокобезопасен. Код, который напрямую проверяетPyDateTimeAPIнаNULL, следует обновить, чтобы вместо этого вызыватьPyDateTime_IMPORT. (Автор: Kumar Aditya в gh-141563.)
Удалённые C API¶Removed C APIs
Удалены устаревшие
PyUnicodeфункции:PyUnicode_AsDecodedObject(): Вместо этого используйтеPyCodec_Decode().PyUnicode_AsDecodedUnicode(): ИспользуйтеPyCodec_Decode()вместо неё; обратите внимание, что некоторые кодеки (например, «base64») могут возвращать тип, отличный отstr, напримерbytes.PyUnicode_AsEncodedObject(): Вместо этого используйтеPyCodec_Encode().PyUnicode_AsEncodedUnicode(): ИспользуйтеPyCodec_Encode()вместо него; обратите внимание, что некоторые кодеки (например, «base64») могут возвращать тип, отличный отbytes, напримерstr.
(Автор: Stan Ulbrych в gh-133612.)
PyImport_ImportModuleNoBlock(): устаревший псевдонимPyImport_ImportModule(). (Автор: Bénédikt Tran в gh-133644.)PyWeakref_GetObject()иPyWeakref_GET_OBJECT: используйтеPyWeakref_GetRef()вместо них. Проект pythoncapi-compat можно использовать для полученияPyWeakref_GetRef()на Python 3.12 и старше. (Автор: Bénédikt Tran в gh-133644.)Удалён устаревший
PySys_ResetWarnOptions(). Вместо этого очищайтеsys.warnoptionsиwarnings.filters.(Автор: Nikita Sobolev в gh-138886.)
Следующие функции удалены в пользу PyConfig_Get().
Проект pythoncapi-compat можно использовать для получения PyConfig_Get()
на Python 3.13 и старше.
Функции инициализации Python:
Py_GetExecPrefix(): используйтеPyConfig_Get("base_exec_prefix")(sys.base_exec_prefix) вместо неё. ИспользуйтеPyConfig_Get("exec_prefix")(sys.exec_prefix), если необходимо обрабатывать виртуальные окружения.Py_GetPath(): используйтеPyConfig_Get("module_search_paths")(sys.path) вместо него.Py_GetPrefix(): вместо этого используйтеPyConfig_Get("base_prefix")(sys.base_prefix). ИспользуйтеPyConfig_Get("prefix")(sys.prefix), если требуется работа с виртуальными окружениями.Py_GetProgramFullPath(): вместо этого используйтеPyConfig_Get("executable")(sys.executable).Py_GetProgramName(): вместо этого используйтеPyConfig_Get("executable")(sys.executable).Py_GetPythonHome(): вместо этого используйтеPyConfig_Get("home")или переменную окруженияPYTHONHOME.
(Автор: Bénédikt Tran в gh-133644.)
Устаревшие C API¶Deprecated C APIs
Устарела поддержка PEP 456 для предоставления внешнего определения схемы хеширования строк. Удаление запланировано на Python 3.19.
Ранее разработчики встраиваемых приложений могли определить
Py_HASH_ALGORITHMкакPy_HASH_EXTERNAL, чтобы указать, что схема хеширования предоставляется извне, но эта возможность была недокументированной, непроверенной и, скорее всего, неиспользуемой.(Автор: Bénédikt Tran в gh-141226.)
Для форматов беззнаковых целых чисел в
PyArg_ParseTuple()теперь объявлено устаревшим принятие целых чисел Python, значение которых больше максимального значения для типа C или меньше минимального значения для соответствующего знакового целого типа того же размера. (Автор: Serhiy Storchaka в gh-132629.)PyBytes_FromStringAndSize(NULL, len)и_PyBytes_Resize()мягко устарели; вместо них используйте APIPyBytesWriter. (Автор: Victor Stinner в gh-129813.)_PyObject_CallMethodId(),_PyObject_GetAttrId()и_PyUnicode_FromId()устарели с версии 3.15 и будут удалены в 3.20. Вместо этого используйтеPyUnicode_InternFromString()и кешируйте результат в состоянии модуля, затем вызывайтеPyObject_CallMethod()илиPyObject_GetAttr(). (Предложено Виктором Стиннером в gh-141049.)Устарело поле
cvalтипаPyComplexObject. ИспользуйтеPyComplex_AsCComplex()иPyComplex_FromCComplex()для преобразования комплексного числа Python в/из представления CPy_complex. (Автор: Sergey B Kirpichev в gh-128813.)Функции
_Py_c_sum(),_Py_c_diff(),_Py_c_neg(),_Py_c_prod(),_Py_c_quot(),_Py_c_pow()и_Py_c_abs()мягко устарели. (Автор: Sergey B Kirpichev в gh-128813.)bytes_warningустарело начиная с версии 3.15 и будет удалено в версии 3.17. (Автор: Nikita Sobolev в gh-136355.)Макрос
Py_INFINITYмягко устарел; используйте стандарт C11<math.h>INFINITY. (Автор: Sergey B Kirpichev в gh-141004.)Следующие макросы мягко устарели:
Py_ALIGNED: вместо этого используйтеalignas.PY_FORMAT_SIZE_T: используйте непосредственно"z".PY_LONG_LONG,PY_LLONG_MIN,PY_LLONG_MAX,PY_ULLONG_MAX,PY_INT32_T,PY_UINT32_T,PY_INT64_T,PY_UINT64_T,PY_SIZE_MAX: используйте типы/пределы C99.Py_UNICODE_SIZE: используйте непосредственноsizeof(wchar_t).Py_VA_COPY: используйте непосредственноva_copy.
Макрос
Py_UNICODE_WIDE, который планировался к удалению, теперь мягко устарел.(Автор: Petr Viktorin в gh-146175.)
Py_MATH_ElиPy_MATH_PIlустарели начиная с версии 3.15 и будут удалены в версии 3.20. (Автор: Sergey B Kirpichev в gh-141004.)
Изменения в сборке¶Build changes
Удалён неявный откат к встроенной копии библиотеки
libmpdec. Теперь эта возможность должна быть явно включена с помощью--with-system-libmpdec, установленного вno, или с помощью--without-system-libmpdec. (Автор: Sergey B Kirpichev в gh-115119.)Новая опция configure
--with-missing-stdlib-config=FILEпозволяет дистрибьюторам передавать JSON-файл конфигурации, содержащий пользовательские сообщения об ошибках для модулей стандартной библиотеки, которые отсутствуют или упакованы отдельно. (Автор: Stan Ulbrych и Petr Viktorin в gh-139707.)Новая опция configure
--with-pymalloc-hugepagesвключает поддержку больших страниц для арен pymalloc. При включении размер арены увеличивается до 2 МиБ, а выделение используетMAP_HUGETLB(Linux) илиMEM_LARGE_PAGES(Windows) с автоматическим откатом к обычным страницам. В Windows используйтеbuild.bat --pymalloc-hugepages. Во время выполнения большие страницы должны быть явно включены установкой переменной окруженияPYTHON_PYMALLOC_HUGEPAGESв значение1.Теперь поддерживается аннотирование анонимного использования mmap, если ядро Linux поддерживает PR_SET_VMA_ANON_NAME (Linux 5.17 или новее). Аннотации видны в
/proc/<pid>/maps, если ядро поддерживает эту функцию и-X devпередаётся Python или Python собран в режиме отладки. (Автор: Donghee Na в gh-141770.)Теперь CPython собирается с включёнными по умолчанию указателями на кадры (PEP 831). Передайте
--without-frame-pointers, чтобы отказаться.Авторам C-расширений и нативных библиотек, собираемых с помощью пользовательских систем сборки, следует убедиться в целостности цепочки размотки (unwind chain). Обычно это делается путём добавления
-fno-omit-frame-pointerи подобных флагов вCFLAGS. Обратитесь к документации--without-frame-pointersдля получения информации о конкретных флагах, используемых Python.(Автор: Pablo Galindo Salgado и Savannah Ostrowski в gh-149201.)
64-разрядные сборки с использованием Visual Studio 2026 (MSVC 18) теперь могут использовать новый интерпретатор с хвостовыми вызовами. Результаты на Visual Studio 18.1.1 показывают ускорение 15-20% по среднему геометрическому pyperformance на Windows x86-64 по сравнению с интерпретатором на switch-case на AMD Ryzen 7 5800X. Мы наблюдали ускорение от 14% для крупных библиотек на чистом Python до 40% для долго работающих небольших скриптов на чистом Python в Windows. Это стало возможным благодаря новой возможности, представленной в MSVC 18, которую теперь используют официальные 64-разрядные двоичные файлы Windows на python.org. (Автор: Chris Eibl, Ken Jin и Brandt Bucher в gh-143068. Особая благодарность Steve Dower и команде MSVC, включая Hulon Jenkins.)
Перенос на Python 3.15¶Porting to Python 3.15
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
sqlite3.ConnectionAPI приведены в порядок.Все параметры
sqlite3.connect(), за исключением database, теперь являются только ключевыми.Первые три параметра методов
create_function()иcreate_aggregate()теперь являются только позиционными.Первый параметр методов
set_authorizer(),set_progress_handler()иset_trace_callback()теперь является только позиционным.
(Автор: Serhiy Storchaka в gh-133595.)
resource.RLIM_INFINITYтеперь всегда положителен. Передача отрицательного целого значения, которое соответствовало его старому значению (например,-1или-3, в зависимости от платформы), вresource.setrlimit()иresource.prlimit()теперь устарела. (Автор: Serhiy Storchaka в gh-137044.)mmap.mmap.resize()удалён на платформах, не поддерживающих нижележащий системный вызов, вместо того чтобы выбрасыватьSystemError.Теперь выдаётся предупреждение о ресурсах для незакрытого итератора
xml.etree.ElementTree.iterparse(), если он открыл файл. Для закрытия следует использовать его методclose()или контекстный менеджерcontextlib.closing(). (Автор: Osama Abdelkader и Serhiy Storchaka в gh-140601.)Если
argparse.ArgumentParser.add_argument()переданы короткая опция и длинная опция с одним дефисом, то dest теперь определяется по длинной опции с одним дефисом. Например, вadd_argument('-f', '-foo')dest теперь равен'foo'вместо'f'. Передайте явный аргумент dest, чтобы сохранить старое поведение. (Автор: Serhiy Storchaka в gh-138697.)Дополнение входных данных больше не требуется в
base64.urlsafe_b64decode(). Передайте новый аргументpadded=Trueили используйтеbase64.b64decode()с аргументомaltchars=b'-_'(это работает со старыми версиями Python), чтобы сделать дополнение обязательным. (Автор: Serhiy Storchaka в gh-73613.)Поскольку
unittest.TestCase.assertWarns()иunittest.TestCase.assertWarnsRegex()больше не проглатывают предупреждения, которые не соответствуют указанной категории или регулярному выражению, ваши тесты могут начать пропускать некоторые предупреждения, которые ранее маскировались. Используйте фильтры предупреждений, чтобы подавить их, или дополнительныеassertWarns*(), чтобы перехватывать и проверять их. (Автор: Serhiy Storchaka в gh-143231.)