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

Что нового в Python 3.14What’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.


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

Значительные улучшения в стандартной библиотеке:

Улучшения C API:

Поддержка платформ:

Изменения в выпуске:

Новые возможности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 649

Отложенное вычисление аннотаций с помощью дескрипторов

PEP 749

Реализация 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 734

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 750.

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, где подробно описаны базовые механизмы, используемые для безопасного подключения к выполняющимся процессам.

Интерфейс отладки был тщательно спроектирован с учетом безопасности и включает несколько механизмов управления доступом:

(Авторы: Pablo Galindo Salgado, Matt Wozniski и Ivona Stojanovic в gh-131591.)

См. также

PEP 768.

Новый тип интерпретатора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 ...

    (Автор: Никита Соболев в gh-123539, gh-123562 и gh-123440.)

  • Улучшено сообщение об ошибке при попытке добавить экземпляр нехэшируемого типа в 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.)

См. также

PEP 784.

Возможности интроспекции asyncioAsyncio 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() теперь принимают ASCII bytes и байтоподобные объекты. (Автор: 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: Управление потоком в блоках finallyPEP 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

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

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

datetime

decimal

  • Добавлен Decimal.from_number() как альтернативный конструктор для Decimal. (Автор: Serhiy Storchaka, gh-121798.)

  • Предоставлен IEEEContext() для поддержки создания контекстов, соответствующих десятичным форматам обмена IEEE 754 (2008). (Автор: Sergey B Kirpichev, gh-53032.)

difflib

  • Страницы сравнения с выделенными изменениями, создаваемые классом HtmlDiff, теперь поддерживают «тёмный режим». (Автор: Jiahao Li в gh-129939.)

dis

  • Добавлена поддержка отображения полной информации о местоположении в исходном коде для instructions, а не только номера строки. Эта возможность добавлена в следующие интерфейсы через именованный аргумент show_positions:

    Эта возможность также доступна через dis --show-positions. (Автор: Bénédikt Tran в gh-123165.)

  • Добавлена опция командной строки dis --specialized для показа специализированного байт-кода. (Автор: Bénédikt Tran в gh-127413.)

errno

  • Добавлена константа кода ошибки EHWPOISON. (Автор: James Roy в gh-126585.)

faulthandler

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

  • Добавлена поддержка опций с необязательными аргументами. (Автор: Serhiy Storchaka в gh-126374.)

  • Добавлена поддержка возврата перемешанных опций и не-опционных аргументов в порядке их следования. (Автор: Serhiy Storchaka в gh-126390.)

getpass

  • Поддержка обратной связи с клавиатуры в функции getpass() через необязательный именованный аргумент echo_char. Символы-заполнители отображаются при вводе символа и удаляются при его удалении. (Автор: Semyon Moroz в gh-77065.)

graphlib

heapq

hmac

  • Добавлена встроенная реализация HMAC (RFC 2104) с использованием формально верифицированного кода из проекта HACL*. Эта реализация используется как запасной вариант, когда реализация HMAC от OpenSSL недоступна. (Автор: Bénédikt Tran в gh-99108.)

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(), реализующий команду IMAP4 IDLE, как определено в 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

linecache

  • getline() теперь может получать исходный код для замороженных модулей. (Автор: Tian Gao в gh-131638.)

logging.handlers

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-fontobject

    • OpenType Layout (OTF) font/otf

    • TrueType: font/ttf

    • WOFF 1.0 font/woff

    • WOFF 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.wave

    • RFC 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/yaml MIME-тип для файлов YAML (.yaml и .yml)

    • Добавление application/x-7z-compressed 7z (.7z)

    • Добавление application/vnd.android.package-archive пакета Android (.apk) при нестрогой проверке

    • Добавление application/x-debian-package deb (.deb)

    • Добавление бинарного model/gltf-binary glTF (.glb)

    • Добавление model/gltf+json glTF в формате JSON/ASCII (.gltf)

    • Добавление video/x-m4v M4V (.m4v)

    • Добавление application/x-httpd-php PHP (.php)

    • Добавление application/vnd.rar RAR (.rar)

    • Добавление application/x-rpm RPM (.rpm)

    • Добавление model/stl STL (.stl)

    • Добавление video/x-ms-wmv Windows Media Video (.wmv)

    • Де-факто: добавление audio/webm WebM (.weba)

    • ECMA-376: добавление типов .docx, .pptx и .xlsx

    • OASIS: добавление типов OpenDocument .odg, .odp, .ods и .odt

    • W3C: Добавлен 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() для прокси list

    • fromkeys(), 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

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

  • Аннотации в выводе help теперь обычно отображаются в формате, более близком к исходному коду. (Автор: Jelle Zijlstra, gh-101552.)

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

  • Указывает с помощью логического значения HAS_PHA, поддерживает ли модуль ssl аутентификацию клиента после рукопожатия (PHA) для TLSv1.3. (Вклад Will Childs-Klein в gh-128036.)

struct

  • Поддерживает типы C float complex и double complex в модуле struct (символы форматирования 'F' и 'D' соответственно). (Вклад Sergey B Kirpichev в gh-121249.)

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

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

tkinter

  • Методы tkinter after() и after_idle() теперь принимают именованные аргументы. (Вклад Zhikang Yan в gh-126899.)

  • Добавлена возможность указать имя для tkinter.OptionMenu и tkinter.ttk.OptionMenu. (Вклад Zhikang Yan в gh-130482.)

turtle

types

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

urllib

  • Обновлён алгоритм дайджест-аутентификации HTTP для urllib.request за счёт поддержки дайджест-аутентификации SHA-256, как указано в RFC 7616. (Автор: Calvin Bui в gh-128193.)

  • Улучшены эргономика и соответствие стандартам при разборе и формировании URL-адресов file:.

    В url2pathname():

    • Принимать полный URL, когда новый аргумент require_scheme установлен в true.

    • Отбрасывать компонент authority URL, если он совпадает с локальным именем хоста.

    • Отбрасывать компонент authority URL, если он разрешается в локальный IP-адрес, когда новый аргумент resolve_host установлен в true.

    • Отбрасывать компоненты запроса (query) и фрагмента (fragment) URL.

    • Возбуждать URLError, если authority URL не является локальным, за исключением Windows, где по-прежнему возвращается UNC-путь.

    В pathname2url():

    • Возвращать полный 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

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

  • Открытие и чтение файлов теперь выполняет меньше системных вызовов. Чтение небольшого файла, кэшированного операционной системой, целиком выполняется до 15% быстрее. (Авторы: Cody Maloney и Victor Stinner в gh-120754 и gh-90102.)

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

  • uuid3() и uuid5() теперь примерно на 40% быстрее для 16-байтовых имён и на 20% быстрее для 1024-байтовых. Производительность для более длинных имён осталась без изменений. (Автор: Bénédikt Tran в gh-128150.)

  • uuid4() теперь примерно на 30% быстрее. (Автор: Bénédikt Tran в gh-128150.)

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:

    • Bytes

    • Ellipsis

    • NameConstant

    • Num

    • Str

    В результате этих удалений пользовательские методы visit_Num, visit_Str, visit_Bytes, visit_NameConstant и visit_Ellipsis на пользовательских подклассах NodeVisitor больше не будут вызываться, когда подкласс NodeVisitor обходит AST. Вместо этого определите метод visit_Constant.

    (Автор: Alex Waygood в gh-119562.)

  • Удалены следующие устаревшие свойства у ast.Constant, которые присутствовали для совместимости с удалёнными теперь классами AST:

    • Constant.n

    • Constant.s

    Вместо этого используйте Constant.value. (Автор: Alex Waygood в gh-119562.)

asyncio

  • Удалены следующие классы, методы и функции, которые были устаревшими с Python 3.12:

    • AbstractChildWatcher

    • FastChildWatcher

    • MultiLoopChildWatcher

    • PidfdChildWatcher

    • SafeChildWatcher

    • ThreadedChildWatcher

    • AbstractEventLoopPolicy.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

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.)

  • argparse:

    • Передача недокументированного именованного аргумента prefix_chars методу add_argument_group() теперь устарела. (Предложено Саванной Островски в gh-125563.)

    • Устарел преобразователь типов argparse.FileType. Всё, что связано с управлением ресурсами, должно обрабатываться на последующих этапах, после разбора аргументов. (Предложено Сергеем Сторчакой в gh-58032.)

  • asyncio:

  • codecs: Функция codecs.open() теперь устарела и будет удалена в будущей версии Python. Используйте вместо неё open(). (Предложено Инадой Наоки в gh-133036.)

  • ctypes:

    • На платформах, отличных от 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.15Pending removal in Python 3.15

  • Система импорта:

    • Установка __cached__ в модуле без установки __spec__.cached считается устаревшей. Начиная с Python 3.15 __cached__ больше не будет устанавливаться или учитываться системой импорта или стандартной библиотекой. (gh-97879)

    • Установка __package__ в модуле без установки __spec__.parent считается устаревшей. Начиная с Python 3.15 __package__ больше не будет устанавливаться или учитываться системой импорта или стандартной библиотекой. (gh-97879)

  • ctypes:

    • Незадокументированная функция ctypes.SetPointerType() считается устаревшей начиная с Python 3.13.

  • http.server:

    • Устаревшая и редко используемая CGIHTTPRequestHandler считается устаревшей начиная с Python 3.13. Прямой замены не существует. Что угодно лучше, чем CGI, для взаимодействия веб-сервера с обработчиком запросов.

    • Флаг --cgi для python -m http.server интерфейса командной строки считается устаревшим начиная с Python 3.13.

  • importlib:

    • Метод load_module(): вместо него используйте exec_module().

  • pathlib:

    • PurePath.is_reserved() считается устаревшим начиная с Python 3.13. Используйте os.path.isreserved() для обнаружения зарезервированных путей в Windows.

  • platform:

    • java_ver() считается устаревшим начиная с Python 3.13. Эта функция полезна только для поддержки Jython, имеет запутанный API и в значительной степени не тестировалась.

  • sysconfig:

    • Аргумент check_home функции sysconfig.is_python_build() считается устаревшим начиная с Python 3.12.

  • threading:

    • RLock() не будет принимать аргументов в Python 3.15. Передача любых аргументов считается устаревшей начиная с Python 3.14, поскольку версия на Python не допускает никаких аргументов, но версия на C позволяет любое количество позиционных или именованных аргументов, игнорируя все аргументы.

  • types:

    • types.CodeType: доступ к co_lnotab был объявлен устаревшим в PEP 626 начиная с версии 3.10 и планировался к удалению в 3.12, но получил надлежащий DeprecationWarning только в 3.12. Может быть удалён в 3.15. (Предложено Никитой Соболевым в gh-101866.)

  • typing:

    • Незадокументированный синтаксис именованных аргументов для создания классов 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:

  • zipimport:

