Содержание страницы
Что нового в Python 3.14¶What’s new in Python 3.14
- Редакторы:
Adam Turner and Hugo van Kemenade
В этой статье описываются новые возможности Python 3.14 по сравнению с 3.13. Python 3.14 был выпущен 7 октября 2025 года. За подробностями обращайтесь к журналу изменений.
См. также
PEP 745 – График выпуска Python 3.14
Краткий обзор – Основные изменения¶Summary – Release highlights
Python 3.14 – последний стабильный выпуск языка Python, включающий разнообразные изменения в языке, реализации и стандартной библиотеке. Самые значительные изменения включают строковые шаблоны, отложенное вычисление аннотаций и поддержку субинтерпретаторов в стандартной библиотеке.
Изменения в библиотеке включают значительно улучшенные возможности интроспекции в asyncio, поддержку Zstandard через новый модуль compression.zstd, подсветку синтаксиса в REPL, а также обычные устаревания и удаления, и улучшения удобства использования и корректности.
Эта статья не ставит целью полное описание всех новых возможностей, а даёт удобный обзор. За полной информацией обращайтесь к документации, например, к Справочнику по библиотеке и Справочнику по языку. Чтобы понять полную реализацию и обоснование дизайна изменения, обратитесь к PEP соответствующей новой возможности; но учтите, что PEP обычно не обновляются после полной реализации возможности. Руководство по переходу с более ранних версий Python см. в разделе Перенос на Python 3.14.
Улучшения интерпретатора:
Новый тип интерпретатораA new type of interpreter
Улучшения в режиме свободных потоковFree-threaded mode improvements
Улучшенные сообщения об ошибкахImproved error messages
Инкрементальная сборка мусораIncremental garbage collection
Значительные улучшения в стандартной библиотеке:
Возможности интроспекции asyncioAsyncio introspection capabilities
Управление предупреждениями, безопасное для конкурентного доступаConcurrent safe warnings control
Подсветка синтаксиса в стандартной интерактивной оболочке и цветной вывод в нескольких стандартных интерфейсах командной строки
Улучшения C API:
Поддержка платформ:
PEP 776: Emscripten теперь является официально поддерживаемой платформой, на уровне 3.
Изменения в выпуске:
PEP 761: Подписи PGP больше не используются для официальных выпусков
Двоичные сборки для Windows и macOS теперь поддерживают экспериментальный JIT-компиляторWindows and macOS binary releases now support the experimental just-in-time compiler
Теперь предоставляются двоичные сборки для AndroidBinary releases for Android are now provided
Новые возможности¶New features
PEP 649 и PEP 749: Отложенное вычисление аннотаций¶PEP 649 & PEP 749: Deferred evaluation of annotations
Аннотации функций, классов и модулей больше не
вычисляются немедленно. Вместо этого аннотации сохраняются в специальных
функциях-аннотаторах и вычисляются только при
необходимости (за исключением случаев, когда используется from __future__ import annotations).
Это изменение призвано повысить производительность и удобство использования аннотаций в Python в большинстве случаев. Затраты во время выполнения на определение аннотаций сведены к минимуму, но по-прежнему можно просматривать аннотации во время выполнения. Больше не нужно заключать аннотации в строки, если они содержат прямые ссылки (forward references).
Новый модуль annotationlib предоставляет инструменты для просмотра отложенных
аннотаций. Аннотации могут вычисляться в формате VALUE
(который вычисляет аннотации до значений времени выполнения, аналогично поведению в
более ранних версиях Python), формате FORWARDREF
(который заменяет неопределённые имена специальными маркерами) и
формате STRING (который возвращает аннотации в виде строк).
В этом примере показано поведение этих форматов:
>>> from annotationlib import get_annotations, Format
>>> def func(arg: Undefined):
... pass
>>> get_annotations(func, format=Format.VALUE)
Traceback (most recent call last):
...
NameError: name 'Undefined' is not defined
>>> get_annotations(func, format=Format.FORWARDREF)
{'arg': ForwardRef('Undefined', owner=<function func at 0x...>)}
>>> get_annotations(func, format=Format.STRING)
{'arg': 'Undefined'}
Раздел портирования содержит рекомендации по изменениям, которые могут потребоваться в связи с этими изменениями, хотя в большинстве случаев код продолжит работать без изменений.
(Автор – Jelle Zijlstra, работа выполнена в PEP 749 и gh-119180; PEP 649 был написан Ларри Хастингсом.)
PEP 734: Несколько интерпретаторов в стандартной библиотеке¶PEP 734: Multiple interpreters in the standard library
Среда выполнения CPython поддерживает одновременный запуск нескольких копий Python в одном процессе уже более 20 лет. Каждая такая отдельная копия называется «интерпретатором». Однако эта возможность была доступна только через C-API.
Это ограничение снято в Python 3.14 с появлением нового модуля concurrent.interpreters.
Можно выделить как минимум две веские причины, почему использование нескольких интерпретаторов даёт значительные преимущества:
они поддерживают новую (для Python), удобную для человека модель конкурентности
настоящий многоядерный параллелизм
В некоторых случаях конкурентность в программном обеспечении повышает эффективность и может упростить архитектуру на высоком уровне. В то же время реализация и поддержка любой, кроме самой простой, конкурентности часто оказывается сложной задачей для человеческого мозга. Особенно это касается обычных потоков (например, threading), где вся память разделяется между всеми потоками.
С помощью нескольких изолированных интерпретаторов можно воспользоваться классом моделей конкурентности, такими как взаимодействующие последовательные процессы (CSP) или модель акторов, которые успешно применяются в других языках программирования, таких как Smalltalk, Erlang, Haskell и Go. Представляйте несколько интерпретаторов как потоки, но с общим доступом по желанию.
Что касается многоядерного параллелизма: начиная с Python 3.12, интерпретаторы стали достаточно изолированы друг от друга, чтобы их можно было использовать параллельно (см. PEP 684). Это открывает множество вариантов использования Python для задач с интенсивными вычислениями, которые ранее были ограничены GIL.
Использование нескольких интерпретаторов во многом похоже на multiprocessing тем, что оба подхода предоставляют изолированные логические «процессы», которые могут выполняться параллельно, без общего доступа по умолчанию. Однако при использовании нескольких интерпретаторов приложение будет потреблять меньше системных ресурсов и работать эффективнее (поскольку остаётся в рамках одного процесса). Представляйте несколько интерпретаторов как обладающих изоляцией процессов с эффективностью потоков.
Хотя эта возможность существует уже десятилетия, несколько интерпретаторов не использовались широко из-за низкой осведомлённости и отсутствия модуля в стандартной библиотеке. В результате у них сейчас есть несколько заметных ограничений, которые, как ожидается, значительно улучшатся теперь, когда возможность становится мейнстримом.
Текущие ограничения:
запуск каждого интерпретатора ещё не оптимизирован
каждый интерпретатор использует больше памяти, чем необходимо (продолжается работа над обширным внутренним разделением между интерпретаторами)
пока не так много вариантов пока для настоящего совместного использования объектов или других данных между интерпретаторами (кроме
memoryview)многие сторонние модули расширения на PyPI пока несовместимы с несколькими интерпретаторами (все модули расширения стандартной библиотеки совместимы)
подход к написанию приложений, использующих несколько изолированных интерпретаторов, пока в основном незнаком пользователям Python
Влияние этих ограничений будет зависеть от будущих улучшений CPython, того, как используются интерпретаторы, и от того, что сообщество решит с помощью пакетов PyPI. В зависимости от сценария использования ограничения могут не иметь большого значения, так что попробуйте!
Кроме того, будущие выпуски CPython снизят или устранят накладные расходы и предоставят утилиты, которые менее уместны на PyPI. А пока большинство ограничений можно решить с помощью модулей расширения, то есть пакеты PyPI могут заполнить любые пробелы для версии 3.14 и даже для версии 3.12, где интерпретаторы наконец-то были должным образом изолированы и перестали разделять GIL. Также ожидается появление библиотек на PyPI для высокоуровневых абстракций на основе интерпретаторов.
Что касается модулей расширения, ведётся работа по обновлению некоторых проектов на PyPI, а также таких инструментов, как Cython, pybind11, nanobind и PyO3. Шаги по изоляции модуля расширения описаны в Isolating Extension Modules. Изоляция модуля во многом пересекается с тем, что требуется для поддержки free-threading, поэтому текущая работа сообщества в этой области поможет ускорить поддержку нескольких интерпретаторов.
Также добавлено в 3.14: concurrent.futures.InterpreterPoolExecutor.
(Автор: Eric Snow в gh-134939.)
См. также
PEP 750: Шаблонные строковые литералы¶PEP 750: Template string literals
Шаблонные строки – это новый механизм для настраиваемой обработки строк. Они используют знакомый синтаксис f-строк, но, в отличие от f-строк, возвращают объект, представляющий статические и интерполированные части строки, вместо простого str.
Чтобы написать t-строку, используйте префикс 't' вместо 'f':
>>> variety = 'Stilton'
>>> template = t'Try some {variety} cheese!'
>>> type(template)
<class 'string.templatelib.Template'>
Объекты Template предоставляют доступ к статическим и интерполированным (в фигурных скобках) частям строки до их объединения. Перебирайте экземпляры Template, чтобы получить доступ к их частям по порядку:
>>> list(template)
['Try some ', Interpolation('Stilton', 'variety', None, ''), ' cheese!']
Легко написать (или вызвать) код для обработки экземпляров Template. Например, вот функция, которая приводит статические части к нижнему регистру, а экземпляры Interpolation к верхнему:
from string.templatelib import Interpolation
def lower_upper(template):
"""Отображать статические части в нижнем регистре, а подстановки – в верхнем."""
parts = []
for part in template:
if isinstance(part, Interpolation):
parts.append(str(part.value).upper())
else:
parts.append(part.lower())
return ''.join(parts)
name = 'Wenslydale'
template = t'Mister {name}'
assert lower_upper(template) == 'mister WENSLYDALE'
Поскольку экземпляры Template различают статические строки и интерполяции во время выполнения, они могут быть полезны для очистки пользовательского ввода. Написание функции html(), которая экранирует пользовательский ввод в HTML, оставляется читателю в качестве упражнения! Код обработки шаблонов может обеспечить повышенную гибкость. Например, более продвинутая функция html() могла бы принимать dict HTML-атрибутов непосредственно в шаблоне:
attributes = {'src': 'limburger.jpg', 'alt': 'lovely cheese'}
template = t'<img {attributes}>'
assert html(template) == '<img src="limburger.jpg" alt="lovely cheese" />'
Конечно, код обработки шаблонов не обязан возвращать строкоподобный результат. Ещё более продвинутая html() могла бы возвращать пользовательский тип, представляющий DOM-подобную структуру.
С появлением t-строк разработчики смогут писать системы, которые очищают SQL, выполняют безопасные операции с оболочкой, улучшают журналирование, реализуют современные идеи веб-разработки (HTML, CSS и так далее) и внедряют лёгкие пользовательские предметно-ориентированные языки (DSL) для бизнеса.
(Авторы: Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, и Pablo Galindo Salgado в gh-132661.)
См. также
PEP 768: Безопасный интерфейс внешнего отладчика¶PEP 768: Safe external debugger interface
Python 3.14 представляет безопасный интерфейс отладки с нулевой нагрузкой, который позволяет отладчикам и профилировщикам безопасно подключаться к выполняющимся процессам Python без их остановки или перезапуска. Это значительное улучшение возможностей отладки Python, означающее, что небезопасные альтернативы больше не требуются.
Новый интерфейс предоставляет безопасные точки выполнения для подключения кода отладчика без изменения обычного пути выполнения интерпретатора и без добавления какой-либо нагрузки во время выполнения. Благодаря этому инструменты теперь могут проверять и взаимодействовать с приложениями Python в реальном времени, что является критически важной возможностью для систем с высокой доступностью и производственных сред.
Для удобства этот интерфейс реализован в функции sys.remote_exec(). Например:
import sys
from tempfile import NamedTemporaryFile
with NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
script_path = f.name
f.write(f'import my_debugger; my_debugger.connect({os.getpid()})')
# Выполнить в процессе с PID 1234
print('Behold! An offering:')
sys.remote_exec(1234, script_path)
Эта функция позволяет отправлять код Python для выполнения в целевом процессе в следующей безопасной точке выполнения. Однако разработчики инструментов могут также реализовать протокол напрямую, как описано в PEP, где подробно описаны базовые механизмы, используемые для безопасного подключения к выполняющимся процессам.
Интерфейс отладки был тщательно спроектирован с учетом безопасности и включает несколько механизмов управления доступом:
Переменная окружения
PYTHON_DISABLE_REMOTE_DEBUG.Параметр командной строки
-X disable-remote-debug.Флаг конфигурации
--without-remote-debugдля полного отключения этой функции во время сборки.
(Авторы: Pablo Galindo Salgado, Matt Wozniski и Ivona Stojanovic в gh-131591.)
См. также
Новый тип интерпретатора¶A new type of interpreter
В CPython добавлен новый тип интерпретатора.
Он использует хвостовые вызовы между небольшими функциями на C, реализующими отдельные байткоды Python, вместо одного большого оператора case на C.
Для некоторых более новых компиляторов этот интерпретатор обеспечивает значительно более высокую производительность.
Предварительные тесты показывают среднее геометрическое ускорение на 3–5% по стандартному набору тестов pyperformance в зависимости от платформы и архитектуры.
За базовую точку взят Python 3.14, собранный с Clang 19, без этого нового интерпретатора.
В настоящее время этот интерпретатор работает только с Clang 19 и новее на архитектурах x86-64 и AArch64. Однако ожидается, что будущие релизы GCC также будут это поддерживать.
Эта функция пока включается по желанию.
При использовании нового интерпретатора настоятельно рекомендуется включить профильно-ориентированную оптимизацию, так как это единственная конфигурация, которая была протестирована и подтверждена для повышения производительности.
Дополнительную информацию см. в --with-tail-call-interp.
Примечание
Это не следует путать с оптимизацией хвостовых вызовов функций Python, которая в настоящее время не реализована в CPython.
Этот новый тип интерпретатора является внутренней деталью реализации интерпретатора CPython. Он вообще не меняет видимое поведение программ Python. Он может повысить их производительность, но не меняет ничего остального.
(Авторы: Ken Jin в gh-128563, идеи по реализации в CPython от Mark Shannon, Garrett Gu, Haoran Xu и Josh Haberman.)
Улучшения свободно-поточного режима¶Free-threaded mode improvements
Свободно-поточный режим CPython (PEP 703), изначально добавленный в версии 3.13, был значительно улучшен в Python 3.14. Реализация, описанная в PEP 703, завершена, включая изменения в C API, а временные обходные решения в интерпретаторе были заменены на более постоянные. Специализирующийся адаптивный интерпретатор (PEP 659) теперь включен в свободно-поточном режиме, что наряду со многими другими оптимизациями значительно повышает его производительность. Штраф по производительности для однопоточного кода в свободно-поточном режиме теперь составляет примерно 5–10% в зависимости от платформы и используемого компилятора C.
Начиная с Python 3.14, при компиляции модулей расширения для свободно-поточной сборки CPython в Windows, переменная препроцессора Py_GIL_DISABLED теперь должна указываться сборочным бэкендом, так как она больше не будет определяться автоматически компилятором C.
Для выполняющегося интерпретатора параметр, использовавшийся во время компиляции, можно найти с помощью sysconfig.get_config_var().
Новый флаг -X context_aware_warnings управляет тем, включена ли защита предупреждений о параллельном доступе.
По умолчанию флаг равен true для свободно-поточной сборки и false для сборки с GIL.
Добавлен новый флаг thread_inherit_context, который, если включен, означает, что потоки, созданные с помощью threading.Thread, запускаются с копией Context() вызывающего start().
Наиболее важно, это делает контекст фильтрации предупреждений, установленный с помощью catch_warnings, «наследуемым» потоками (или задачами asyncio), запущенными в этом контексте.
Это также влияет на другие модули, использующие контекстные переменные, такие как менеджер контекста decimal.
По умолчанию этот флаг равен true для свободно-поточной сборки и false для сборки с GIL.
(Авторы: Sam Gross, Matt Page, Neil Schemenauer, Thomas Wouters, Donghee Na, Kirill Podoprigora, Ken Jin, Itamar Oren, Brett Simmers, Dino Viehland, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou, Kumar Aditya, Edgar Margffoy и многие другие. Некоторые из этих авторов работают в Meta, которая продолжает предоставлять значительные инженерные ресурсы для поддержки этого проекта.)
Улучшенные сообщения об ошибках¶Improved error messages
Теперь интерпретатор предлагает полезные подсказки, когда обнаруживает опечатки в ключевых словах Python. Если встречается слово, похожее на ключевое слово Python, интерпретатор предложит правильное ключевое слово в сообщении об ошибке. Эта функция помогает программистам быстро находить и исправлять распространенные опечатки. Например:
>>> whille True: ... pass Traceback (most recent call last): File "<stdin>", line 1 whille True: ^^^^^^ SyntaxError: invalid syntax. Did you mean 'while'?
Хотя функция ориентирована на наиболее распространенные случаи, некоторые варианты опечаток могут по-прежнему приводить к обычным синтаксическим ошибкам. (Автор: Pablo Galindo в gh-132449.)
Операторы
elif, следующие за блокомelse, теперь имеют специальное сообщение об ошибке. (Автор: Steele Farnsworth в gh-129902.)>>> if who == "me": ... print("It's me!") ... else: ... print("It's not me!") ... elif who is None: ... print("Who is it?") File "<stdin>", line 5 elif who is None: ^^^^ SyntaxError: 'elif' block follows an 'else' block
Если оператор передается в условные выражения после
else, или один изpass,breakилиcontinueпередается передif, то в сообщении об ошибке подсвечивается, где требуетсяexpression. (Автор: Sergey Miryanov в gh-129515.)>>> x = 1 if True else pass Traceback (most recent call last): File "<string>", line 1 x = 1 if True else pass ^^^^ SyntaxError: expected expression after 'else', but statement is given >>> x = continue if True else break Traceback (most recent call last): File "<string>", line 1 x = continue if True else break ^^^^^^^^ SyntaxError: expected expression before 'if', but statement is given
Когда обнаруживаются неправильно закрытые строки, сообщение об ошибке предполагает, что строка, возможно, должна быть частью строки. (Автор: Pablo Galindo в gh-88535.)
>>> "The interesting object "The important object" is very important" Traceback (most recent call last): SyntaxError: invalid syntax. Is this intended to be part of the string?
Когда строки имеют несовместимые префиксы, сообщение об ошибке теперь показывает, какие префиксы несовместимы. (Автор: Nikita Sobolev в gh-133197.)
>>> ub'abc' File "<python-input-0>", line 1 ub'abc' ^^ SyntaxError: 'u' and 'b' prefixes are incompatible
Улучшены сообщения об ошибках при использовании
asс несовместимыми целями в:Импорты:
import ... as ...Импорты from:
from ... import ... as ...Обработчики исключений:
except ... as ...Варианты сопоставления с образцом:
case ... as ...
Улучшено сообщение об ошибке при попытке добавить экземпляр нехэшируемого типа в
dictилиset. (Авторы: CF Bolz-Tereick и Виктор Стиннер в gh-132828.)>>> s = set() >>> s.add({'pages': 12, 'grade': 'A'}) Traceback (most recent call last): File "<python-input-1>", line 1, in <module> s.add({'pages': 12, 'grade': 'A'}) ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: cannot use 'dict' as a set element (unhashable type: 'dict') >>> d = {} >>> l = [1, 2, 3] >>> d[l] = 12 Traceback (most recent call last): File "<python-input-4>", line 1, in <module> d[l] = 12 ~^^^ TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
Улучшено сообщение об ошибке, когда объект, поддерживающий синхронный протокол менеджера контекста, используется с
async withвместоwith, и наоборот для асинхронного протокола. (Автор: Бенедикт Тран в gh-128398.)
PEP 784: поддержка Zstandard в стандартной библиотеке¶PEP 784: Zstandard support in the standard library
Новый пакет compression содержит модули compression.lzma, compression.bz2, compression.gzip и compression.zlib, которые реэкспортируют модули lzma, bz2, gzip и zlib соответственно. Новые имена импорта в compression являются предпочтительными для импорта этих модулей сжатия, начиная с Python 3.14. Однако существующие имена модулей не были объявлены устаревшими. Любое объявление устаревшими или удаление существующих модулей сжатия произойдёт не ранее, чем через пять лет после выхода версии 3.14.
Новый модуль compression.zstd предоставляет API для сжатия и распаковки в формате Zstandard через привязки к библиотеке zstd от Meta. Zstandard – широко используемый, эффективный и быстрый формат сжатия. В дополнение к API, представленным в compression.zstd, поддержка чтения и записи архивов, сжатых Zstandard, была добавлена в модули tarfile, zipfile и shutil.
Вот пример использования нового модуля для сжатия данных:
from compression import zstd
import math
data = str(math.pi).encode() * 20
compressed = zstd.compress(data)
ratio = len(compressed) / len(data)
print(f"Achieved compression ratio of {ratio}")
Как видно, API аналогичен API модулей lzma и bz2.
(Авторы: Эмма Харпер Смит, Адам Тёрнер, Грегори П. Смит, Томас Роун, Виктор Стиннер и Рогдам в gh-132983.)
См. также
Возможности интроспекции asyncio¶Asyncio introspection capabilities
Добавлен новый интерфейс командной строки для просмотра работающих процессов Python с использованием асинхронных задач, доступный через python -m asyncio ps PID или python -m asyncio pstree PID.
Подкоманда ps проверяет указанный идентификатор процесса (PID) и отображает информацию о текущих запущенных задачах asyncio. Она выводит таблицу задач: плоский список всех задач, их имена, стеки корутин и информацию о том, какие задачи ожидают их.
Подкоманда pstree получает ту же информацию, но вместо этого отображает визуальное дерево асинхронных вызовов, показывая связи корутин в иерархическом формате. Эта команда особенно полезна для отладки долго выполняющихся или зависших асинхронных программ. Она помогает разработчикам быстро определить, где программа заблокирована, какие задачи ожидают выполнения и как корутины связаны между собой.
Например, для такого кода:
import asyncio
async def play_track(track):
await asyncio.sleep(5)
print(f'🎵 Finished: {track}')
async def play_album(name, tracks):
async with asyncio.TaskGroup() as tg:
for track in tracks:
tg.create_task(play_track(track), name=track)
async def main():
async with asyncio.TaskGroup() as tg:
tg.create_task(
play_album('Sundowning', ['TNDNBTG', 'Levitate']),
name='Sundowning')
tg.create_task(
play_album('TMBTE', ['DYWTYLM', 'Aqua Regia']),
name='TMBTE')
if __name__ == '__main__':
asyncio.run(main())
Запуск нового инструмента на работающем процессе выведет таблицу, подобную этой:
python -m asyncio ps 12345
tid task id task name coroutine stack awaiter chain awaiter name awaiter id
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1935500 0x7fc930c18050 Task-1 TaskGroup._aexit -> TaskGroup.__aexit__ -> main 0x0
1935500 0x7fc930c18230 Sundowning TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x7fc930c18050
1935500 0x7fc93173fa50 TMBTE TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x7fc930c18050
1935500 0x7fc93173fdf0 TNDNBTG sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x7fc930c18230
1935500 0x7fc930d32510 Levitate sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x7fc930c18230
1935500 0x7fc930d32890 DYWTYLM sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x7fc93173fa50
1935500 0x7fc93161ec30 Aqua Regia sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x7fc93173fa50
или дерево, подобное этому:
python -m asyncio pstree 12345
└── (T) Task-1
└── main example.py:13
└── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
└── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
├── (T) Sundowning
│ └── album example.py:8
│ └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
│ └── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
│ ├── (T) TNDNBTG
│ │ └── play example.py:4
│ │ └── sleep Lib/asyncio/tasks.py:702
│ └── (T) Levitate
│ └── play example.py:4
│ └── sleep Lib/asyncio/tasks.py:702
└── (T) TMBTE
└── album example.py:8
└── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
└── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
├── (T) DYWTYLM
│ └── play example.py:4
│ └── sleep Lib/asyncio/tasks.py:702
└── (T) Aqua Regia
└── play example.py:4
└── sleep Lib/asyncio/tasks.py:702
Если в графе async await обнаружен цикл (что может указывать на проблему в программе), инструмент выдаёт ошибку и перечисляет пути цикла, которые препятствуют построению дерева:
python -m asyncio pstree 12345
ERROR: await-graph contains cycles - cannot print a tree!
cycle: Task-2 → Task-3 → Task-2
(Авторы: Пабло Галиндо, Лукаш Ланга, Юрий Селиванов и Марта Гомес Масиас в gh-91048.)
Контроль предупреждений, безопасный для конкурентного доступа¶Concurrent safe warnings control
Менеджер контекста warnings.catch_warnings теперь опционально может использовать контекстную переменную для фильтров предупреждений. Это включается установкой флага context_aware_warnings либо с помощью опции командной строки -X, либо через переменную окружения. Это обеспечивает предсказуемое управление предупреждениями при использовании catch_warnings совместно с несколькими потоками или асинхронными задачами. По умолчанию флаг равен true для сборки со свободной многопоточностью и false для сборки с GIL.
(Авторы: Нил Шеменауэр и Кумар Адитья в gh-130010.)
Прочие изменения в языке¶Other language changes
Все кодовые страницы Windows теперь поддерживаются как кодеки 'cpXXX' в Windows. (Автор: Сергей Сторчака в gh-123803.)
Реализованы правила арифметики смешанного режима для действительных и комплексных чисел, как определено стандартом C, начиная с C99. (Автор: Сергей Б. Кирпичев в gh-69639.)
Теперь больше синтаксических ошибок обнаруживается независимо от оптимизации и опции командной строки
-O. Это включает запись в__debug__, неверное использованиеawaitи асинхронные включения вне асинхронных функций. Например,python -O -c 'assert (__debug__ := 1)'илиpython -O -c 'assert await 1'теперь приводят кSyntaxError. (Авторы: Ирит Катриэль и Йелле Зейлстра в gh-122245 и gh-121637.)При наследовании от чистого C-типа C-слоты для нового типа больше не заменяются обёрнутой версией при создании класса, если они не переопределены явно в подклассе. (Автор: Томаш Пытель в gh-132284.)
Встроенные¶Built-ins
Методы
bytes.fromhex()иbytearray.fromhex()теперь принимают ASCIIbytesи байтоподобные объекты. (Автор: Daniel Pope в gh-129349.)Добавлены методы класса
float.from_number()иcomplex.from_number()для преобразования числа в типfloatилиcomplexсоответственно. Они вызываютTypeError, если аргумент не является вещественным числом. (Автор: Serhiy Storchaka в gh-84978.)Поддержка символов подчёркивания и запятой в качестве разделителей разрядов в дробной части для типов представления чисел с плавающей запятой в новом стиле форматирования строк (с помощью
format()или f-строк). (Автор: Sergey B Kirpichev в gh-87790.)Функция
int()больше не делегирует вызов__trunc__(). Классы, которые хотят поддерживать преобразование вint(), должны реализовать либо__int__(), либо__index__(). (Автор: Mark Dickinson в gh-119743.)Функция
map()теперь имеет необязательный флаг strict, передаваемый только по ключу, как иzip(), для проверки, что все итерируемые объекты имеют одинаковую длину. (Автор: Wannes Boeykens в gh-119793.)Тип
memoryviewтеперь поддерживает индексацию, что делает его обобщённым типом. (Автор: Brian Schubert в gh-126012.)Использование
NotImplementedв логическом контексте теперь вызываетTypeError. Ранее, начиная с Python 3.9, это вызывалоDeprecationWarning. (Автор: Jelle Zijlstra в gh-118767.)Трёхаргументный
pow()теперь пытается вызвать__rpow__()при необходимости. Ранее он вызывался только в двухаргументномpow()и бинарном операторе возведения в степень. (Автор: Serhiy Storchaka в gh-130104.)Объекты
superтеперь являютсяcopyableиpickleable. (Автор: Serhiy Storchaka в gh-125767.)
Командная строка и окружение¶Command line and environment
Флаг времени импорта теперь может отслеживать модули, которые уже загружены («кэшированы»), с помощью нового
-X importtime=2. При импорте такого модуля времяselfиcumulativeзаменяются строкойcached.Значения выше
2для-X importtimeтеперь зарезервированы для будущего использования.(Авторы: Noah Kim и Adam Turner в gh-118655.)
Параметр командной строки
-cтеперь автоматически удаляет отступы у своего аргумента с кодом перед выполнением. Поведение автоматического удаления отступов повторяетtextwrap.dedent(). (Авторы: Jon Crall и Steven Sun в gh-103998.)-Jбольше не является зарезервированным флагом для Jython, и теперь не имеет особого значения. (Автор: Adam Turner в gh-133336.)
PEP 758: Разрешить выражения except и except* без скобок¶PEP 758: Allow except and except* expressions without brackets
Выражения except и except*
теперь позволяют опускать скобки при наличии нескольких типов исключений
и отсутствии предложения as.
Например:
try:
connect_to_server()
except TimeoutError, ConnectionRefusedError:
print('The network has ceased to be!')
(Авторы: Pablo Galindo и Brett Cannon в PEP 758 и gh-131831.)
PEP 765: Управление потоком в блоках finally¶PEP 765: Control flow in finally blocks
Компилятор теперь выдаёт SyntaxWarning, когда операторы return,
break или continue приводят к
выходу из блока finally.
Это изменение описано в PEP 765.
В ситуациях, когда это изменение неудобно (например, когда предупреждения избыточны из-за линтинга кода), можно использовать фильтр предупреждений, чтобы отключить все синтаксические предупреждения, добавив
ignore::SyntaxWarning в качестве фильтра. Это можно указать в сочетании
с фильтром, преобразующим другие предупреждения в ошибки (например, передав
-Werror -Wignore::SyntaxWarning в качестве параметров командной строки или установив
PYTHONWARNINGS=error,ignore::SyntaxWarning).
Обратите внимание, что применение такого фильтра во время выполнения с помощью модуля warnings
подавит предупреждение только в коде, который компилируется после настройки
фильтра. Код, скомпилированный до настройки фильтра (например, при импорте модуля), всё равно будет выдавать синтаксическое предупреждение.
(Автор: Irit Katriel в gh-130080.)
Сборка мусора¶Garbage collection
Начиная с Python 3.14.5:
Сборщик мусора (GC) изменился в Python 3.14.5.
Python 3.14.0–3.14.4 поставлялся с новым инкрементальным GC. Однако из-за ряда сообщений о значительном давлении на память в производственных средах он был возвращён обратно к поколенческому GC из 3.13. Этот GC теперь используется в Python 3.14.5 и более поздних версиях.
Ранее в Python 3.14.0–3.14.4:
Сборщик мусора циклов теперь инкрементальный. Это означает, что максимальное время пауз сокращается на порядок и более для больших куч.
Теперь есть только два поколения: молодое и старое.
Когда gc.collect() не вызывается напрямую,
GC вызывается немного реже. При вызове он
собирает молодое поколение и часть старого
поколения, вместо сбора одного или нескольких поколений.
Поведение gc.collect() немного меняется:
gc.collect(1): Выполняет инкремент сборки мусора, а не сборку поколения 1.Остальные вызовы
gc.collect()остаются без изменений.
(Автор: Mark Shannon в gh-108362.)
Интерактивная оболочка по умолчанию¶Default interactive shell
Интерактивная оболочка по умолчанию теперь подсвечивает синтаксис Python. Эта функция включена по умолчанию, за исключением случаев, когда задана
PYTHON_BASIC_REPLили любая другая переменная окружения, отключающая цвет. Подробнее см. Управление цветом.Цветовая тема по умолчанию для подсветки синтаксиса стремится к хорошему контрасту и использует исключительно стандартные 4-битные ANSI-коды цветов VGA для максимальной совместимости. Тему можно настроить с помощью экспериментального API
_colorize.set_theme(). Его можно вызвать в интерактивном режиме или в скриптеPYTHONSTARTUP. Обратите внимание: эта функция не имеет гарантий стабильности и может быть изменена или удалена.(Автор: Łukasz Langa в gh-131507.)
Интерактивная оболочка по умолчанию теперь поддерживает автодополнение импорта. Это означает, что при вводе
import coи нажатии <Tab> будут предлагаться модули, начинающиеся сco. Аналогично, при вводеfrom concurrent import iбудут предлагаться подмодулиconcurrent, начинающиеся сi. Обратите внимание: автодополнение атрибутов модулей пока не поддерживается. (Автор: Tomas Roun в gh-69605.)
Новые модули¶New modules
annotationlib: Для интроспекции аннотаций. Подробнее см. PEP 749. (Автор: Jelle Zijlstra в gh-119180.)compression(включаяcompression.zstd): Пакет для модулей, связанных со сжатием, включая новый модуль для поддержки формата сжатия Zstandard. Подробнее см. PEP 784. (Авторы: Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun, Victor Stinner и Rogdham в gh-132983.)concurrent.interpreters: Поддержка нескольких интерпретаторов в стандартной библиотеке. Подробнее см. PEP 734. (Автор: Eric Snow в gh-134939.)string.templatelib: Поддержка шаблонных строковых литералов (t-строк). Подробнее см. PEP 750. (Авторы: Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran и Pablo Galindo Salgado в gh-132661.)
Улучшенные модули¶Improved modules
argparse¶
Значение по умолчанию имени программы для
argparse.ArgumentParserтеперь отражает способ, которым интерпретатору Python было указано найти код модуля__main__. (Авторы: Serhiy Storchaka и Alyssa Coghlan в gh-66436.)Добавлен необязательный параметр suggest_on_error в
argparse.ArgumentParser, позволяющий предлагать варианты для выбора аргументов и имена подпарсеров при опечатке со стороны пользователя. (Автор: Savannah Ostrowski в gh-124456.)Включен цвет для текста справки; его можно отключить с помощью необязательного параметра color в
argparse.ArgumentParser. Это также можно контролировать через переменные окружения. (Автор: Hugo van Kemenade в gh-130645.)
ast¶
Добавлена
compare()– функция для сравнения двух AST. (Авторы: Batuhan Taskaya и Jeremy Hylton в gh-60191.)Добавлена поддержка
copy.replace()для узлов AST. (Автор: Bénédikt Tran в gh-121141.)Док-строки теперь удаляются из оптимизированного AST на уровне оптимизации 2. (Автор: Irit Katriel в gh-123958.)
Вывод
repr()для узлов AST теперь включает больше информации. (Автор: Tomas Roun в gh-116022.)При вызове с AST на входе функция
parse()теперь всегда проверяет, что тип корневого узла является подходящим. (Автор: Irit Katriel в gh-130139.)Добавлены новые опции в интерфейс командной строки:
--feature-version,--optimizeи--show-empty. (Автор: Semyon Moroz в gh-133367.)
asyncio¶
Функция и методы с именем
create_task()теперь принимают произвольный список именованных аргументов. Все именованные аргументы передаются конструкторуTaskили пользовательской фабрике задач. (Подробнее см.set_task_factory().) Именованные аргументыnameиcontextбольше не являются особенными; теперь имя следует задавать с помощью именованного аргументаnameфабрики, аcontextможет бытьNone.Это затрагивает следующие функции и методы:
asyncio.create_task(),asyncio.loop.create_task(),asyncio.TaskGroup.create_task().(Автор: Thomas Grainger в gh-128307.)
Добавлены две новые вспомогательные функции для интроспекции и печати графа вызовов программы:
capture_call_graph()иprint_call_graph(). Подробнее см. Возможности интроспекции asyncio. (Авторы: Yury Selivanov, Pablo Galindo Salgado и Łukasz Langa в gh-91048.)
calendar¶
По умолчанию сегодняшняя дата выделяется цветом в текстовом выводе командной строки
calendar. Это можно контролировать через переменные окружения. (Автор: Hugo van Kemenade в gh-128317.)
concurrent.futures¶
Добавлен новый класс исполнителя
InterpreterPoolExecutor, который предоставляет Python-коду несколько интерпретаторов Python в одном процессе (субинтерпретаторы). Он использует пул независимых интерпретаторов Python для асинхронного выполнения вызовов.Это отдельный модуль
interpreters, представленный в PEP 734. (Автор: Eric Snow, gh-124548.)
On Unix platforms other than macOS, ‘forkserver’ is now the default start method for
ProcessPoolExecutor(replacing ‘fork’). This change does not affect Windows or macOS, where ‘spawn’ remains the default start method.Если требуется несовместимый с потоками метод fork, его необходимо явно запросить, передав контекст мультипроцессинга mp_context в
ProcessPoolExecutor.См. ограничения forkserver для получения информации и отличий от метода fork, а также о том, как это изменение может повлиять на существующий код с изменяемыми глобальными разделяемыми переменными и/или разделяемыми объектами, которые не могут быть автоматически
pickled.(Автор: Gregory P. Smith, gh-84559.)
Добавлены два новых метода в
ProcessPoolExecutor:terminate_workers()иkill_workers()для завершения или принудительного завершения всех живых рабочих процессов в заданном пуле. (Автор: Charles Machalow, gh-130849.)Добавлен необязательный параметр buffersize в
Executor.mapдля ограничения количества переданных задач, результаты которых ещё не получены. Если буфер заполнен, итерация по итерируемым объектам приостанавливается, пока результат не будет получен из буфера. (Авторы: Enzo Bonnal и Josh Rosenberg, gh-74028.)
configparser¶
configparserбольше не будет записывать конфигурационные файлы, которые не может прочитать, для повышения безопасности. Попыткаwrite()ключей, содержащих разделители или начинающихся с шаблона заголовка раздела, вызоветInvalidWriteError. (Автор: Jacob Lincoln, gh-129270.)
contextvars¶
Поддержка протокола менеджера контекста для объектов
Token. (Автор: Andrew Svetlov, gh-129889.)
ctypes¶
Расположение битовых полей в объектах
StructureиUnionтеперь точнее соответствует настройкам платформы по умолчанию (GCC/Clang или MSVC). В частности, поля больше не перекрываются. (Автор: Matthias Görgens, gh-97702.)Атрибут класса
Structure._layout_теперь можно задавать для сопоставления с нестандартным ABI. (Автор: Petr Viktorin, gh-97702.)Класс дескрипторов полей
Structure/Unionтеперь доступен какCFieldи содержит новые атрибуты для упрощения отладки и интроспекции. (Автор: Petr Viktorin, gh-128715.)В Windows исключение
COMErrorтеперь является публичным. (Автор: Jun Komoda, gh-126686.)В Windows функция
CopyComPointer()теперь является публичной. (Автор: Jun Komoda, gh-127275.)Добавлена функция
memoryview_at()для создания объектаmemoryview, ссылающегося на переданный указатель и длину. Она работает какctypes.string_at(), но без копирования буфера, и обычно полезна при реализации чистых Python-колбэков, которым передаются буферы динамического размера. (Автор: Rian Hunter, gh-112018.)Комплексные типы
c_float_complex,c_double_complexиc_longdouble_complexтеперь доступны, если и компилятор, и библиотекаlibffiподдерживают комплексные типы C. (Автор: Sergey B Kirpichev, gh-61103.)Добавлена функция
ctypes.util.dllist()для вывода списка разделяемых библиотек, загруженных текущим процессом. (Автор: Brian Ward, gh-119349.)Кеш типов
ctypes.POINTER()перемещён из глобального внутреннего кеша (_pointer_type_cache) в атрибут_CData.__pointer_type__соответствующих типовctypes. Это предотвратит неограниченный рост кеша в некоторых ситуациях. (Автор: Sergey Miryanov, gh-100926.)Тип
py_objectтеперь поддерживает подписку, что делает его обобщённым типом. (Автор: Brian Schubert, gh-132168.)ctypesтеперь поддерживает сборки со свободной многопоточностью. (Авторы: Kumar Aditya и Peter Bierma, gh-127945.)
curses¶
Добавлена функция
assume_default_colors()– улучшенная версия функцииuse_default_colors(), которая позволяет изменять цветовую пару0. (Автор: Serhiy Storchaka, gh-133139.)
datetime¶
Добавлен метод
strptime()в классыdatetime.dateиdatetime.time. (Автор: Wannes Boeykens, gh-41431.)
decimal¶
Добавлен
Decimal.from_number()как альтернативный конструктор дляDecimal. (Автор: Serhiy Storchaka, gh-121798.)Предоставлен
IEEEContext()для поддержки создания контекстов, соответствующих десятичным форматам обмена IEEE 754 (2008). (Автор: Sergey B Kirpichev, gh-53032.)
difflib¶
dis¶
Добавлена поддержка отображения полной информации о местоположении в исходном коде для
instructions, а не только номера строки. Эта возможность добавлена в следующие интерфейсы через именованный аргумент show_positions:Эта возможность также доступна через
dis --show-positions. (Автор: Bénédikt Tran в gh-123165.)Добавлена опция командной строки
dis --specializedдля показа специализированного байт-кода. (Автор: Bénédikt Tran в gh-127413.)
errno¶
faulthandler¶
Добавлена поддержка печати C-стека на системах, которые поддерживают её с помощью новой функции
dump_c_stack()или через аргумент c_stack вfaulthandler.enable(). (Автор: Peter Bierma в gh-127604.)
fnmatch¶
Добавлена функция
filterfalse(), которая отклоняет имена, соответствующие заданному шаблону. (Автор: Bénédikt Tran в gh-74598.)
fractions¶
Объект
Fractionтеперь можно создать из любого объекта с методомas_integer_ratio(). (Автор: Serhiy Storchaka в gh-82017.)Добавлен
Fraction.from_number()в качестве альтернативного конструктора дляFraction. (Автор: Serhiy Storchaka в gh-121797.)
functools¶
Добавлен sentinel
Placeholder. Его можно использовать с функциямиpartial()илиpartialmethod(), чтобы зарезервировать место для позиционных аргументов в возвращаемом partial-объекте. (Автор: Dominykas Grigonis в gh-119127.)Разрешена передача параметра initial функции
reduce()в качестве именованного аргумента. (Автор: Sayandip Dutta в gh-125916.)
getopt¶
getpass¶
graphlib¶
Разрешён повторный вызов
TopologicalSorter.prepare(), пока сортировка не началась. (Автор: Daniel Pope в gh-130914.)
heapq¶
Модуль
heapqполучил улучшенную поддержку работы с max-кучами с помощью следующих новых функций:
hmac¶
http¶
Списки каталогов и страницы ошибок, создаваемые модулем
http.server, позволяют браузеру применять свой тёмный режим по умолчанию. (Автор: Yorik Hansen в gh-123430.)Модуль
http.serverтеперь поддерживает обслуживание по HTTPS с помощью классаhttp.server.HTTPSServer. Эта функциональность доступна через интерфейс командной строки (python -m http.server) со следующими опциями:--tls-cert <path>: Путь к файлу сертификата TLS.--tls-key <path>: Необязательный путь к файлу закрытого ключа.--tls-password-file <path>: Необязательный путь к файлу пароля для закрытого ключа.
(Автор: Semyon Moroz в gh-85162.)
imaplib¶
Добавлен
IMAP4.idle(), реализующий команду IMAP4IDLE, как определено в RFC 2177. (Автор: Forest в gh-55454.)
inspect¶
signature()принимает новый аргумент annotation_format для управленияannotationlib.Format, используемым для представления аннотаций. (Автор: Jelle Zijlstra в gh-101552.)Signature.format()принимает новый аргумент unquote_annotations. Если true, строковые аннотации отображаются без окружающих кавычек. (Автор: Jelle Zijlstra в gh-101552.)Добавлена функция
ispackage()для определения, является ли объект пакетом или нет. (Автор: Zhikang Yan в gh-125634.)
io¶
Чтение текста из неблокирующего потока данных с помощью
readтеперь может вызватьBlockingIOError, если операция не может немедленно вернуть байты. (Автор: Giovanni Siragusa в gh-109523.)Добавлены протоколы
ReaderиWriterв качестве более простых альтернатив псевдопротоколамtyping.IO,typing.TextIOиtyping.BinaryIO. (Автор: Sebastian Rittau в gh-127648.)
json¶
Добавлены примечания к исключениям для ошибок сериализации JSON, которые позволяют определить источник ошибки. (Автор: Serhiy Storchaka в gh-122163.)
Разрешено использовать модуль
jsonкак скрипт с помощью ключа-m: python -m json. Теперь это предпочтительнее использования python -m json.tool, который мягко устарел. См. документацию командного интерфейса JSON. (Автор: Trey Hunner в gh-122873.)По умолчанию вывод командного интерфейса JSON выделяется цветом. Это можно настроить с помощью переменных окружения. (Автор: Tomas Roun в gh-131952.)
linecache¶
logging.handlers¶
Объекты
QueueListenerтеперь поддерживают протокол менеджера контекста. (Автор: Charles Machalow в gh-132106.)QueueListener.startтеперь вызываетRuntimeError, если прослушиватель уже запущен. (Автор: Charles Machalow в gh-132106.)
math¶
Добавлены более подробные сообщения об ошибках для ошибок области определения в модуле. (Авторы: Charlie Zhao и Sergey B Kirpichev в gh-101410.)
mimetypes¶
Добавлен общедоступный командный интерфейс для модуля, вызываемый через python -m mimetypes. (Авторы: Oleg Iarygin и Hugo van Kemenade в gh-93096.)
Добавлено несколько новых MIME-типов на основе RFC и общего использования:
Microsoft и RFC 8081 MIME-типы для шрифтов
Embedded OpenType:
application/vnd.ms-fontobjectOpenType Layout (OTF)
font/otfTrueType:
font/ttfWOFF 1.0
font/woffWOFF 2.0
font/woff2
RFC 9559 MIME-типы для структур аудиовизуальных контейнеров Matroska
аудио без видео:
audio/matroska(.mka)видео:
video/matroska(.mkv)стереоскопическое видео:
video/matroska-3d(.mk3d)
Изображения с RFC
RFC 1494: группа CCITT 3 (
.g3)RFC 3362: факсимильная связь реального времени, T.38 (
.t38)RFC 3745: JPEG 2000 (
.jp2), расширение (.jpx) и составной (.jpm)RFC 3950: расширенный формат TIFF для факсов, TIFF-FX (
.tfx)RFC 4047: гибкая система передачи изображений (
.fits)RFC 7903: расширенный метафайл (
.emf) и метафайл Windows (.wmf)
Прочие дополнения и изменения MIME-типов
RFC 2361: изменение типа для
.aviнаvideo/vnd.aviи для.wavнаaudio/vnd.waveRFC 4337: добавление MPEG-4
audio/mp4(.m4a)RFC 5334: добавление медиа Ogg (
.oga,.oggи.ogx)RFC 6713: добавление gzip
application/gzip(.gz)RFC 9639: добавление FLAC
audio/flac(.flac)RFC 9512
application/yamlMIME-тип для файлов YAML (.yamlи.yml)Добавление
application/x-7z-compressed7z (.7z)Добавление
application/vnd.android.package-archiveпакета Android (.apk) при нестрогой проверкеДобавление
application/x-debian-packagedeb (.deb)Добавление бинарного
model/gltf-binaryglTF (.glb)Добавление
model/gltf+jsonglTF в формате JSON/ASCII (.gltf)Добавление
video/x-m4vM4V (.m4v)Добавление
application/x-httpd-phpPHP (.php)Добавление
application/vnd.rarRAR (.rar)Добавление
application/x-rpmRPM (.rpm)Добавление
model/stlSTL (.stl)Добавление
video/x-ms-wmvWindows Media Video (.wmv)Де-факто: добавление
audio/webmWebM (.weba)ECMA-376: добавление типов
.docx,.pptxи.xlsxOASIS: добавление типов OpenDocument
.odg,.odp,.odsи.odtW3C: Добавлен EPUB
application/epub+zip(.epub)
(Предложено Sahil Prajapati и Hugo van Kemenade в gh-84852, Sasha “Nelie” Chernykh и Hugo van Kemenade в gh-132056, Hugo van Kemenade в gh-89416, gh-85957 и gh-129965.)
multiprocessing¶
На платформах Unix, отличных от macOS, ‘forkserver’ теперь используется как метод запуска по умолчанию (заменяя ‘fork’). Это изменение не затрагивает Windows или macOS, где ‘spawn’ остаётся методом запуска по умолчанию.
Если требуется несовместимый с потоками метод fork, следует явно запросить его через контекст из
get_context()(рекомендуется) или изменить значение по умолчанию черезset_start_method().См. ограничения forkserver для получения информации о различиях с методом fork и о том, как это изменение может повлиять на существующий код с изменяемыми глобальными общими переменными и/или общими объектами, которые не могут быть автоматически
pickled.(Предложено Gregory P. Smith в gh-84559.)
Метод запуска
'forkserver'вmultiprocessingтеперь аутентифицирует свой управляющий сокет, чтобы не полагаться исключительно на права файловой системы для ограничения возможности других процессов заставить forkserver порождать рабочие процессы и выполнять код. (Предложено Gregory P. Smith для gh-97514.)Объекты-прокси multiprocessing для типов list и dict получили ранее упущенные методы:
clear()иcopy()для проксиlistfromkeys(),reversed(d),d | {},{} | d,d |= {'b': 2}для проксиdict
(Предложено Roy Hyunjin Han для gh-103134.)
Добавлена поддержка общих объектов
setчерезSyncManager.set(). Методset()вManager()теперь доступен. (Предложено Mingyu Park в gh-129949.)Добавлен
interrupt()в объектыmultiprocessing.Process, который завершает дочерний процесс отправкойSIGINT. Это позволяет предложениямfinallyвыводить стек вызовов для завершённого процесса. (Предложено Artem Pulkin в gh-131913.)
operator¶
Добавлены
is_none()иis_not_none()как пара функций, так чтоoperator.is_none(obj)эквивалентноobj is None, аoperator.is_not_none(obj)эквивалентноobj is not None. (Предложено Raymond Hettinger и Nico Mexis в gh-115808.)
os¶
Добавлена функция
reload_environ()для обновленияos.environиos.environbизменениями окружения, внесённымиos.putenv(),os.unsetenv(), или вне Python в том же процессе. (Предложено Victor Stinner в gh-120057.)Добавлены константы
SCHED_DEADLINEиSCHED_NORMALв модульos. (Предложено James Roy в gh-127688.)Добавлена функция
readinto()для чтения в буферный объект из файлового дескриптора. (Предложено Cody Maloney в gh-129205.)
os.path¶
Параметр strict в
realpath()принимает новое значение,ALLOW_MISSING. При его использовании ошибки, отличные отFileNotFoundError, будут возбуждаться повторно; результирующий путь может отсутствовать, но будет свободен от символических ссылок. (Предложено Petr Viktorin для CVE 2025-4517.)
pathlib¶
Добавлены методы в
pathlib.Pathдля рекурсивного копирования или перемещения файлов и каталогов:copy()копирует файл или дерево каталогов в заданное место.copy_into()копирует в целевой каталог.move()перемещает файл или дерево каталогов в заданное место.move_into()перемещает в целевой каталог.
(Предложено Barney Gale в gh-73991.)
Добавлен атрибут
info, который хранит объект, реализующий новый протоколpathlib.types.PathInfo. Этот объект поддерживает запрос типа файла и внутреннее кэширование результатовstat(). Объекты Path, созданныеiterdir(), инициализируются информацией о типе файла, полученной при сканировании родительского каталога. (Предложено Barney Gale в gh-125413.)
pdb¶
Модуль
pdbтеперь поддерживает удалённое подключение к работающему процессу Python с помощью новой опции командной строки-p PID:python -m pdb -p 1234
Это позволит подключиться к процессу Python с указанным PID и даст возможность интерактивно его отлаживать. Обратите внимание, что из-за особенностей работы интерпретатора Python подключение к удалённому процессу, заблокированному в системном вызове или ожидающему ввода-вывода, сработает только после выполнения следующей инструкции байт-кода или получения процессом сигнала.
Эта функция использует PEP 768 и новую функцию
sys.remote_exec()для подключения к удалённому процессу и отправки ему команд PDB.(Авторы: Matt Wozniski и Pablo Galindo, gh-131591.)
Жёстко заданные точки останова (
breakpoint()иset_trace()) теперь повторно используют последний экземплярPdb, который вызываетset_trace(), вместо создания нового каждый раз. В результате все данные, специфичные для экземпляра, такие какdisplayиcommands, сохраняются между жёстко заданными точками останова. (Автор: Tian Gao, gh-121450.)Добавлен новый аргумент mode в
pdb.Pdb. Командаrestartотключается, когдаpdbнаходится в режимеinline. (Автор: Tian Gao, gh-123757.)При попытке выйти из
pdbв режимеinlineбудет показан запрос подтверждения.y,Y,<Enter>илиEOFподтвердят выход и вызовутsys.exit()вместо возбужденияbdb.BdbQuit. (Автор: Tian Gao, gh-124704.)Встроенные точки останова, такие как
breakpoint()илиpdb.set_trace(), всегда будут останавливать программу в вызывающем фрейме, игнорируя шаблонskip(если он есть). (Автор: Tian Gao, gh-130493.)<tab>в начале строки в многострочном вводеpdbтеперь будет заполнять отступ в 4 пробела вместо вставки символа\t. (Автор: Tian Gao, gh-130471.)Автоматический отступ введён в многострочном вводе
pdb. Он либо сохраняет отступ последней строки, либо вставляет отступ в 4 пробела при обнаружении нового блока кода. (Автор: Tian Gao, gh-133350.)Добавлен
$_asynctaskдля доступа к текущей задаче asyncio, если применимо. (Автор: Tian Gao, gh-124367.)Добавлен
pdb.set_trace_async()для поддержки отладки корутин asyncio. Операторыawaitподдерживаются этой функцией. (Автор: Tian Gao, gh-132576.)Исходный код, отображаемый в
pdb, будет подсвечиваться синтаксисом. Эту возможность можно контролировать теми же методами, что и в стандартной оболочке interactive, в дополнение к недавно добавленному аргументуcolorizeфункцииpdb.Pdb. (Авторы: Tian Gao и Łukasz Langa, gh-133355.)
pickle¶
Установить версию протокола по умолчанию для модуля
pickleравной 5. Подробнее см. протоколы pickle.Добавлены примечания к исключениям для ошибок сериализации pickle, позволяющие идентифицировать источник ошибки. (Автор: Serhiy Storchaka, gh-122213.)
platform¶
Добавлена
invalidate_caches(), функция для инвалидации кэшированных результатов в модулеplatform. (Автор: Bénédikt Tran, gh-122549.)
pydoc¶
re¶
Поддержка
\zкак синонима\Zвregular expressions. Во многих других движках регулярных выражений он интерпретируется однозначно, в отличие от\Z, поведение которого незначительно отличается. (Автор: Serhiy Storchaka, gh-133306.)\Bвregular expressionтеперь соответствует пустой входной строке, то есть теперь он всегда является противоположностью\b. (Автор: Serhiy Storchaka, gh-124130.)
socket¶
Улучшена и исправлена поддержка Bluetooth-сокетов.
Исправлена поддержка Bluetooth-сокетов в NetBSD и DragonFly BSD. (Автор: Serhiy Storchaka, gh-132429.)
Исправлена поддержка
BTPROTO_HCIв FreeBSD. (Автор: Victor Stinner, gh-111178.)Добавлена поддержка
BTPROTO_SCOв FreeBSD. (Автор: Serhiy Storchaka, gh-85302.)Добавлена поддержка cid и bdaddr_type в адресе для
BTPROTO_L2CAPв FreeBSD. (Автор: Serhiy Storchaka, gh-132429.)Добавлена поддержка channel в адресе для
BTPROTO_HCIв Linux. (Автор: Serhiy Storchaka, gh-70145.)Принимать целое число в качестве адреса для
BTPROTO_HCIв Linux. (Автор: Serhiy Storchaka, gh-132099.)Возвращать cid в
getsockname()дляBTPROTO_L2CAP. (Автор: Serhiy Storchaka, gh-132429.)Добавлено много новых констант. (Автор: Serhiy Storchaka, gh-132734.)
ssl¶
struct¶
symtable¶
sys¶
Ранее недокументированная специальная функция
sys.getobjects(), которая существует только в специализированных сборках Python, теперь может возвращать объекты из других интерпретаторов, а не из того, в котором она вызвана. (Вклад Eric Snow в gh-125286.)Добавлена
sys._is_immortal()для определения того, является ли объект бессмертным. (Вклад Peter Bierma в gh-128509.)На FreeBSD
sys.platformбольше не содержит номер основной версии. Оно всегда равно'freebsd', а не'freebsd13'или'freebsd14'. (Вклад Michael Osipov в gh-129393.)Вызывает
DeprecationWarningдляsys._clear_type_cache(). Эта функция была объявлена устаревшей в Python 3.13, но не вызывала предупреждение времени выполнения.Добавлен
sys.remote_exec()для реализации нового интерфейса внешнего отладчика. См. PEP 768 для подробностей. (Вклад Pablo Galindo Salgado, Matt Wozniski и Ivona Stojanovic в gh-131591.)Добавлено пространство имён
sys._jit, содержащее утилиты для интроспекции JIT-компиляции. (Вклад Brandt Bucher в gh-133231.)
sys.monitoring¶
Добавлены два новых события мониторинга:
BRANCH_LEFTиBRANCH_RIGHT. Они заменяют и объявляют устаревшим событиеBRANCH. (Вклад Mark Shannon в gh-122548.)
sysconfig¶
Добавлен ключ
ABIFLAGSвget_config_vars()на Windows. (Вклад Xuehai Pan в gh-131799.)
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.)
threading¶
threading.Thread.start()теперь устанавливает имя потока операционной системы вthreading.Thread.name. (Вклад Victor Stinner в gh-59705.)
tkinter¶
turtle¶
Добавлены контекстные менеджеры для
turtle.fill(),turtle.poly()иturtle.no_animation(). (Вклад Marie Roald и Yngve Mardal Moe в gh-126350.)
types¶
types.UnionTypeтеперь является псевдонимом дляtyping.Union. См. ниже для подробностей. (Вклад Jelle Zijlstra в gh-105499.)
typing¶
Типы
types.UnionTypeиtyping.Unionтеперь являются псевдонимами друг друга, то есть как объединения старого стиля (созданные с помощьюUnion[int, str]), так и нового стиля (int | str) теперь создают экземпляры одного и того же типа времени выполнения. Это унифицирует поведение двух синтаксисов, но приводит к некоторым различиям, которые могут повлиять на пользователей, анализирующих типы во время выполнения:Оба синтаксиса создания объединения теперь дают одинаковое строковое представление в
repr(). Например,repr(Union[int, str])теперь возвращает"int | str"вместо"typing.Union[int, str]".Объединения, созданные старым синтаксисом, больше не кэшируются. Раньше многократный вызов
Union[int, str]возвращал один и тот же объект (Union[int, str] is Union[int, str]было быTrue), но теперь будет возвращено два разных объекта. Используйте==для сравнения объединений на равенство, а неis. Объединения нового стиля никогда так не кэшировались. Это изменение может увеличить потребление памяти для некоторых программ, использующих большое количество объединений, созданных подписываниемtyping.Union. Однако несколько факторов компенсируют это: объединения, используемые в аннотациях, по умолчанию больше не вычисляются в Python 3.14 из-за PEP 649; экземплярtypes.UnionTypeсам по себе намного меньше, чем объект, возвращаемыйUnion[]в предыдущих версиях Python; удаление кэша также экономит некоторое пространство. Поэтому маловероятно, что это изменение вызовет значительное увеличение использования памяти для большинства пользователей.Ранее объединения старого стиля были реализованы с помощью закрытого класса
typing._UnionGenericAlias. Этот класс больше не нужен для реализации, но сохранён для обратной совместимости; удаление запланировано на Python 3.17. Пользователям следует использовать документированные вспомогательные средства интроспекции, такие какget_origin()иtyping.get_args(), вместо того чтобы полагаться на детали закрытой реализации.Теперь можно использовать сам
typing.Unionв проверкахisinstance(). Например,isinstance(int | str, typing.Union)вернётTrue; ранее это вызывалоTypeError.Атрибут
__args__объектовtyping.Unionбольше не доступен для записи.Больше невозможно устанавливать какие-либо атрибуты для объектов
Union. Ранее это работало только для dunder-атрибутов в предыдущих версиях, никогда не было задокументировано как работающее и во многих случаях было незаметно сломано.
(Автор: Jelle Zijlstra в gh-105499.)
TypeAliasTypeтеперь поддерживает распаковку со звёздочкой.
unicodedata¶
База данных Unicode обновлена до версии 16.0.0.
unittest¶
Вывод
unittestтеперь по умолчанию цветной. Это можно настроить с помощью переменных окружения. (Автор: Hugo van Kemenade в gh-127221.)Обнаружение unittest снова поддерживает пакет пространства имён в качестве начального каталога. Эта возможность была удалена в Python 3.11. (Автор: Jacob Walls в gh-80958.)
В класс
TestCaseдобавлен ряд новых методов, предоставляющих более специализированные проверки.assertHasAttr()иassertNotHasAttr()проверяют, имеет ли объект определённый атрибут.assertIsSubclass()иassertNotIsSubclass()проверяют, является ли объект подклассом определённого класса или одного из классов из кортежа.assertStartsWith(),assertNotStartsWith(),assertEndsWith()иassertNotEndsWith()проверяют, начинается или заканчивается строка Unicode или байтовая строка на заданные строки.
(Автор: Serhiy Storchaka в gh-71339.)
urllib¶
Обновлён алгоритм дайджест-аутентификации HTTP для
urllib.requestза счёт поддержки дайджест-аутентификации SHA-256, как указано в RFC 7616. (Автор: Calvin Bui в gh-128193.)Улучшены эргономика и соответствие стандартам при разборе и формировании URL-адресов
file:.Принимать полный URL, когда новый аргумент require_scheme установлен в true.
Отбрасывать компонент authority URL, если он совпадает с локальным именем хоста.
Отбрасывать компонент authority URL, если он разрешается в локальный IP-адрес, когда новый аргумент resolve_host установлен в true.
Отбрасывать компоненты запроса (query) и фрагмента (fragment) URL.
Возбуждать
URLError, если authority URL не является локальным, за исключением Windows, где по-прежнему возвращается UNC-путь.
Возвращать полный URL, когда новый аргумент add_scheme установлен в true.
Включать пустой authority URL, когда путь начинается с косой черты. Например, путь
/etc/hostsпреобразуется в URL///etc/hosts.
В Windows буквы дисков больше не преобразуются в верхний регистр, и
:символы, не следующие за буквой диска, больше не вызывают исключениеOSError.(Предложено Barney Gale в gh-125866.)
uuid¶
Добавлена поддержка UUID версий 6, 7 и 8 через
uuid6(),uuid7()иuuid8()соответственно, как указано в RFC 9562. (Предложено Bénédikt Tran в gh-89083.)NILиMAXтеперь доступны для представления форматов UUID Nil и Max, как определено в RFC 9562. (Предложено Nick Pope в gh-128427.)Теперь можно генерировать несколько UUID одновременно в командной строке через
python -m uuid --count. (Предложено Саймоном Легнером в gh-131236.)
webbrowser¶
Имена в переменной окружения
BROWSERтеперь могут ссылаться на уже зарегистрированные браузеры для модуляwebbrowser, вместо того чтобы каждый раз создавать новую команду браузера.Это позволяет установить
BROWSERв значение одного из поддерживаемых браузеров на macOS.
zipfile¶
Добавлен метод
ZipInfo._for_archiveдля разрешения подходящих значений по умолчанию для объектаZipInfo, используемогоZipFile.writestr. (Предложено Bénédikt Tran в gh-123424.)ZipFile.writestr()теперь учитывает переменную окруженияSOURCE_DATE_EPOCHдля лучшей поддержки воспроизводимых сборок. (Предложено Jiahao Li в gh-91279.)
Оптимизации¶Optimizations
Время импорта нескольких модулей стандартной библиотеки было улучшено, включая
annotationlib,ast,asyncio,base64,cmd,csv,gettext,importlib.util,locale,mimetypes,optparse,pickle,pprint,pstats,shlex,socket,string,subprocess,threading,tomllib,typesиzipfile.(Предложено Adam Turner, Bénédikt Tran, Chris Markiewicz, Eli Schwartz, Hugo van Kemenade, Jelle Zijlstra и другими в gh-118761.)
Интерпретатор теперь избегает некоторых внутренних изменений счётчика ссылок, когда это безопасно. Это может привести к тому, что
sys.getrefcount()иPy_REFCNT()будут возвращать другие значения по сравнению с предыдущими версиями Python. См. ниже для подробностей.
asyncio¶
Результаты стандартных тестов производительности улучшились на 10–20% после внедрения нового двухсвязного списка для каждого потока для
native tasks, а также снижения потребления памяти. Это позволяет внешним инструментам интроспекции, таким как python -m asyncio pstree, интроспектировать граф вызовов задач asyncio, работающих во всех потоках. (Предложено Kumar Aditya в gh-107803.)Модуль теперь имеет первоклассную поддержку сборок со свободной многопоточностью. Это позволяет параллельно выполнять несколько циклов событий в разных потоках, масштабируясь линейно с количеством потоков. (Предложено Kumar Aditya в gh-128002.)
base64¶
b16decode()теперь работает до шести раз быстрее. (Предложено Bénédikt Tran, Chris Markiewicz и Adam Turner в gh-118761.)
bdb¶
Базовый отладчик теперь имеет бэкенд на основе
sys.monitoring, который можно выбрать, передав'monitoring'новому параметру backend классаBdb. (Предложено Tian Gao в gh-124533.)
difflib¶
Функция
IS_LINE_JUNK()теперь работает до двух раз быстрее. (Предложено Adam Turner и Semyon Moroz в gh-130167.)
gc¶
Начиная с Python 3.14.5:
Python 3.14.0–3.14.4 поставлялся с новым инкрементальным сборщиком мусора. Однако из-за ряда сообщений о значительном давлении памяти в производственных средах был выполнен откат к поколенческому GC из Python 3.13. Это GC, используемый в Python 3.14.5 и новее.
Ранее в Python 3.14.0–3.14.4:
Новый инкрементальный сборщик мусора означает, что максимальное время пауз сокращается на порядок или более для больших куч.
Из-за этой оптимизации значение результатов
get_threshold()иset_threshold()изменилось, а такжеget_count()иget_stats().Для обратной совместимости
get_threshold()продолжает возвращать кортеж из трёх элементов. Первое значение – порог для молодых сборок, как и раньше; второе значение определяет скорость сканирования старой сборки (по умолчанию 10; большие значения означают, что старая сборка сканируется медленнее). Третье значение теперь не имеет смысла и всегда равно нулю.set_threshold()теперь игнорирует любые элементы после второго.get_count()иget_stats()по-прежнему возвращают tот же формат результатов. Единственное отличие в том, что вместо привязки результатов к молодому, стареющему и старому поколениям, результаты теперь относятся к молодому поколению и пространствам старения и сбора старого поколения.
В итоге код, пытавшийся управлять поведением циклического сборщика мусора, может работать не совсем так, как задумывалось, но вряд ли причинит вред. Весь остальной код будет работать без проблем.
(Автор: Mark Shannon в gh-108362.)
io¶
pathlib¶
Path.read_bytesтеперь использует небуферизованный режим для открытия файлов, что позволяет читать их целиком на 9–17% быстрее. (Автор: Cody Maloney в gh-120754.)
pdb¶
pdbтеперь поддерживает два бэкенда, основанных наsys.settrace()илиsys.monitoring. Использование интерфейса командной строки pdb илиbreakpoint()всегда будет использовать бэкендsys.monitoring. При явном создании экземпляраpdb.Pdbи его производных классов по умолчанию будет использоваться бэкендsys.settrace(), который можно настроить. (Автор: Tian Gao в gh-124533.)
textwrap¶
Оптимизирована функция
dedent(): производительность повышена в среднем в 2,4 раза, с большим приростом для больших входных данных, а также исправлена ошибка неполной нормализации пустых строк с пробельными символами, отличными от пробела и табуляции.
uuid¶
zlib¶
В Windows в качестве реализации модуля
zlibв стандартных двоичных сборках теперь используется zlib-ng. Неизвестно о несовместимостях междуzlib-ngи ранее использовавшейся реализациейzlib. Это должно привести к повышению производительности на всех уровнях сжатия.Стоит отметить, что
zlib.Z_BEST_SPEED(1) может приводить к значительно меньшей степени сжатия, чем предыдущая реализация, одновременно значительно сокращая время сжатия.(Автор: Steve Dower в gh-91349.)
Удалено¶Removed
argparse¶
Удалены параметры type, choices и metavar у
BooleanOptionalAction. Они устарели, начиная с Python 3.12. (Автор: Nikita Sobolev в gh-118805.)Вызов
add_argument_group()для группы аргументов теперь вызываетValueError. Аналогично,add_argument_group()илиadd_mutually_exclusive_group()для взаимоисключающей группы теперь вызываютValueError. Такое «вложение» никогда не поддерживалось, часто работало некорректно и было случайно доступно через наследование. Эта функциональность устарела с Python 3.11. (Автор: Savannah Ostrowski в gh-127186.)
ast¶
Удалены следующие классы, которые были устаревшими псевдонимами
Constantначиная с Python 3.8 и выдавали предупреждения об устаревании с Python 3.12:BytesEllipsisNameConstantNumStr
В результате этих удалений пользовательские методы
visit_Num,visit_Str,visit_Bytes,visit_NameConstantиvisit_Ellipsisна пользовательских подклассахNodeVisitorбольше не будут вызываться, когда подклассNodeVisitorобходит AST. Вместо этого определите методvisit_Constant.(Автор: Alex Waygood в gh-119562.)
Удалены следующие устаревшие свойства у
ast.Constant, которые присутствовали для совместимости с удалёнными теперь классами AST:Constant.nConstant.s
Вместо этого используйте
Constant.value. (Автор: Alex Waygood в gh-119562.)
asyncio¶
Удалены следующие классы, методы и функции, которые были устаревшими с Python 3.12:
AbstractChildWatcherFastChildWatcherMultiLoopChildWatcherPidfdChildWatcherSafeChildWatcherThreadedChildWatcherAbstractEventLoopPolicy.get_child_watcher()AbstractEventLoopPolicy.set_child_watcher()get_child_watcher()set_child_watcher()
(Автор: Kumar Aditya в gh-120804.)
asyncio.get_event_loop()теперь вызываетRuntimeErrorпри отсутствии текущего цикла событий и больше не создаёт цикл событий неявно.(Автор: Kumar Aditya в gh-126353.)
Есть несколько шаблонов, в которых используется
asyncio.get_event_loop(); большинство из них можно заменить наasyncio.run().При запуске асинхронной функции достаточно использовать
asyncio.run().До:
async def main(): ... loop = asyncio.get_event_loop() try: loop.run_until_complete(main()) finally: loop.close()
После:
async def main(): ... asyncio.run(main())
Для запуска чего-либо, например сервера, прослушивающего сокет, и последующей бесконечной работы применяются
asyncio.run()иasyncio.Event.До:
def start_server(loop): ... loop = asyncio.get_event_loop() try: start_server(loop) loop.run_forever() finally: loop.close()
После:
def start_server(loop): ... async def main(): start_server(asyncio.get_running_loop()) await asyncio.Event().wait() asyncio.run(main())
Для запуска чего-либо в цикле событий с последующим выполнением блокирующего кода вокруг него применяется
asyncio.Runner.До:
async def operation_one(): ... def blocking_code(): ... async def operation_two(): ... loop = asyncio.get_event_loop() try: loop.run_until_complete(operation_one()) blocking_code() loop.run_until_complete(operation_two()) finally: loop.close()
После:
async def operation_one(): ... def blocking_code(): ... async def operation_two(): ... with asyncio.Runner() as runner: runner.run(operation_one()) blocking_code() runner.run(operation_two())
email¶
Удалён параметр isdst у
email.utils.localtime(), который был объявлен устаревшим и игнорируется начиная с Python 3.12. (Автор: Hugo van Kemenade в gh-118798.)
importlib.abc¶
Удалены устаревшие классы
importlib.abc:ResourceReader(используйтеTraversableResources)Traversable(используйтеTraversable)TraversableResources(используйтеTraversableResources)
(Авторы: Jason R. Coombs и Hugo van Kemenade в gh-93963.)
itertools¶
Удалена поддержка операций copy, deepcopy и pickle для итераторов
itertools. Начиная с Python 3.12 они вызываютDeprecationWarning. (Автор: Raymond Hettinger в gh-101588.)
pathlib¶
Удалена поддержка передачи дополнительных именованных аргументов в
Path. В предыдущих версиях такие аргументы игнорировались. (Автор: Barney Gale в gh-74033.)Удалена поддержка передачи дополнительных позиционных аргументов в
PurePath.relative_to()иis_relative_to(). В предыдущих версиях такие аргументы присоединялись к other. (Автор: Barney Gale в gh-78707.)
pkgutil¶
Удалены функции
get_loader()иfind_loader(), которые были объявлены устаревшими начиная с Python 3.12. (Автор: Bénédikt Tran в gh-97850.)
pty¶
Удалены функции
master_open()иslave_open(), которые были объявлены устаревшими начиная с Python 3.12. Вместо них используйтеpty.openpty(). (Автор: Nikita Sobolev в gh-118824.)
sqlite3¶
Удалены
versionиversion_infoиз модуляsqlite3; используйтеsqlite_versionиsqlite_version_infoдля получения фактического номера версии библиотеки SQLite среды выполнения. (Автор: Hugo van Kemenade в gh-118924.)Передача последовательности параметров с именованными заполнителями теперь вызывает
ProgrammingError; это поведение объявлено устаревшим начиная с Python 3.12. (Авторы: Erlend E. Aasland в gh-118928 и gh-101693.)
urllib¶
Удалён класс
Quoterизurllib.parse, который устарел начиная с Python 3.11. (Предложено Никитой Соболевым в gh-118827.)Из
urllib.requestудалены классыURLopenerиFancyURLopener, которые устарели начиная с Python 3.3.myopener.open()можно заменить наurlopen().myopener.retrieve()можно заменить наurlretrieve(). Настройки классов-открывателей можно заменить, передав настраиваемые обработчики вbuild_opener(). (Предложено Барни Гейлом в gh-84850.)
Устарело¶Deprecated
Новые устаревания¶New deprecations
Передача комплексного числа в качестве аргумента real или imag в конструкторе
complex()теперь устарела; комплексные числа должны передаваться только как единственный позиционный аргумент. (Предложено Сергеем Сторчакой в gh-109218.)-
Передача недокументированного именованного аргумента prefix_chars методу
add_argument_group()теперь устарела. (Предложено Саванной Островски в gh-125563.)Устарел преобразователь типов
argparse.FileType. Всё, что связано с управлением ресурсами, должно обрабатываться на последующих этапах, после разбора аргументов. (Предложено Сергеем Сторчакой в gh-58032.)
-
asyncio.iscoroutinefunction()теперь устарел и будет удалён в Python 3.16; используйте вместо негоinspect.iscoroutinefunction(). (Предложено Цзюхао Ли и Кумаром Адитьей в gh-122875.)Система политик
asyncioустарела и будет удалена в Python 3.16. В частности, следующие классы и функции объявлены устаревшими:Пользователям следует использовать
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.)
codecs: Функцияcodecs.open()теперь устарела и будет удалена в будущей версии Python. Используйте вместо неёopen(). (Предложено Инадой Наоки в gh-133036.)-
На платформах, отличных от Windows, установка
Structure._pack_для использования совместимой с MSVC разметки памяти по умолчанию теперь устарела в пользу установкиStructure._layout_в'ms', и будет удалена в Python 3.19. (Предложено Петром Викториным в gh-131747.)Вызов
ctypes.POINTER()для строки теперь устарел. Используйте неполные типы для саморекурсивных структур. Кроме того, внутреннийctypes._pointer_type_cacheустарел. Подробнее об обновлённой реализации см. вctypes.POINTER(). (Предложено Сергеем Мяриановым в gh-100926.)
functools: Вызов реализации на Python дляfunctools.reduce()с function или sequence в качестве именованных аргументов теперь устарел; параметры станут только позиционными в Python 3.16. (Предложено Кириллом Подопригорой в gh-121676.)logging: Поддержка пользовательских обработчиков логирования с аргументом strm теперь устарела и запланирована к удалению в Python 3.16. Вместо этого определяйте обработчики с аргументом поток данных. (Предложено Мариушем Фелисяком в gh-115032.)mimetypes: Допустимые расширения – либо пустые, либо должны начинаться с ‘.’ дляmimetypes.MimeTypes.add_type(). Расширения без точки объявлены устаревшими и будут вызыватьValueErrorв Python 3.16. (Предложено Хьюго ван Кеменаде в gh-75223.)nturl2path: Этот модуль теперь устарел. Вместо него вызывайтеurllib.request.url2pathname()иpathname2url(). (Предложено Барни Гейлом в gh-125866.)os: Функцииos.popen()иos.spawn*теперь мягко устарели. Их не следует использовать для написания нового кода. Вместо них рекомендуется модульsubprocess. (Предложено Виктором Стиннером в gh-120743.)pathlib:pathlib.PurePath.as_uri()теперь устарел и запланирован к удалению в Python 3.19. Используйте вместо негоpathlib.Path.as_uri(). (Предложено Барни Гейлом в gh-123599.)pdb: Незадокументированный атрибутpdb.Pdb.curframe_localsтеперь является устаревшим свойством только для чтения, которое будет удалено в будущей версии Python. Низконакладный доступ к локальным переменным фрейма, добавленный в Python 3.13 с помощью PEP 667, означает, что кэш-ссылка на локальные переменные фрейма, ранее хранившаяся в этом атрибуте, больше не нужна. Производные отладчики должны обращаться кpdb.Pdb.curframe.f_localsнапрямую в Python 3.13 и более поздних версиях. (Предложено Тианом Гао в gh-124369 и gh-125951.)symtable:symtable.Class.get_methods()объявлен устаревшим из-за отсутствия интереса, запланирован к удалению в Python 3.16. (Предложено Бенедиктом Траном в gh-119698.)tkinter: Методыtkinter.Variable:trace_variable(),trace_vdelete()иtrace_vinfo()теперь устарели. Используйте вместо нихtrace_add(),trace_remove()иtrace_info(). (Предложено Сергеем Сторчакой в gh-120220.)urllib.parse: Принятие объектов с ложными значениями (например,0и[]), за исключением пустых строк, байтоподобных объектов иNone, вparse_qsl()иparse_qs()теперь устарело. (Предложено Сергеем Сторчакой в gh-116897.)
Ожидается удаление в Python 3.15¶Pending removal in Python 3.15
Система импорта:
Установка
__cached__в модуле без установки__spec__.cachedсчитается устаревшей. Начиная с Python 3.15__cached__больше не будет устанавливаться или учитываться системой импорта или стандартной библиотекой. (gh-97879)Установка
__package__в модуле без установки__spec__.parentсчитается устаревшей. Начиная с Python 3.15__package__больше не будет устанавливаться или учитываться системой импорта или стандартной библиотекой. (gh-97879)
-
Незадокументированная функция
ctypes.SetPointerType()считается устаревшей начиная с Python 3.13.
-
Устаревшая и редко используемая
CGIHTTPRequestHandlerсчитается устаревшей начиная с Python 3.13. Прямой замены не существует. Что угодно лучше, чем CGI, для взаимодействия веб-сервера с обработчиком запросов.Флаг
--cgiдля python -m http.server интерфейса командной строки считается устаревшим начиная с Python 3.13.
-
Метод
load_module(): вместо него используйтеexec_module().
-
PurePath.is_reserved()считается устаревшим начиная с Python 3.13. Используйтеos.path.isreserved()для обнаружения зарезервированных путей в Windows.
-
java_ver()считается устаревшим начиная с Python 3.13. Эта функция полезна только для поддержки Jython, имеет запутанный API и в значительной степени не тестировалась.
-
Аргумент check_home функции
sysconfig.is_python_build()считается устаревшим начиная с Python 3.12.
-
RLock()не будет принимать аргументов в Python 3.15. Передача любых аргументов считается устаревшей начиная с Python 3.14, поскольку версия на Python не допускает никаких аргументов, но версия на C позволяет любое количество позиционных или именованных аргументов, игнорируя все аргументы.
-
types.CodeType: доступ кco_lnotabбыл объявлен устаревшим в PEP 626 начиная с версии 3.10 и планировался к удалению в 3.12, но получил надлежащийDeprecationWarningтолько в 3.12. Может быть удалён в 3.15. (Предложено Никитой Соболевым в gh-101866.)
-
Незадокументированный синтаксис именованных аргументов для создания классов
NamedTuple(например,Point = NamedTuple("Point", x=int, y=int)) считается устаревшим начиная с Python 3.13. Вместо этого используйте синтаксис на основе классов или функциональный синтаксис.При использовании функционального синтаксиса
TypedDict, отсутствие передачи значения параметру поля (TD = TypedDict("TD")) или передачаNone(TD = TypedDict("TD", None)) считается устаревшим начиная с Python 3.13. Используйтеclass TD(TypedDict): passилиTD = TypedDict("TD", {})для создания TypedDict без полей.Функция-декоратор
typing.no_type_check_decorator()считается устаревшей начиная с Python 3.13. За восемь лет в модулеtypingона так и не была поддержана ни одним крупным средством проверки типов.
wave:Методы
getmark(),setmark()иgetmarkers()классовWave_readиWave_writeустарели начиная с Python 3.13.
-
load_module()устарел начиная с Python 3.10. Вместо него используйтеexec_module(). (Внёс вклад Jiahao Li в gh-125746.)
Запланировано к удалению в Python 3.16¶Pending removal in Python 3.16
Система импорта:
Установка
__loader__в модуле при отсутствии__spec__.loaderустарела. В Python 3.16__loader__перестанет устанавливаться или учитываться системой импорта или стандартной библиотекой.
-
Код формата
'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.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.
-
Метод
Class.get_methodsустарел начиная с Python 3.14.
sys:Функция
_enablelegacywindowsfsencoding()устарела начиная с Python 3.13. Используйте переменную окруженияPYTHONLEGACYWINDOWSFSENCODING.
-
Функция
sysconfig.expand_makefile_vars()устарела начиная с Python 3.14. Используйте аргументvarsизsysconfig.get_paths().
-
Недокументированный и неиспользуемый атрибут
TarFile.tarfileустарел начиная с Python 3.13.
Запланировано к удалению в Python 3.17¶Pending removal in Python 3.17
-
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.)
-
До 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.)
Запланировано удаление в Python 3.18¶Pending removal in Python 3.18
Запланировано к удалению в Python 3.19¶Pending removal in Python 3.19
Будет удалено в будущих версиях¶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()в многопоточном процессе.pydoc.ErrorDuringImport: кортежное значение для параметра exc_info устарело, используйте экземпляр исключения.re: теперь применяются более строгие правила для числовых ссылок на группы и имён групп в регулярных выражениях. В качестве числовой ссылки теперь принимается только последовательность цифр ASCII. Имя группы в байтовых шаблонах и строках замены теперь может содержать только буквы ASCII, цифры и знак подчёркивания. (Автор: Сергей Сторчака в gh-91760.)Модули
sre_compile,sre_constantsиsre_parse.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()вместо него.
Изменения байткода CPython¶CPython bytecode changes
Опкод
BINARY_SUBSCRзаменён опкодомBINARY_OPс аргументомNB_SUBSCR. (Предложено Ирит Катриэль в gh-100239.)Добавлены опкоды
BUILD_INTERPOLATIONиBUILD_TEMPLATEдля создания новых экземпляровInterpolationиTemplateсоответственно. (Предложено Лисандросом Николау и другими в gh-132661; см. также PEP 750: Шаблонные строки).Удалён опкод
BUILD_CONST_KEY_MAP. Используйте вместо негоBUILD_MAP. (Предложено Марком Шенноном в gh-122160.)Заменить опкод
LOAD_ASSERTION_ERRORнаLOAD_COMMON_CONSTANTи добавить поддержку загрузкиNotImplementedError.Добавлены опкоды
LOAD_FAST_BORROWиLOAD_FAST_BORROW_LOAD_FAST_BORROWдля снижения накладных расходов на подсчёт ссылок, когда интерпретатор может доказать, что ссылка во фрейме переживает ссылку, загруженную в стек. (Предложено Мэттом Пейджем в gh-130704.)Добавлен опкод
LOAD_SMALL_INT, который помещает в стек небольшое целое число, равноеoparg. ОпкодRETURN_CONSTудалён, так как он больше не используется. (Предложено Марком Шенноном в gh-125837.)Добавлена новая инструкция
LOAD_SPECIAL. С её помощью генерируется код для операторовwithиasync with. Удалены инструкцииBEFORE_WITHиBEFORE_ASYNC_WITH. (Автор: Mark Shannon в gh-120507.)Добавлен опкод
POP_ITERдля поддержки «виртуальных» итераторов. (Автор: Mark Shannon в gh-132554.)
Псевдоинструкции¶Pseudo-instructions
Добавлена псевдоинструкция
ANNOTATIONS_PLACEHOLDERдля поддержки частично выполненных аннотаций на уровне модуля с отложенным вычислением аннотаций. (Автор: Jelle Zijlstra в gh-130907.)Добавлена псевдоинструкция
BINARY_OP_EXTEND, которая выполняет пару функций (функции проверки guard и специализации), получаемых из inline-кэша. (Автор: Irit Katriel в gh-100239.)Добавлены три специализации для
CALL_KW:CALL_KW_PYдля вызовов функций Python,CALL_KW_BOUND_METHODдля вызовов связанных методов иCALL_KW_NON_PYдля всех остальных вызовов. (Автор: Mark Shannon в gh-118093.)Добавлены псевдоинструкции
JUMP_IF_TRUEиJUMP_IF_FALSE– условные переходы, не влияющие на стек. Заменены последовательностьюCOPY 1,TO_BOOL,POP_JUMP_IF_TRUE/FALSE. (Автор: Irit Katriel в gh-124285.)Добавлена псевдоинструкция
LOAD_CONST_MORTAL. (Автор: Mark Shannon в gh-128685.)Добавлена псевдоинструкция
LOAD_CONST_IMMORTAL, которая делает то же, что иLOAD_CONST, но более эффективна для бессмертных объектов. (Автор: Mark Shannon в gh-125837.)Добавлена псевдоинструкция
NOT_TAKEN, используемаяsys.monitoringдля записи событий ветвления (например,BRANCH_LEFT). (Автор: Mark Shannon в gh-122548.)
Изменения C API¶C API changes
C API конфигурации Python¶Python configuration C API
Добавлен C API PyInitConfig для настройки инициализации Python, не полагаясь на C-структуры, с возможностью вносить ABI-совместимые изменения в будущем.
Завершён PEP 587 C API PyConfig добавлением PyInitConfig_AddModule(), который можно использовать для добавления встроенного модуля расширения – функциональность, ранее называвшаяся «inittab».
Добавлены функции PyConfig_Get() и PyConfig_Set() для получения и установки текущей конфигурации среды выполнения.
PEP 587 «Конфигурация инициализации Python» унифицировал все способы настройки инициализации Python. Этот PEP также объединяет конфигурацию преинициализации и инициализации в единый API. Более того, этот PEP предоставляет единственный вариант встраивания Python вместо двух вариантов «Python» и «Isolated» (PEP 587), что дополнительно упрощает API.
Низкоуровневый API PyConfig из PEP 587 остаётся доступным для случаев, когда требуется намеренно более высокая степень связанности с деталями реализации CPython (например, для эмуляции полной функциональности интерфейса командной строки CPython, включая его механизмы конфигурации).
(Автор: Victor Stinner в gh-107954.)
Новые возможности C API¶New features in the C API
Добавлены
Py_PACK_VERSION()иPy_PACK_FULL_VERSION()– два новых макроса для упаковки номеров версий Python в битовом представлении. Это полезно для сравнения сPy_VersionилиPY_VERSION_HEX. (Автор: Petr Viktorin в gh-128629.)Добавлена функция
PyBytes_Join(sep, iterable), аналогичнаяsep.join(iterable)в Python. (Автор: Victor Stinner в gh-121645.)Добавлены функции для работы с конфигурацией текущего интерпретатора Python во время выполнения (PEP 741: C API конфигурации Python):
(Автор: Victor Stinner в gh-107954.)
Добавлены функции для настройки инициализации Python (PEP 741: C API конфигурации Python):
(Автор: Victor Stinner в gh-107954.)
Добавлена функция
Py_fopen()для открытия файла. Она работает аналогично стандартной функции Cfopen(), но принимает объект Python для параметра path и устанавливает исключение при ошибке. Для закрытия файла следует использовать новую функциюPy_fclose(). (Автор: Victor Stinner в gh-127350.)Добавлена
Py_HashBuffer()для вычисления и возврата хеш-значения буфера. (Авторы: Antoine Pitrou и Victor Stinner в gh-122854.)Добавлены вспомогательные функции
PyImport_ImportModuleAttr()иPyImport_ImportModuleAttrString()для импорта модуля и получения атрибута модуля. (Автор: Victor Stinner в gh-128911.)Добавлена
PyIter_NextItem()для заменыPyIter_Next(), которая имеет неоднозначное возвращаемое значение. (Авторы: Irit Katriel и Erlend Aasland в gh-105201.)Добавлена функция
PyLong_GetSign()для получения знака объектовint. (Автор: Sergey B Kirpichev в gh-116560.)Добавлены
PyLong_IsPositive(),PyLong_IsNegative()иPyLong_IsZero()для проверки, является лиPyLongObjectположительным, отрицательным или нулём соответственно. (Авторы: James Roy и Sergey B Kirpichev в gh-126061.)Добавлены новые функции для преобразования чисел C
<stdint.h>в/из объектов Pythonint:(Автор: Victor Stinner в gh-120389.)
Добавлен новый API импорта и экспорта для объектов Python
int(PEP 757):(Авторы: Sergey B Kirpichev и Victor Stinner в gh-102471.)
Добавлены
PyMonitoring_FireBranchLeftEvent()иPyMonitoring_FireBranchRightEvent()для генерации событийBRANCH_LEFTиBRANCH_RIGHTсоответственно. (Автор: Mark Shannon в gh-122548.)Добавлена функция
PyType_Freeze()для создания неизменяемого типа. (Автор: Victor Stinner в gh-121654.)Добавлены слоты
PyType_GetBaseByToken()иPy_tp_tokenдля упрощения определения суперкласса, что решает проблему проверки типов, описанную в PEP 630. (Автор: gh-124153.)Добавлена новая функция
PyUnicode_Equal()для проверки равенства двух строк. Функция также добавлена в Limited C API. (Автор: Victor Stinner в gh-124502.)Добавлен новый API
PyUnicodeWriterдля создания объекта Pythonstrсо следующими функциями:(Автор: Victor Stinner в gh-119182.)
Форматы
kиKвPyArg_ParseTuple()и подобных функциях теперь используют__index__(), если он доступен, как и все остальные целочисленные форматы. (Автор: Serhiy Storchaka в gh-112068.)Добавлена поддержка нового форматного элемента
pвPy_BuildValue(), который создаёт объект Pythonboolиз целого числа C. (Автор: Pablo Galindo в bpo-45325.)Добавлена
PyUnstable_IsImmortal()для определения, является ли объект бессмертным, для целей отладки. (Автор: Peter Bierma в gh-128509.)Добавлена
PyUnstable_Object_EnableDeferredRefcount()для включения отложенного подсчёта ссылок, как описано в PEP 703.Добавлена
PyUnstable_Object_IsUniquelyReferenced()в качестве заменыPy_REFCNT(op) == 1в сборке со свободной потоковой обработкой. (Автор: Peter Bierma в gh-133140.)Добавлена
PyUnstable_Object_IsUniqueReferencedTemporary()для определения, является ли объект уникальным временным объектом на стеке операндов интерпретатора. Это можно использовать в некоторых случаях в качестве замены проверки, является лиPy_REFCNT()1для объектов Python, передаваемых в качестве аргументов функциям C API. (Автор: Sam Gross в gh-133164.)
Изменения в Limited C API¶Limited C API changes
В Limited C API версии 3.14 и новее
Py_TYPE()иPy_REFCNT()теперь реализованы как непрозрачный вызов функции для скрытия деталей реализации. (Авторы: Victor Stinner в gh-120600 и gh-124127.)Удалены макросы
PySequence_Fast_GET_SIZE,PySequence_Fast_GET_ITEM, иPySequence_Fast_ITEMSиз Limited C API, так как они всегда были нерабочими в Limited C API. (Автор: Victor Stinner в gh-91417.)
Удалённые C API¶Removed C APIs
Создание
immutable typesс изменяемыми базовыми классами было объявлено устаревшим в Python 3.12, и теперь вызываетTypeError. (Автор: Nikita Sobolev в gh-119775.)Удалён член
PyDictObject.ma_version_tag, который был устаревшим в Python 3.12. Используйте APIPyDict_AddWatcher()вместо него. (Автор: Sam Gross в gh-124296.)Удалена приватная функция
_Py_InitializeMain(). Она была временным API, добавленным в Python 3.8 с помощью PEP 587. (Автор: Victor Stinner в gh-129033.)Удалены недокументированные API
Py_C_RECURSION_LIMITиPyThreadState.c_recursion_remaining. Они были добавлены в 3.13 и удалены без объявления устаревшими. ИспользуйтеPy_EnterRecursiveCall()для защиты от неконтролируемой рекурсии в коде C. (Удалено Petr Viktorin в gh-133079; см. также gh-130396.)
Устаревшие C API¶Deprecated C APIs
Макрос
Py_HUGE_VALтеперь мягко устарел. Вместо него используйтеPy_INFINITY. (Автор: Sergey B Kirpichev в gh-120026.)Макросы
Py_IS_NAN,Py_IS_INFINITY, иPy_IS_FINITEтеперь мягко устарели. Вместо них используйтеisnan,isinfиisfinite, доступные изmath.hначиная с C99. (Автор: Sergey B Kirpichev в gh-119613.)Некортежные последовательности теперь считаются устаревшими в качестве аргумента для форматного элемента
(items)вPyArg_ParseTuple()и других функциях разбора аргументов, если элементы содержат форматные элементы, которые хранят заимствованный буфер или заимствованную ссылку. (Автор: Serhiy Storchaka в gh-50333.)Функция
_PyMonitoring_FireBranchEventтеперь устарела и должна быть заменена вызовамиPyMonitoring_FireBranchLeftEvent()иPyMonitoring_FireBranchRightEvent().Ранее недокументированная функция
PySequence_In()теперь мягко устарела. Вместо неё используйтеPySequence_Contains(). (Автор: Yuki Kobayashi в gh-127896.)
Ожидается удаление в Python 3.15¶Pending removal in Python 3.15
PyImport_ImportModuleNoBlock(): Вместо этого используйтеPyImport_ImportModule().PyWeakref_GetObject()иPyWeakref_GET_OBJECT(): Вместо этого используйтеPyWeakref_GetRef(). Проект pythoncapi-compat можно использовать, чтобы получитьPyWeakref_GetRef()на Python 3.12 и старше.Тип
Py_UNICODEи макросPy_UNICODE_WIDE: Вместо них используйтеwchar_t.PyUnicode_AsDecodedObject(): Вместо этого используйтеPyCodec_Decode().PyUnicode_AsDecodedUnicode(): Вместо этого используйтеPyCodec_Decode(); Обратите внимание, что некоторые кодеки (например, «base64») могут возвращать тип, отличный отstr, например,bytes.PyUnicode_AsEncodedObject(): Вместо этого используйтеPyCodec_Encode().PyUnicode_AsEncodedUnicode(): Вместо этого используйтеPyCodec_Encode(); Обратите внимание, что некоторые кодеки (например, «base64») могут возвращать тип, отличный отbytes, например,str.Функции инициализации Python, устаревшие в Python 3.13:
Py_GetPath(): Вместо этого используйтеPyConfig_Get("module_search_paths")(sys.path).Py_GetPrefix(): Вместо этого используйтеPyConfig_Get("base_prefix")(sys.base_prefix). ИспользуйтеPyConfig_Get("prefix")(sys.prefix), если необходимо обрабатывать виртуальные окружения.Py_GetExecPrefix(): Вместо этого используйтеPyConfig_Get("base_exec_prefix")(sys.base_exec_prefix). ИспользуйтеPyConfig_Get("exec_prefix")(sys.exec_prefix), если необходимо обрабатывать виртуальные окружения.Py_GetProgramFullPath(): Вместо этого используйтеPyConfig_Get("executable")(sys.executable).Py_GetProgramName(): Вместо этого используйтеPyConfig_Get("executable")(sys.executable).Py_GetPythonHome(): ИспользуйтеPyConfig_Get("home")или переменную окруженияPYTHONHOME.
Проект pythoncapi-compat можно использовать, чтобы получить
PyConfig_Get()на Python 3.13 и старше.Функции для настройки инициализации Python, устаревшие в Python 3.11:
PySys_SetArgvEx(): Вместо этого задайтеPyConfig.argv.PySys_SetArgv(): Вместо этого задайтеPyConfig.argv.Py_SetProgramName(): Вместо этого задайтеPyConfig.program_name.Py_SetPythonHome(): Вместо этого задайтеPyConfig.home.PySys_ResetWarnOptions(): Вместо этого очиститеsys.warnoptionsиwarnings.filters.
API
Py_InitializeFromConfig()следует использовать сPyConfigвместо этого.Глобальные переменные конфигурации:
Py_DebugFlag: ИспользуйтеPyConfig.parser_debugилиPyConfig_Get("parser_debug")вместо этого.Py_VerboseFlag: ИспользуйтеPyConfig.verboseилиPyConfig_Get("verbose")вместо этого.Py_QuietFlag: ИспользуйтеPyConfig.quietилиPyConfig_Get("quiet")вместо этого.Py_InteractiveFlag: ИспользуйтеPyConfig.interactiveилиPyConfig_Get("interactive")вместо этого.Py_InspectFlag: ИспользуйтеPyConfig.inspectилиPyConfig_Get("inspect")вместо этого.Py_OptimizeFlag: ИспользуйтеPyConfig.optimization_levelилиPyConfig_Get("optimization_level")вместо этого.Py_NoSiteFlag: ИспользуйтеPyConfig.site_importилиPyConfig_Get("site_import")вместо этого.Py_BytesWarningFlag: ИспользуйтеPyConfig.bytes_warningилиPyConfig_Get("bytes_warning")вместо этого.Py_FrozenFlag: ИспользуйтеPyConfig.pathconfig_warningsилиPyConfig_Get("pathconfig_warnings")вместо этого.Py_IgnoreEnvironmentFlag: ИспользуйтеPyConfig.use_environmentилиPyConfig_Get("use_environment")вместо этого.Py_DontWriteBytecodeFlag: ИспользуйтеPyConfig.write_bytecodeилиPyConfig_Get("write_bytecode")вместо этого.Py_NoUserSiteDirectory: ИспользуйтеPyConfig.user_site_directoryилиPyConfig_Get("user_site_directory")вместо этого.Py_UnbufferedStdioFlag: ИспользуйтеPyConfig.buffered_stdioилиPyConfig_Get("buffered_stdio")вместо этого.Py_HashRandomizationFlag: ИспользуйтеPyConfig.use_hash_seedиPyConfig.hash_seedилиPyConfig_Get("hash_seed")вместо этого.Py_IsolatedFlag: ИспользуйтеPyConfig.isolatedилиPyConfig_Get("isolated")вместо этого.Py_LegacyWindowsFSEncodingFlag: ИспользуйтеPyPreConfig.legacy_windows_fs_encodingилиPyConfig_Get("legacy_windows_fs_encoding")вместо этого.Py_LegacyWindowsStdioFlag: ИспользуйтеPyConfig.legacy_windows_stdioилиPyConfig_Get("legacy_windows_stdio")вместо этого.Py_FileSystemDefaultEncoding,Py_HasFileSystemDefaultEncoding: ИспользуйтеPyConfig.filesystem_encodingилиPyConfig_Get("filesystem_encoding")вместо этого.Py_FileSystemDefaultEncodeErrors: ИспользуйтеPyConfig.filesystem_errorsилиPyConfig_Get("filesystem_errors")вместо этого.Py_UTF8Mode: ИспользуйтеPyPreConfig.utf8_modeилиPyConfig_Get("utf8_mode")вместо этого. (см.Py_PreInitialize())
API
Py_InitializeFromConfig()следует использовать сPyConfigдля установки этих параметров. ИлиPyConfig_Get()можно использовать для получения этих параметров во время выполнения.
Запланировано к удалению в Python 3.16¶Pending removal in Python 3.16
Встроенная копия
libmpdec.
Запланировано удаление в Python 3.18¶Pending removal in Python 3.18
Следующие закрытые функции устарели и планируются к удалению в Python 3.18:
_PyBytes_Join(): используйтеPyBytes_Join()._PyDict_GetItemStringWithError(): используйтеPyDict_GetItemStringRef()._PyDict_Pop(): используйтеPyDict_Pop()._PyLong_Sign(): используйтеPyLong_GetSign()._PyLong_FromDigits()и_PyLong_New(): используйтеPyLongWriter_Create()._PyThreadState_UncheckedGet(): используйтеPyThreadState_GetUnchecked()._PyUnicode_AsString(): используйтеPyUnicode_AsUTF8()._PyUnicodeWriter_Init(): заменить_PyUnicodeWriter_Init(&writer)наwriter = PyUnicodeWriter_Create(0)._PyUnicodeWriter_Finish(): заменить_PyUnicodeWriter_Finish(&writer)наPyUnicodeWriter_Finish(writer)._PyUnicodeWriter_Dealloc(): заменить_PyUnicodeWriter_Dealloc(&writer)наPyUnicodeWriter_Discard(writer)._PyUnicodeWriter_WriteChar(): заменить_PyUnicodeWriter_WriteChar(&writer, ch)наPyUnicodeWriter_WriteChar(writer, ch)._PyUnicodeWriter_WriteStr(): заменить_PyUnicodeWriter_WriteStr(&writer, str)наPyUnicodeWriter_WriteStr(writer, str)._PyUnicodeWriter_WriteSubstring(): заменить_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)наPyUnicodeWriter_WriteSubstring(writer, str, start, end)._PyUnicodeWriter_WriteASCIIString(): заменить_PyUnicodeWriter_WriteASCIIString(&writer, str)наPyUnicodeWriter_WriteASCII(writer, str)._PyUnicodeWriter_WriteLatin1String(): заменить_PyUnicodeWriter_WriteLatin1String(&writer, str)наPyUnicodeWriter_WriteUTF8(writer, str)._PyUnicodeWriter_Prepare(): (нет замены)._PyUnicodeWriter_PrepareKind(): (нет замены)._Py_HashPointer(): используйтеPy_HashPointer()._Py_fopen_obj(): используйтеPy_fopen().
Проект pythoncapi-compat можно использовать для получения этих новых открытых функций в Python 3.13 и старше. (Предложено Виктором Стиннером в gh-128863.)
Будет удалено в будущих версиях¶Pending removal in future versions
Следующие API устарели и будут удалены, хотя на данный момент дата их удаления не назначена.
Py_TPFLAGS_HAVE_FINALIZE: Не требуется начиная с Python 3.8.PyErr_Fetch(): Вместо этого используйтеPyErr_GetRaisedException().PyErr_NormalizeException(): Вместо этого используйтеPyErr_GetRaisedException().PyErr_Restore(): Вместо этого используйтеPyErr_SetRaisedException().PyModule_GetFilename(): Вместо этого используйтеPyModule_GetFilenameObject().PyOS_AfterFork(): Вместо этого используйтеPyOS_AfterFork_Child().PySlice_GetIndicesEx(): Вместо этого используйтеPySlice_Unpack()иPySlice_AdjustIndices().PyUnicode_READY(): Не требуется начиная с Python 3.12PyErr_Display(): Вместо этого используйтеPyErr_DisplayException()._PyErr_ChainExceptions(): Вместо этого используйте_PyErr_ChainExceptions1().Элемент
PyBytesObject.ob_shash: вместо этого вызывайтеPyObject_Hash().API локального хранилища потока (TLS):
PyThread_create_key(): Вместо этого используйтеPyThread_tss_alloc().PyThread_delete_key(): Вместо этого используйтеPyThread_tss_free().PyThread_set_key_value(): Вместо этого используйтеPyThread_tss_set().PyThread_get_key_value(): Вместо этого используйтеPyThread_tss_get().PyThread_delete_key_value(): Вместо этого используйтеPyThread_tss_delete().PyThread_ReInitTLS(): Не требуется с Python 3.7.
Изменения в сборке¶Build changes
PEP 776: Emscripten теперь официально поддерживаемая платформа на уровне tier 3. В рамках этой работы было исправлено более 25 ошибок в libc Emscripten. Emscripten теперь включает поддержку
ctypes,termiosиfcntl, а также экспериментальную поддержку новой интерактивной оболочки по умолчанию. (Автор: R. Hood Chatham в gh-127146, gh-127683 и gh-136931.)Официальные бинарные сборки для Android теперь доступны на python.org.
Для генерации
configureтеперь требуется GNU Autoconf 2.72. (Автор: Erlend Aasland, gh-115765.)wasm32-unknown-emscriptenтеперь является платформой уровня 3 PEP 11. (Авторы: R. Hood Chatham, вклады gh-127146, gh-127683 и gh-136931.)#pragma-основанную компоновку сpython3*.libтеперь можно отключить с помощью Py_NO_LINK_LIB. (Автор: Jean-Christophe Fillion-Robin, gh-82909.)Теперь CPython по умолчанию включает набор рекомендуемых опций компилятора для повышения безопасности. Чтобы отключить их, используйте опцию
--disable-safetyconfigure, или опцию--enable-slower-safetyдля более широкого набора опций компилятора, но с потерей производительности.Макрос
WITH_FREELISTSи опция--without-freelistsconfigureбыли удалены.Новая опция
configure--with-tail-call-interpможет использоваться для включения экспериментального интерпретатора с хвостовыми вызовами. Подробнее см. в разделе Новый тип интерпретатора.Чтобы отключить новую поддержку удалённой отладки, используйте опцию
--without-remote-debugconfigure. Это может быть полезно по соображениям безопасности.Приложения для iOS и macOS теперь можно настроить на перенаправление содержимого
stdoutиstderrв системный журнал. (Автор: Russell Keith-Magee, gh-127592.)Тестовый стенд для iOS теперь может передавать результаты тестов в потоковом режиме во время выполнения теста. Стенд также можно использовать для запуска тестовых наборов проектов, отличных от самого CPython. (Автор: Russell Keith-Magee, gh-127592.)
build-details.json¶
Установки Python теперь содержат новый файл build-details.json.
Это статический JSON-документ с деталями сборки CPython,
позволяющий выполнять интроспекцию без необходимости запуска кода.
Это полезно для таких сценариев использования, как загрузчики Python, кросс-компиляция и т.д.
build-details.json должен быть установлен в платформонезависимый каталог стандартной библиотеки. Это соответствует пути установки ‘stdlib’ sysconfig,
который можно найти, выполнив sysconfig.get_path('stdlib').
См. также
PEP 739 – build-details.json 1.0 – статический файл описания
деталей сборки Python
Прекращение поддержки PGP-подписей¶Discontinuation of PGP signatures
PGP-подписи (Pretty Good Privacy) не будут предоставляться для релизов Python 3.14 и последующих версий. Для проверки артефактов CPython пользователи должны использовать материалы верификации Sigstore. Начиная с Python 3.11, релизы подписываются с помощью Sigstore.
Это изменение в процессе выпуска было описано в PEP 761.
Free-threaded Python официально поддерживается¶Free-threaded Python is officially supported
Free-threaded сборка Python теперь поддерживается и больше не является экспериментальной. Это начало фазы II, в которой free-threaded Python официально поддерживается, но остаётся опциональным.
Команда free-threading уверена, что проект движется в правильном направлении, и благодарит всех за постоянную самоотдачу в работе над тем, чтобы сделать free-threading готовым к более широкому внедрению в сообществе Python.
С учётом этих рекомендаций и принятия данного PEP, сообщество разработчиков Python должно широко сообщить, что free-threading является поддерживаемой опцией сборки Python сейчас и в будущем, и что она не будет удалена без соответствующего графика устаревания.
Любое решение о переходе к фазе III, когда free-threading станет сборкой Python по умолчанию или единственной, пока не принято и зависит от многих факторов как внутри самого CPython, так и в сообществе. Это решение – дело будущего.
Бинарные сборки экспериментального JIT-компилятора¶Binary releases for the experimental just-in-time compiler
Официальные бинарные сборки для macOS и Windows теперь включают экспериментальный
JIT-компилятор. Хотя он не рекомендуется для использования в продакшене,
его можно протестировать, установив переменную окружения PYTHON_JIT=1.
Сборщики из исходников и редистрибьюторы могут использовать опцию конфигурации --enable-experimental-jit=yes-off для аналогичного поведения.
JIT находится на ранней стадии и всё ещё активно разрабатывается. Поэтому типичное влияние на производительность при его включении может составлять от -10% (медленнее) до +20% (быстрее) в зависимости от нагрузки. Для помощи в тестировании и оценке предоставлен набор функций интроспекции в пространстве имён sys._jit.
sys._jit.is_available() можно использовать, чтобы определить, поддерживает ли текущий исполняемый файл JIT-компиляцию, а sys._jit.is_enabled() – чтобы узнать, включена ли JIT-компиляция для текущего процесса.
В настоящее время самая значительная отсутствующая функциональность – это то, что нативные отладчики и профилировщики, такие как gdb и perf, не могут разворачивать стек через JIT-фреймы (отладчики и профилировщики Python, такие как pdb или profile, продолжают работать без изменений). Free-threaded сборки не поддерживают JIT-компиляцию.
Пожалуйста, сообщайте о любых ошибках или серьёзных регрессиях производительности, с которыми вы столкнётесь!
См. также
Портирование на Python 3.14¶Porting to Python 3.14
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Изменения в Python API¶Changes in the Python API
На платформах Unix, отличных от macOS, forkserver теперь является методом запуска по умолчанию метод запуска для
multiprocessingиProcessPoolExecutorвместо fork.Если вы столкнетесь с
NameErrorили ошибками pickling, возникающими изmultiprocessingилиconcurrent.futures, обратитесь к ограничениям forkserver.Это изменение не затрагивает Windows или macOS, где ‘spawn’ остаётся методом запуска по умолчанию.
functools.partialтеперь является дескриптором метода. Оберните его вstaticmethod(), чтобы сохранить старое поведение. (Авторы: Serhiy Storchaka и Dominykas Grigonis, gh-121027.)Сборщик мусора теперь инкрементальный, что означает, что поведение
gc.collect()немного изменяется:gc.collect(1): выполняет инкремент сборки мусора, а не сбор поколения 1.Другие вызовы
gc.collect()не изменились.
Функция
locale.nl_langinfo()теперь временно устанавливает локальLC_CTYPEв некоторых случаях. Это временное изменение затрагивает другие потоки. (Автор: Serhiy Storchaka, gh-69998.)types.UnionTypeтеперь является псевдонимом дляtyping.Union, что приводит к изменениям в некоторых поведениях. Подробнее см. выше. (Автор: Jelle Zijlstra, gh-105499.)Поведение аннотаций во время выполнения изменилось в различных аспектах; подробнее см. выше. Хотя большая часть кода, взаимодействующего с аннотациями, должна продолжать работать, некоторые недокументированные детали могут вести себя иначе.
В рамках публикации CLI
mimetypes, теперь он завершается с1при ошибке вместо0и с2при неверных параметрах командной строки вместо1. Сообщения об ошибках теперь выводятся в stderr.Шаблон
\Bв регулярных выражениях теперь соответствует пустой строке, если указан как весь шаблон, что может вызвать изменения в поведении.На FreeBSD
sys.platformбольше не содержит номер основной версии.
Изменения в аннотациях (PEP 649 и PEP 749)¶Changes in annotations (PEP 649 and PEP 749)
В этом разделе содержатся рекомендации по изменениям, которые могут потребоваться для аннотаций или кода Python, взаимодействующего с аннотациями или проводящего их интроспекцию, в связи с изменениями, связанными с отложенным вычислением аннотаций.
В большинстве случаев работающий код из более старых версий Python не потребует никаких изменений.
Последствия для аннотированного кода¶Implications for annotated code
Если вы определяете аннотации в своём коде (например, для использования со статическим проверщиком типов), то это изменение, вероятно, вас не затронет: вы можете продолжать писать аннотации так же, как и в предыдущих версиях Python.
Вероятно, вы сможете удалить строки в кавычках в аннотациях, которые часто
используются для прямых ссылок. Аналогично, если вы используете from __future__ import annotations,
чтобы избежать написания строк в аннотациях, вы, вероятно, сможете
удалить этот импорт, как только будете поддерживать только Python 3.14 и новее.
Однако, если вы полагаетесь на сторонние библиотеки, которые читают аннотации,
этим библиотекам могут потребоваться изменения для поддержки аннотаций без кавычек, прежде чем они
начнут работать как ожидается.
Последствия для читателей __annotations__¶Implications for readers of __annotations__
Если ваш код читает атрибут __annotations__ у объектов,
вам, возможно, потребуется внести изменения, чтобы поддерживать код, который полагается на
отложенное вычисление аннотаций.
Например, вы можете использовать annotationlib.get_annotations() с
форматом FORWARDREF,
как это теперь делает модуль dataclasses.
Внешний пакет typing_extensions предоставляет частичные обратные переносы
некоторой функциональности модуля annotationlib,
такие как перечисление Format и
функция get_annotations().
Их можно использовать для написания кода, работающего в разных версиях и использующего
новое поведение в Python 3.14.
from __future__ import annotations¶
В Python 3.7 PEP 563 представил from __future__ import annotations
future-инструкцию, которая превращает все аннотации в строки.
Однако эта инструкция теперь устарела и, как ожидается, будет удалена в будущей версии Python. Это удаление не произойдет до тех пор, пока Python 3.13 не достигнет конца своего жизненного цикла в 2029 году, будучи последней версией Python без поддержки отложенного вычисления аннотаций.
В Python 3.14 поведение кода, использующего from __future__ import annotations,
не изменилось.
Изменения в C API¶Changes in the C API
Py_Finalize()теперь удаляет все интернированные строки. Это нарушает обратную совместимость с любым C-расширением, которое удерживает интернированную строку после вызоваPy_Finalize()и затем повторно используется после вызоваPy_Initialize(). Любые проблемы, возникающие из-за этого поведения, обычно приводят к аварийным завершениям во время выполнения последующего вызоваPy_Initialize()при доступе к неинициализированной памяти. Для исправления используйте санитайзер адресов, чтобы выявить любое использование после освобождения, связанное с интернированной строкой, и освободите её при завершении модуля. (Автор: Eddie Elizondo, gh-113601.)Теперь C API Unicode Exception Objects генерирует
TypeError, если его аргумент исключения не является объектомUnicodeError. (Автор: Bénédikt Tran в gh-127691.)
Интерпретатор внутренне избегает некоторых изменений счётчика ссылок при загрузке объектов в стек операндов путём заимствования ссылок, когда это возможно. Это может привести к меньшим значениям счётчика ссылок по сравнению с предыдущими версиями Python. Расширения C API, которые проверяли
Py_REFCNT()объекта1, чтобы определить, не ссылается ли на аргумент функции другой код, должны вместо этого использоватьPyUnstable_Object_IsUniqueReferencedTemporary()как более безопасную замену.Приватные функции, повышенные до публичных C API:
_PyBytes_Join():PyBytes_Join()_PyLong_IsNegative():PyLong_IsNegative()_PyLong_IsPositive():PyLong_IsPositive()_PyLong_IsZero():PyLong_IsZero()_PyLong_Sign():PyLong_GetSign()_PyUnicodeWriter_Dealloc():PyUnicodeWriter_Discard()_PyUnicodeWriter_Finish():PyUnicodeWriter_Finish()_PyUnicodeWriter_Init(): используйтеPyUnicodeWriter_Create()_PyUnicodeWriter_Prepare(): (замены нет)_PyUnicodeWriter_PrepareKind(): (замены нет)_PyUnicodeWriter_WriteChar():PyUnicodeWriter_WriteChar()_PyUnicodeWriter_WriteStr():PyUnicodeWriter_WriteStr()_PyUnicodeWriter_WriteSubstring():PyUnicodeWriter_WriteSubstring()_PyUnicode_EQ():PyUnicode_Equal()_PyUnicode_Equal():PyUnicode_Equal()_Py_GetConfig():PyConfig_Get()иPyConfig_GetInt()_Py_HashBytes():Py_HashBuffer()_Py_fopen_obj():Py_fopen()PyMutex_IsLocked():PyMutex_IsLocked()
Проект pythoncapi-compat можно использовать для получения большинства этих новых функций в Python 3.13 и старше.
Заметные изменения в 3.14.1¶Notable changes in 3.14.1
Добавлены функции
PyUnstable_ThreadState_SetStackProtection()иPyUnstable_ThreadState_ResetStackProtection()для установки базового адреса защиты стека и размера защиты стека состояния потока Python. (Автор: Victor Stinner в gh-139653.)
Заметные изменения в 3.14.5¶Notable changes in 3.14.5
gc¶
Инкрементальный сборщик мусора, поставлявшийся в Python 3.14.0–3.14.4, был заменён обратно на поколенческий сборщик мусора из версии 3.13 из-за ряда сообщений о значительном давлении на память в производственных средах. Подробнее см. в Garbage collection.