Запланировано к удалению в Python 3.16Pending removal in Python 3.16

  • Система импорта:

    • Установка __loader__ в модуле при отсутствии __spec__.loader устарела. В Python 3.16 __loader__ перестанет устанавливаться или учитываться системой импорта или стандартной библиотекой.

  • array:

    • Код формата 'u' (wchar_t) устарел в документации начиная с Python 3.3 и во время выполнения начиная с Python 3.13. Используйте код формата 'w' (Py_UCS4) для символов Unicode.

  • asyncio:

  • builtins:

    • Поразрядная инверсия для булевых типов, ~True или ~False устарела начиная с Python 3.12, поскольку даёт неожиданные и неинтуитивные результаты (-2 и -1). Используйте not x для логического отрицания булевого значения. В редких случаях, когда требуется поразрядная инверсия базового целого числа, явно преобразуйте в int (~int(x)).

  • functools:

    • Вызов реализации functools.reduce() на Python с function или sequence в качестве именованных аргументов устарел начиная с Python 3.14.

  • logging:

    Поддержка пользовательских обработчиков логирования с аргументом strm устарела и запланирована к удалению в Python 3.16. Вместо этого определяйте обработчики с аргументом stream. (Предложено Mariusz Felisiak в gh-115032.)

  • mimetypes:

    • Допустимые расширения начинаются с точки ‘.’ или пусты для mimetypes.MimeTypes.add_type(). Расширения без точки устарели и будут вызывать ValueError в Python 3.16. (Предложено Hugo van Kemenade в gh-75223.)

  • shutil:

    • Исключение ExecError устарело начиная с Python 3.14. Оно не используется ни одной функцией в shutil начиная с Python 3.4 и теперь является псевдонимом RuntimeError.

  • symtable:

  • sys:

  • sysconfig:

    • Функция sysconfig.expand_makefile_vars() устарела начиная с Python 3.14. Используйте аргумент vars из sysconfig.get_paths().

  • tarfile:

    • Недокументированный и неиспользуемый атрибут TarFile.tarfile устарел начиная с Python 3.13.

Запланировано к удалению в Python 3.17Pending removal in Python 3.17

  • collections.abc:

    • 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.)

  • typing:

    • До 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.18Pending removal in Python 3.18

  • decimal:

    • Нестандартный и недокументированный Decimal спецификатор формата 'N', который поддерживается только в реализации C модуля decimal, устарел с Python 3.13. (Автор: Serhiy Storchaka в gh-89902.)

Запланировано к удалению в Python 3.19Pending removal in Python 3.19

  • ctypes:

    • Неявное переключение на совместимую с MSVC структуру путём установки _pack_ без _layout_ на платформах, отличных от Windows.

Будет удалено в будущих версияхPending removal in future versions

Следующие API будут удалены в будущем, хотя на данный момент нет запланированной даты их удаления.

  • argparse:

    • Вложение групп аргументов и вложение взаимоисключающих групп устарело.

    • Передача недокументированного именованного аргумента prefix_chars в add_argument_group() теперь устарела.

    • Конвертер типов argparse.FileType устарел.

  • builtins:

    • Генераторы: сигнатура 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() вместо этого.

  • datetime:

    • utcnow(): используйте datetime.datetime.now(tz=datetime.UTC).

    • utcfromtimestamp(): используйте datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).

  • gettext: значение множественного числа должно быть целым числом.

  • importlib:

    • cache_from_source(): параметр debug_override устарел: используйте параметр optimization вместо него.

  • importlib.metadata:

    • 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_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • threading: методы

  • typing.Text (gh-92332).

  • Внутренний класс 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() вместо него.

Изменения байткода CPythonCPython 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 APIC API changes

C API конфигурации PythonPython 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.)

См. также

PEP 741 и PEP 587

Новые возможности C APINew features in the C API

Изменения в Limited C APILimited C API changes

Удалённые C APIRemoved C APIs

  • Создание immutable types с изменяемыми базовыми классами было объявлено устаревшим в Python 3.12, и теперь вызывает TypeError. (Автор: Nikita Sobolev в gh-119775.)

  • Удалён член PyDictObject.ma_version_tag, который был устаревшим в Python 3.12. Используйте API PyDict_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 APIDeprecated C APIs

Ожидается удаление в Python 3.15Pending removal in Python 3.15

Запланировано к удалению в Python 3.16Pending removal in Python 3.16

  • Встроенная копия libmpdec.

Запланировано удаление в Python 3.18Pending removal in Python 3.18

Будет удалено в будущих версияхPending removal in future versions

Следующие API устарели и будут удалены, хотя на данный момент дата их удаления не назначена.

Изменения в сборке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-safety configure, или опцию --enable-slower-safety для более широкого набора опций компилятора, но с потерей производительности.

  • Макрос WITH_FREELISTS и опция --without-freelists configure были удалены.

  • Новая опция configure --with-tail-call-interp может использоваться для включения экспериментального интерпретатора с хвостовыми вызовами. Подробнее см. в разделе Новый тип интерпретатора.

  • Чтобы отключить новую поддержку удалённой отладки, используйте опцию --without-remote-debug configure. Это может быть полезно по соображениям безопасности.

  • Приложения для 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 739build-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-компиляцию.

Пожалуйста, сообщайте о любых ошибках или серьёзных регрессиях производительности, с которыми вы столкнётесь!

См. также

PEP 744

Портирование на Python 3.14Porting to Python 3.14

В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.

Изменения в Python APIChanges in the Python API

  • На платформах Unix, отличных от macOS, forkserver теперь является методом запуска по умолчанию метод запуска для multiprocessing и ProcessPoolExecutor вместо fork.

    Подробнее см. (1) и (2).

    Если вы столкнетесь с 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 APIChanges 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.)

Заметные изменения в 3.14.1Notable changes in 3.14.1

Заметные изменения в 3.14.5Notable changes in 3.14.5

gc

  • Инкрементальный сборщик мусора, поставлявшийся в Python 3.14.0–3.14.4, был заменён обратно на поколенческий сборщик мусора из версии 3.13 из-за ряда сообщений о значительном давлении на память в производственных средах. Подробнее см. в Garbage collection.