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

Что нового в Python 3.12What’s New In Python 3.12

Редактор:

Adam Turner

В этой статье описываются новые возможности Python 3.12 по сравнению с версией 3.11. Python 3.12 был выпущен 2 октября 2023 года. Подробнее см. в журнале изменений.

См. также

PEP 693 – План выпуска Python 3.12

Итоги – основные измененияSummary – Release highlights

Python 3.12 – это стабильный релиз языка программирования Python, который включает как изменения в самом языке, так и в стандартной библиотеке. Изменения в библиотеке направлены на очистку устаревших API, улучшение удобства использования и корректности. Примечательно, что пакет distutils был удалён из стандартной библиотеки. Поддержка файловой системы в os и pathlib получила ряд улучшений, а производительность нескольких модулей повысилась.

Изменения в языке направлены на удобство использования: у f-строк были сняты многие ограничения, а подсказки «Вы имели в виду…» продолжают улучшаться. Новый синтаксис параметров типа и оператор type улучшают эргономику использования обобщённых типов и псевдонимов типов со статическими проверками типов.

Эта статья не претендует на полное описание всех новых возможностей, а предоставляет удобный обзор. Подробную информацию можно найти в документации, например, в Справочнике по библиотеке и Справочнике по языку. Если вы хотите понять полную реализацию и обоснование дизайна изменения, обратитесь к PEP для конкретной новой возможности; но учтите, что PEP обычно не обновляются после полной реализации возможности.


Новые синтаксические возможности:

  • PEP 695, синтаксис параметров типа и оператор type

Новые грамматические возможности:

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

Улучшения модели данных Python:

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

Улучшения в области безопасности:

  • Замена встроенных реализаций hashlib для SHA1, SHA3, SHA2-384, SHA2-512 и MD5 на формально верифицированный код из проекта HACL*. Эти встроенные реализации остаются в качестве запасных и используются только тогда, когда OpenSSL их не предоставляет.

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

  • PEP 697 – нестабильный уровень C API

  • PEP 683 – бессмертные объекты

Улучшения реализации CPython:

  • PEP 709 – встраивание генераторов списков

  • Поддержка CPython для профилировщика Linux perf

  • Реализация защиты от переполнения стека на поддерживаемых платформах

Новые возможности типизации:

Важные устаревания, удаления и ограничения:

  • PEP 623: удаление wstr из объектов Unicode в C API Python, что уменьшает размер каждого объекта str как минимум на 8 байт.

  • PEP 632: удаление пакета distutils. См. руководство по миграции для получения советов по замене предоставляемых им API. Сторонний пакет Setuptools продолжает предоставлять distutils, если он ещё требуется в Python 3.12 и новее.

  • gh-95299: не предустанавливать setuptools в виртуальные окружения, созданные с помощью venv. Это означает, что distutils, setuptools, pkg_resources и easy_install больше не будут доступны по умолчанию; чтобы получить к ним доступ, выполните pip install setuptools в активированном виртуальном окружении.

  • Модули asynchat, asyncore и imp были удалены вместе с несколькими unittest.TestCase псевдонимами методов.

Новые возможностиNew Features

PEP 695: Синтаксис параметров типаPEP 695: Type Parameter Syntax

Обобщённые классы и функции в рамках PEP 484 объявлялись с использованием многословного синтаксиса, который оставлял область видимости параметров типа неясной и требовал явных объявлений вариантности.

PEP 695 вводит новый, более компактный и явный способ создания обобщённых классов и функций:

def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

Кроме того, PEP вводит новый способ объявления псевдонимов типов с помощью оператора type, который создаёт экземпляр TypeAliasType:

type Point = tuple[float, float]

Псевдонимы типов также могут быть обобщёнными:

type Point[T] = tuple[T, T]

Новый синтаксис позволяет объявлять параметры TypeVarTuple и ParamSpec, а также параметры TypeVar с границами или ограничениями:

type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # TypeVar с границей
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # TypeVar с ограничениями

Значение псевдонимов типов, а также границы и ограничения переменных типов, созданных с помощью этого синтаксиса, вычисляются только по запросу (см. ленивые вычисления). Это означает, что псевдонимы типов могут ссылаться на другие типы, определённые далее в файле.

Параметры типов, объявленные через список параметров типов, видны в пределах области объявления и любых вложенных областей, но не во внешней области. Например, их можно использовать в аннотациях типов методов обобщённого класса или в теле класса. Однако их нельзя использовать на уровне модуля после определения класса. См. Списки параметров типов для подробного описания семантики параметров типов во время выполнения.

Для поддержки этой семантики областей видимости вводится новый вид области – область аннотаций. Области аннотаций по большей части ведут себя как области функций, но иначе взаимодействуют с охватывающими областями классов. В Python 3.13 аннотации также будут вычисляться в областях аннотаций.

Подробнее см. PEP 695.

(PEP написан Эриком Траутом. Реализация – Йелле Зейлстра, Эрик Траут и другие в gh-103764.)

PEP 701: Синтаксическая формализация f-строкPEP 701: Syntactic formalization of f-strings

PEP 701 снимает некоторые ограничения на использование f-строк. Выражения внутри f-строк теперь могут быть любыми допустимыми выражениями Python, включая строки, использующие те же кавычки, что и содержащая f-строка, многострочные выражения, комментарии, обратную косую черту и управляющие последовательности Unicode. Рассмотрим их подробнее:

  • Повторное использование кавычек: в Python 3.11 повторное использование тех же кавычек, что и в окружающей f-строке, вызывает SyntaxError, вынуждая пользователя использовать другие доступные кавычки (например, двойные или тройные, если f-строка использует одинарные). В Python 3.12 теперь можно делать так:

    >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
    >>> f"This is the playlist: {", ".join(songs)}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    

    Обратите внимание, что до этого изменения не было явного ограничения на вложенность f-строк, но тот факт, что кавычки строк нельзя было повторно использовать внутри выражения f-строк, делал невозможным произвольную вложенность f-строк. Фактически, вот самая вложенная f-строка, которую можно было написать:

    >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
    '2'
    

    Поскольку теперь f-строки могут содержать любые допустимые выражения Python внутри компонентов выражений, стало возможным вкладывать f-строки произвольно:

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
    
  • Многострочные выражения и комментарии: в Python 3.11 выражения в f-строках должны были определяться в одной строке, даже если само выражение обычно может занимать несколько строк (например, литералы списков, определяемые на нескольких строках), что затрудняло их чтение. В Python 3.12 теперь можно определять f-строки, занимающие несколько строк, и добавлять встроенные комментарии:

    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • Обратная косая черта и символы Unicode: до Python 3.12 выражения f-строк не могли содержать символ \. Это также затрагивало управляющие последовательности Unicode (такие как \N{snowman}), поскольку они содержат часть \N, которая ранее не могла быть частью компонентов выражений f-строк. Теперь можно определять выражения так:

    >>> print(f"This is the playlist: {"\n".join(songs)}")
    This is the playlist: Take me back to Eden
    Alkaline
    Ascensionism
    >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
    This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
    

Подробнее см. PEP 701.

Положительным побочным эффектом реализации этой функции (парсинг f-строк с помощью PEG-парсера) стало то, что сообщения об ошибках для f-строк теперь более точны и включают точное местоположение ошибки. Например, в Python 3.11 следующая f-строка вызывает SyntaxError:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?

но сообщение об ошибке не включает точное местоположение ошибки в строке, а также искусственно окружает выражение скобками. В Python 3.12, поскольку f-строки парсятся с помощью PEG-парсера, сообщения об ошибках могут быть более точными и показывать всю строку:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    my_string = f"{x z y}" + f"{1 + 1}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

(Авторы: Пабло Галиндо, Батухан Таская, Лисандрос Николау, Кристиан Маурейра-Фредес и Марта Гомес в gh-102856. PEP написан Пабло Галиндо, Батуханом Таскаей, Лисандросом Николау и Мартой Гомес).

PEP 684: GIL для каждого интерпретатораPEP 684: A Per-Interpreter GIL

PEP 684 вводит GIL для каждого интерпретатора, так что теперь можно создавать под-интерпретаторы с уникальным GIL для каждого интерпретатора. Это позволяет программам на Python полностью использовать преимущества нескольких ядер CPU. В настоящее время это доступно только через C-API, хотя Python API ожидается в 3.13.

Используйте новую функцию Py_NewInterpreterFromConfig() для создания интерпретатора с собственным GIL:

PyInterpreterConfig config = {
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
    return -1;
}
/* Новый интерпретатор теперь активен в текущем потоке. */

Дополнительные примеры использования C-API для под-интерпретаторов с GIL для каждого интерпретатора см. в Modules/_xxsubinterpretersmodule.c.

(Автор: Эрик Сноу в gh-104210 и др.)

PEP 669: Мониторинг с низким воздействием для CPythonPEP 669: Low impact monitoring for CPython

PEP 669 определяет новый API для профилировщиков, отладчиков и других инструментов для мониторинга событий в CPython. Он охватывает широкий спектр событий, включая вызовы, возвраты, строки, исключения, переходы и другое. Это означает, что вы платите только за то, что используете, что обеспечивает поддержку отладчиков и инструментов покрытия с почти нулевыми издержками. Подробнее см. sys.monitoring.

(Автор: Марк Шеннон в gh-103082.)

PEP 688: Доступность протокола буфера в PythonPEP 688: Making the buffer protocol accessible in Python

PEP 688 вводит способ использования протокола буфера из кода Python. Классы, реализующие метод __buffer__(), теперь могут использоваться как буферные типы.

Новый collections.abc.Buffer ABC предоставляет стандартный способ представления буферных объектов, например, в аннотациях типов. Новое перечисление inspect.BufferFlags представляет флаги, которые можно использовать для настройки создания буфера. (Автор: Йелле Зейлстра в gh-102500.)

PEP 709: Встраивание генераторов списков, словарей и множествPEP 709: Comprehension inlining

Генераторы словарей, списков и множеств теперь встраиваются, а не создают новый одноразовый объект функции при каждом выполнении генератора. Это ускоряет выполнение генератора до двух раз. Подробнее см. PEP 709.

Переменные итерации генераторов остаются изолированными и не перезаписывают переменную с тем же именем во внешней области, а также не видны после завершения генератора. Встраивание приводит к нескольким заметным изменениям поведения:

  • В tracebacks больше нет отдельного кадра для включения, и трассировка/профилирование больше не отображают включение как вызов функции.

  • Модуль symtable больше не будет создавать дочерние таблицы символов для каждого включения; вместо этого локальные переменные включения будут включены в таблицу символов родительской функции.

  • Вызов locals() внутри включения теперь включает переменные из внешней области видимости и больше не включает синтетическую переменную .0 для «аргумента» включения.

  • Включение, выполняющее итерацию непосредственно по locals() (например, [k for k in locals()]), может вызвать «RuntimeError: dictionary changed size during iteration» при выполнении под трассировкой (например, измерение покрытия кода). Это то же поведение, которое уже наблюдается, например, в for k in locals():. Чтобы избежать ошибки, сначала создайте список ключей для итерации: keys = list(locals()); [k for k in keys].

(Предложено Карлом Мейером и Владимиром Матвеевым в PEP 709.)

Улучшенные сообщения об ошибкахImproved Error Messages

  • Модули из стандартной библиотеки теперь могут предлагаться в составе сообщений об ошибках, выводимых интерпретатором, когда NameError возбуждается на верхнем уровне. (Предложено Пабло Галиндо в gh-98254.)

    >>> sys.version_info
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'sys' is not defined. Did you forget to import 'sys'?
    
  • Улучшено предложение по ошибке для исключений NameError для экземпляров. Теперь, если NameError возбуждается в методе и экземпляр имеет атрибут, точно совпадающий с именем в исключении, предложение будет включать self.<NAME> вместо ближайшего совпадения в области видимости метода. (Предложено Пабло Галиндо в gh-99139.)

    >>> class A:
    ...    def __init__(self):
    ...        self.blech = 1
    ...
    ...    def foo(self):
    ...        somethin = blech
    ...
    >>> A().foo()
    Traceback (most recent call last):
      File "<stdin>", line 1
        somethin = blech
                   ^^^^^
    NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
    
  • Улучшено сообщение об ошибке SyntaxError, когда пользователь вводит import x from y вместо from y import x. (Предложено Пабло Галиндо в gh-98931.)

    >>> import a.y.z from b.y.z
    Traceback (most recent call last):
      File "<stdin>", line 1
        import a.y.z from b.y.z
        ^^^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: Did you mean to use 'from ... import ...' instead?
    
  • Исключения ImportError, возникающие из-за неудачных операторов from <module> import <name>, теперь включают предложения для значения <name> на основе доступных имён в <module>. (Предложено Пабло Галиндо в gh-91058.)

    >>> from collections import chainmap
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
    

Прочие изменения языка Other Language Changes

  • Парсер теперь возбуждает SyntaxError при разборе исходного кода, содержащего нулевые байты. (Предложено Пабло Галиндо в gh-96670.)

  • Пара символов «обратная косая черта + символ», не являющаяся допустимой управляющей последовательностью, теперь генерирует SyntaxWarning вместо DeprecationWarning. Например, re.compile("\d+\.\d+") теперь генерирует SyntaxWarning ("\d" – недопустимая управляющая последовательность; используйте сырые строки для регулярного выражения: re.compile(r"\d+\.\d+")). В будущей версии Python вместо SyntaxWarning будет возбуждаться SyntaxError. (Предложено Victor Stinner в gh-98401.)

  • Восьмеричные escape-последовательности со значением больше 0o377 (например, "\477"), устаревшие в Python 3.11, теперь вызывают SyntaxWarning вместо DeprecationWarning. В будущей версии Python они будут вызывать SyntaxError. (Предложено Victor Stinner в gh-98401.)

  • Переменные, используемые в целевой части включений, но не сохраняемые, теперь можно использовать в выражениях присваивания (:=). Например, в [(b := 1) for a, b.prop in some_iter] теперь разрешено присваивание b. Обратите внимание, что присваивание переменным, сохраняемым в целевой части включений (например, a), по-прежнему запрещено в соответствии с PEP 572. (Предложено Nikita Sobolev в gh-100581.)

  • Исключения, возбуждённые в методе __set_name__ класса или типа, больше не оборачиваются в RuntimeError. Контекстная информация добавляется к исключению в виде примечания PEP 678. (Предложено Irit Katriel в gh-77757.)

  • Когда конструкция try-except* обрабатывает всё исключение ExceptionGroup и возбуждает другое исключение, это исключение больше не оборачивается в ExceptionGroup. Также изменено в версии 3.11.4. (Предложено Irit Katriel в gh-103590.)

  • Сборщик мусора теперь запускается только по механизму eval breaker цикла выполнения байткода Python, а не при выделении объектов. GC также может запускаться при вызове PyErr_CheckSignals(), так что C-расширения, которым необходимо долго работать без выполнения какого-либо кода Python, также имеют возможность периодически запускать GC. (Предложено Пабло Галиндо в gh-97922.)

  • Все встроенные и расширенные вызываемые объекты, ожидающие логические параметры, теперь принимают аргументы любого типа вместо только bool и int. (Предложено Serhiy Storchaka в gh-60203.)

  • memoryview теперь поддерживает тип half-float (код формата «e»). (Предложено Donghee Na и Antoine Pitrou в gh-90751.)

  • Объекты slice теперь хешируемы, что позволяет использовать их в качестве ключей словарей и элементов множеств. (Предложено Will Bradshaw, Furkan Onder и Raymond Hettinger в gh-101264.)

  • sum() теперь использует суммирование Ноймайера для повышения точности и коммутативности при суммировании чисел с плавающей точкой или смешанных целых чисел и чисел с плавающей точкой. (Предложено Raymond Hettinger в gh-100425.)

  • ast.parse() теперь возбуждает SyntaxError вместо ValueError при разборе исходного кода, содержащего нулевые байты. (Предложено Пабло Галиндо в gh-96670.)

  • Методы извлечения в tarfile и shutil.unpack_archive() теперь имеют новый аргумент filter, который позволяет ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. фильтры извлечения tarfile. В Python 3.14 значение по умолчанию изменится на 'data'. (Предложено Петром Викториным в PEP 706.)

  • Экземпляры types.MappingProxyType теперь хешируются, если хешируется нижележащее отображение. (Предложено Сергием Сторчакой в gh-87995.)

  • Добавлена поддержка профилировщика perf через новую переменную окружения PYTHONPERFSUPPORT и опцию командной строки -X perf, а также новые функции sys.activate_stack_trampoline(), sys.deactivate_stack_trampoline() и sys.is_stack_trampoline_active(). (Дизайн Пабло Галиндо. Предложено Пабло Галиндо и Кристианом Хаймсом при участии Грегори П. Смита [Google] и Марка Шеннона в gh-96123.)

Новые модулиNew Modules

  • Нет.

Улучшенные модулиImproved Modules

array

asyncio

  • Производительность записи в сокеты в asyncio была значительно улучшена. asyncio теперь избегает ненужного копирования при записи в сокеты и использует sendmsg(), если платформа это поддерживает. (Предложено Кумаром Адитья в gh-91166.)

  • Добавлены функции asyncio.eager_task_factory() и asyncio.create_eager_task_factory(), позволяющие перевести цикл событий в режим нетерпеливого выполнения задач, что ускоряет некоторые сценарии использования в 2–5 раз. (Предложено Джейкобом Бауэром и Итамаром Ореном в gh-102853, gh-104140 и gh-104138)

  • В Linux asyncio по умолчанию использует asyncio.PidfdChildWatcher, если os.pidfd_open() доступен и работоспособен, вместо asyncio.ThreadedChildWatcher. (Предложено Кумаром Адитья в gh-98024.)

  • Цикл событий теперь использует лучший доступный наблюдатель дочерних процессов для каждой платформы (asyncio.PidfdChildWatcher, если поддерживается, иначе asyncio.ThreadedChildWatcher), поэтому настраивать наблюдателя вручную не рекомендуется. (Предложено Кумаром Адитья в gh-94597.)

  • Добавлен параметр loop_factory в asyncio.run(), позволяющий указать пользовательскую фабрику циклов событий. (Предложено Кумаром Адитья в gh-99388.)

  • Добавлена реализация asyncio.current_task() на C для ускорения в 4–6 раз. (Предложено Итамаром Ореном и Пранавом Туласирамом Бхатом в gh-100344.)

  • asyncio.iscoroutine() теперь возвращает False для генераторов, поскольку asyncio не поддерживает устаревшие корутины на основе генераторов. (Предложено Кумаром Адитья в gh-102748.)

  • asyncio.wait() и asyncio.as_completed() теперь принимают генераторы, порождающие задачи. (Предложено Кумаром Адитья в gh-78530.)

calendar

  • Добавлены перечисления calendar.Month и calendar.Day, определяющие месяцы года и дни недели. (Предложено Принсом Рошаном в gh-103636.)

csv

dis

  • Псевдоинструкции (коды операций, используемые компилятором, но не появляющиеся в исполняемом байт-коде) теперь доступны в модуле dis. HAVE_ARGUMENT по-прежнему относится к реальным кодам операций, но не подходит для псевдоинструкций. Вместо этого используйте новую коллекцию dis.hasarg. (Предложено Ирит Катриель в gh-94216.)

  • Добавлена коллекция dis.hasexc, обозначающая инструкции, которые устанавливают обработчик исключений. (Предложено Ирит Катриель в gh-94216.)

fractions

  • Объекты типа fractions.Fraction теперь поддерживают форматирование в стиле float. (Предложено Марком Дикинсоном в gh-100161.)

importlib.resources

inspect

itertools

  • Добавлена itertools.batched() для сбора элементов в кортежи равного размера, где последняя часть может быть короче остальных. (Автор: Raymond Hettinger в gh-98363.)

math

  • Добавлена math.sumprod() для вычисления суммы произведений. (Автор: Raymond Hettinger в gh-100485.)

  • Расширена math.nextafter() добавлением аргумента steps для перемещения на несколько шагов вверх или вниз за раз. (Авторы: Matthias Goergens, Mark Dickinson и Raymond Hettinger в gh-94906.)

os

  • Добавлена os.PIDFD_NONBLOCK для открытия файлового дескриптора для процесса с помощью os.pidfd_open() в неблокирующем режиме. (Автор: Kumar Aditya в gh-93312.)

  • os.DirEntry теперь включает метод os.DirEntry.is_junction() для проверки, является ли запись точкой соединения (junction). (Автор: Charles Machalow в gh-99547.)

  • Добавлены функции os.listdrives(), os.listvolumes() и os.listmounts() для Windows для перечисления дисков, томов и точек подключения. (Автор: Steve Dower в gh-102519.)

  • os.stat() и os.lstat() теперь точнее работают в Windows. Поле st_birthtime теперь будет заполняться временем создания файла, а st_ctime устарело, но пока содержит время создания (в будущем будет возвращать время последнего изменения метаданных, для согласованности с другими платформами). st_dev может быть до 64 бит, а st_ino – до 128 бит в зависимости от файловой системы; st_rdev теперь всегда равно нулю вместо некорректных значений. Обе функции могут работать значительно быстрее в новых версиях Windows. (Автор: Steve Dower в gh-99726.)

os.path

  • Добавлена os.path.isjunction() для проверки, является ли заданный путь точкой соединения (junction). (Автор: Charles Machalow в gh-99547.)

  • Добавлена os.path.splitroot() для разбиения пути на триаду (drive, root, tail). (Автор: Barney Gale в gh-101000.)

pathlib

  • Добавлена поддержка создания подклассов pathlib.PurePath и pathlib.Path, а также их вариантов для Posix и Windows. Подклассы могут переопределять метод pathlib.PurePath.with_segments() для передачи информации между экземплярами путей.

  • Добавлена pathlib.Path.walk() для обхода деревьев каталогов и генерации всех имён файлов и каталогов внутри них, аналогично os.walk(). (Автор: Stanislav Zmiev в gh-90385.)

  • Добавлен необязательный параметр walk_up к pathlib.PurePath.relative_to(), позволяющий включать в результат записи ..; такое поведение более согласовано с os.path.relpath(). (Автор: Domenico Ragusa в gh-84538.)

  • Добавлена pathlib.Path.is_junction() как прокси для os.path.isjunction(). (Автор: Charles Machalow в gh-99547.)

  • Добавлен необязательный параметр case_sensitive в pathlib.Path.glob(), pathlib.Path.rglob() и pathlib.PurePath.match() для учёта регистра символов в пути, что позволяет более точно управлять процессом сопоставления.

platform

  • Добавлена поддержка обнаружения Windows 11 и выпусков Windows Server после 2012. Ранее запросы на платформах Windows Server новее Windows Server 2012 и на Windows 11 возвращали Windows-10. (Автор: Steve Dower в gh-89545.)

pdb

  • Добавлены удобные переменные для временного хранения значений во время сеанса отладки и для быстрого доступа к таким значениям, как текущий фрейм или возвращаемое значение. (Автор: Tian Gao в gh-103693.)

random

shutil

  • shutil.make_archive() теперь передаёт аргумент root_dir пользовательским архиваторам, которые его поддерживают. В этом случае он больше не меняет временно текущую рабочую директорию процесса на root_dir для выполнения архивации. (Автор: Serhiy Storchaka в gh-74696.)

  • shutil.rmtree() теперь принимает новый аргумент onexc – обработчик ошибок, подобный onerror, но принимающий экземпляр исключения вместо тройки (typ, val, tb). onerror устарел. (Автор: Irit Katriel в gh-102828.)

  • shutil.which() теперь обращается к переменной окружения PATHEXT для поиска совпадений в PATH в Windows, даже если заданный cmd содержит компонент пути. (Автор: Charles Machalow в gh-103179.)

    shutil.which() будет вызывать NeedCurrentDirectoryForExePathW при поиске исполняемых файлов в Windows, чтобы определить, нужно ли добавлять текущую рабочую директорию в начало пути поиска. (Автор: Charles Machalow в gh-103179.)

    shutil.which() будет возвращать путь, соответствующий cmd, с компонентом из PATHEXT до прямого совпадения в другом месте пути поиска в Windows. (Автор: Charles Machalow, gh-103179.)

sqlite3

statistics

  • Расширен statistics.correlation(): добавлен метод ranked для вычисления корреляции Спирмена для ранжированных данных. (Автор: Raymond Hettinger, gh-95861.)

sys

  • Добавлено пространство имён sys.monitoring для предоставления нового API мониторинга PEP 669. (Автор: Mark Shannon, gh-103082.)

  • Добавлены sys.activate_stack_trampoline() и sys.deactivate_stack_trampoline() для активации и деактивации трамплинов профилировщика стека, а также sys.is_stack_trampoline_active() для проверки, активны ли трамплины профилировщика стека. (Авторы: Pablo Galindo и Christian Heimes при участии Gregory P. Smith [Google] и Mark Shannon, gh-96123.)

  • Добавлен sys.last_exc, содержащий последнее необработанное исключение (для посмертной отладки). Объявлены устаревшими три поля, содержащие ту же информацию в устаревшей форме: sys.last_type, sys.last_value и sys.last_traceback. (Автор: Irit Katriel, gh-102778.)

  • sys._current_exceptions() теперь возвращает отображение от идентификатора потока к экземпляру исключения, а не к кортежу (typ, exc, tb). (Автор: Irit Katriel в gh-103176.)

  • sys.setrecursionlimit() и sys.getrecursionlimit(). Ограничение рекурсии теперь применяется только к коду Python. Встроенные функции не используют ограничение рекурсии, но защищены другим механизмом, который предотвращает крах виртуальной машины из-за рекурсии.

tempfile

  • Функция tempfile.NamedTemporaryFile получила новый необязательный параметр delete_on_close (Автор: Evgeny Zorin, gh-58451.)

  • tempfile.mkdtemp() теперь всегда возвращает абсолютный путь, даже если аргумент, переданный параметру dir, является относительным путём.

threading

tkinter

  • tkinter.Canvas.coords() теперь выравнивает свои аргументы. Он теперь принимает не только координаты как отдельные аргументы (x1, y1, x2, y2, ...) и последовательность координат ([x1, y1, x2, y2, ...]), но и координаты, сгруппированные попарно ((x1, y1), (x2, y2), ... и [(x1, y1), (x2, y2), ...]), как методы create_*(). (Автор: Serhiy Storchaka, gh-94473.)

tokenize

  • Модуль tokenize включает изменения, внесённые в PEP 701. (Авторы: Marta Gómez Macías и Pablo Galindo, gh-102856.) См. Перенос на Python 3.12 для получения дополнительной информации об изменениях в модуле tokenize.

types

typing

  • Проверки isinstance() на соответствие runtime-checkable protocols теперь используют inspect.getattr_static() вместо hasattr() для поиска существования атрибутов. Это означает, что дескрипторы и методы __getattr__() больше не вычисляются неожиданно во время проверок isinstance() на соответствие протоколам, проверяемым во время выполнения. Однако это также может означать, что некоторые объекты, которые ранее считались экземплярами проверяемого протокола, могут перестать считаться таковыми в Python 3.12+ и наоборот. Скорее всего, это изменение не затронет большинство пользователей. (Автор: Alex Waygood, gh-102433.)

  • Члены проверяемого протокола теперь считаются «замороженными» во время выполнения сразу после создания класса. Динамическое добавление атрибутов (monkey-patching) в проверяемый протокол по-прежнему будет работать, но не повлияет на результат проверок isinstance() при сравнении объектов с протоколом. Например:

    >>> from typing import Protocol, runtime_checkable
    >>> @runtime_checkable
    ... class HasX(Protocol):
    ...     x = 1
    ...
    >>> class Foo: ...
    ...
    >>> f = Foo()
    >>> isinstance(f, HasX)
    False
    >>> f.x = 1
    >>> isinstance(f, HasX)
    True
    >>> HasX.y = 2
    >>> isinstance(f, HasX)  # не изменилось, хотя теперь у HasX есть атрибут "y"
    True
    

    Это изменение было сделано для ускорения проверок isinstance() на соответствие протоколам, проверяемым во время выполнения.

  • Производительность проверок isinstance() на соответствие runtime-checkable protocols существенно изменилась. Большинство проверок isinstance() на соответствие протоколам, содержащим лишь несколько членов, должны работать как минимум в 2 раза быстрее, чем в 3.11, а некоторые – в 20 раз быстрее или более. Однако проверки isinstance() на соответствие протоколам с большим количеством членов могут работать медленнее, чем в Python 3.11. (Автор: Alex Waygood, gh-74690 и gh-103193.)

  • Все классы typing.TypedDict и typing.NamedTuple теперь имеют атрибут __orig_bases__. (Автор: Adrian Garcia Badaracco, gh-103699.)

  • Добавлен параметр frozen_default в typing.dataclass_transform(). (Автор: Erik De Bonte, gh-99957.)

unicodedata

  • База данных Unicode обновлена до версии 15.0.0. (Предложено Benjamin Peterson в gh-96734).

unittest

Добавлена опция командной строки --durations, показывающая N самых медленных тестов:

python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s     test_timeout (Lib.test.test_threading.EventTests)

(0.000 durations hidden.  Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s

OK (skipped=3)

(Предложено Giampaolo Rodola в gh-48330)

uuid

ОптимизацииOptimizations

  • Удалены элементы wstr и wstr_length из объектов Unicode. Это уменьшает размер объекта на 8 или 16 байт на 64‑битной платформе. (PEP 623) (Автор: Inada Naoki в gh-92536.)

  • Добавлена экспериментальная поддержка использования бинарного оптимизатора BOLT в процессе сборки, что повышает производительность на 1–5%. (Автор: Kevin Modzelewski в gh-90536, доработано Donghee Na в gh-101525)

  • Ускорена замена регулярных выражений (функции re.sub() и re.subn() и соответствующие методы re.Pattern) для строк замены, содержащих ссылки на группы, в 2–3 раза. (Автор: Serhiy Storchaka в gh-91524.)

  • Ускорено создание asyncio.Task за счёт откладывания дорогостоящего форматирования строк. (Автор: Itamar Oren в gh-103793.)

  • Функции tokenize.tokenize() и tokenize.generate_tokens() стали до 64% быстрее как побочный эффект изменений, необходимых для поддержки PEP 701 в модуле tokenize. (Авторы: Marta Gómez Macías и Pablo Galindo в gh-102856.)

  • Ускорены вызовы методов super() и загрузка атрибутов с помощью новой инструкции LOAD_SUPER_ATTR. (Авторы: Carl Meyer и Vladimir Matveev в gh-103497.)

Изменения байткода CPythonCPython bytecode changes

  • Удалена инструкция LOAD_METHOD. Она была объединена с LOAD_ATTR. Теперь LOAD_ATTR будет вести себя как старая инструкция LOAD_METHOD, если установлен младший бит её oparg. (Автор: Ken Jin в gh-93429.)

  • Удалены инструкции JUMP_IF_FALSE_OR_POP и JUMP_IF_TRUE_OR_POP. (Автор: Irit Katriel в gh-102859.)

  • Удалена инструкция PRECALL. (Автор: Mark Shannon в gh-92925.)

  • Добавлены инструкции BINARY_SLICE и STORE_SLICE. (Автор: Mark Shannon в gh-94163.)

  • Добавлена инструкция CALL_INTRINSIC_1. (Автор: Mark Shannon в gh-99005.)

  • Добавлена инструкция CALL_INTRINSIC_2. (Автор: Irit Katriel в gh-101799.)

  • Добавлена инструкция CLEANUP_THROW. (Автор: Brandt Bucher в gh-90997.)

  • Добавлена инструкция END_SEND. (Автор: Mark Shannon в gh-103082.)

  • Добавлена инструкция LOAD_FAST_AND_CLEAR в рамках реализации PEP 709. (Автор: Carl Meyer в gh-101441.)

  • Добавлена инструкция LOAD_FAST_CHECK. (Автор: Dennis Sweeney в gh-93143.)

  • Добавлены опкоды LOAD_FROM_DICT_OR_DEREF, LOAD_FROM_DICT_OR_GLOBALS и LOAD_LOCALS в рамках реализации PEP 695. Удалён опкод LOAD_CLASSDEREF, который можно заменить на LOAD_LOCALS плюс LOAD_FROM_DICT_OR_DEREF. (Автор: Jelle Zijlstra в gh-103764.)

  • Добавлена инструкция LOAD_SUPER_ATTR. (Авторы: Carl Meyer и Vladimir Matveev в gh-103497.)

  • Добавлена инструкция RETURN_CONST. (Автор: Wenyang Wang в gh-101632.)

Демонстрации и инструментыDemos and Tools

  • Удалён каталог Tools/demo/, содержащий старые демонстрационные скрипты. Копию можно найти в old-demos project. (Автор: Victor Stinner в gh-97681.)

  • Удалены устаревшие примеры скриптов из каталога Tools/scripts/. Копию можно найти в old-demos project. (Автор: Victor Stinner в gh-97669.)

УстарелоDeprecated

  • argparse: Параметры type, choices и metavar функции argparse.BooleanOptionalAction устарели и будут удалены в версии 3.14. (Автор: Nikita Sobolev в gh-92248.)

  • ast: Следующие возможности ast были объявлены устаревшими в документации начиная с Python 3.8, теперь вызывают DeprecationWarning во время выполнения при доступе или использовании и будут удалены в Python 3.14:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Вместо этого используйте ast.Constant. (Автор: Serhiy Storchaka в gh-90953.)

  • asyncio:

  • calendar: константы calendar.January и calendar.February устарели и заменены на calendar.JANUARY и calendar.FEBRUARY. (Автор: Prince Roshan в gh-103636.)

  • collections.abc: Устарело collections.abc.ByteString.

    Используйте isinstance(obj, collections.abc.Buffer) для проверки, реализует ли obj буферный протокол во время выполнения. Для использования в аннотациях типов используйте Buffer или объединение, которое явно указывает типы, поддерживаемые вашим кодом (например, bytes | bytearray | memoryview).

    ByteString изначально задумывался как абстрактный класс, который должен был быть супертипом как для bytes, так и для bytearray. Однако, поскольку ABC никогда не имел методов, знание того, что объект является экземпляром ByteString, никогда не давало полезной информации об объекте. Другие распространённые буферные типы, такие как memoryview, также никогда не рассматривались как подтипы ByteString (ни во время выполнения, ни статическими проверками типов).

    См. PEP 688 для получения подробностей. (Автор: Shantanu Jain в gh-91896.)

  • datetime: У datetime.datetime utcnow() и utcfromtimestamp() устарели и будут удалены в будущей версии. Вместо этого используйте объекты, учитывающие часовой пояс, для представления дат и времени в UTC: соответственно вызывайте now() и fromtimestamp() с параметром tz, установленным в datetime.UTC. (Автор: Paul Ganssle в gh-103857.)

  • email: Устарел параметр isdst в email.utils.localtime(). (Автор: Alan Williams в gh-72346.)

  • importlib.abc: Устарели следующие классы, запланированные к удалению в Python 3.14:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Вместо них используйте классы importlib.resources.abc:

    (Авторы: Jason R. Coombs и Hugo van Kemenade в gh-93963.)

  • itertools: Устарела поддержка операций copy, deepcopy и pickle, которая была недокументированной, неэффективной, исторически содержала ошибки и была непоследовательной. Это будет удалено в 3.14 для значительного сокращения объёма кода и нагрузки на поддержку. (Автор: Raymond Hettinger в gh-101588.)

  • multiprocessing: В Python 3.14 метод запуска по умолчанию multiprocessing изменится на более безопасный в Linux, BSD и других POSIX-платформах, отличных от macOS, где в настоящее время 'fork' используется по умолчанию (gh-84559). Добавление предупреждения во время выполнения было признано слишком разрушительным, поскольку большинство кода, как ожидается, не будет этим затронуто. Используйте API get_context() или set_start_method(), чтобы явно указать, когда ваш код требует 'fork'. См. контексты и методы запуска.

  • pkgutil: pkgutil.find_loader() и pkgutil.get_loader() устарели и будут удалены в Python 3.14; используйте importlib.util.find_spec() вместо них. (Автор: Nikita Sobolev в gh-97850.)

  • pty: Модуль содержит две недокументированные функции master_open() и slave_open(), которые были устаревшими начиная с Python 2, но получили надлежащий DeprecationWarning только в 3.12. Удалите их в 3.14. (Авторы: Soumendra Ganguly и Gregory P. Smith в gh-85984.)

  • os:

    • Поля st_ctime, возвращаемые os.stat() и os.lstat() в Windows, устарели. В будущем выпуске они будут содержать время последнего изменения метаданных, в соответствии с другими платформами. Пока же они по-прежнему содержат время создания, которое также доступно в новом поле st_birthtime. (Автор: Steve Dower в gh-99726.)

    • На POSIX-платформах os.fork() теперь может вызывать DeprecationWarning, когда обнаруживает, что вызван из многопоточного процесса. При этом всегда существовала фундаментальная несовместимость с платформой POSIX. Даже если такой код казался работающим. Мы добавили предупреждение для повышения осведомлённости, так как проблемы, с которыми сталкивается код, делающий это, становятся всё более частыми. Подробнее см. документацию os.fork(), а также это обсуждение несовместимости fork с потоками, чтобы понять почему мы сейчас выявляем эту давнюю проблему совместимости платформ для разработчиков.

    Когда это предупреждение появляется из-за использования multiprocessing или concurrent.futures, исправление состоит в том, чтобы использовать другой метод запуска multiprocessing, например "spawn" или "forkserver".

  • shutil: Аргумент onerror функции shutil.rmtree() устарел; используйте onexc вместо него. (Автор: Irit Katriel в gh-102828.)

  • sqlite3:

  • sys: Поля sys.last_type, sys.last_value и sys.last_traceback устарели. Используйте sys.last_exc вместо них. (Автор: Irit Katriel в gh-102778.)

  • tarfile: Извлечение tar-архивов без указания filter устарело до Python 3.14, когда фильтр 'data' станет использоваться по умолчанию. Подробнее см. Фильтры извлечения.

  • typing:

  • xml.etree.ElementTree: Модуль теперь вызывает DeprecationWarning при проверке истинностного значения xml.etree.ElementTree.Element. Ранее реализация на Python вызывала FutureWarning, а реализация на C не вызывала ничего. (Автор: Jacob Walls в gh-83122.)

  • Сигнатуры с тремя аргументами (type, value, traceback) функций coroutine throw(), generator throw() и async generator throw() устарели и могут быть удалены в будущей версии Python. Вместо них используйте версии этих функций с одним аргументом. (Автор: Ofey Chan в gh-89874.)

  • DeprecationWarning теперь вызывается, когда __package__ модуля отличается от __spec__.parent (ранее вызывалось ImportWarning). (Автор: Brett Cannon в gh-65961.)

  • Установка __package__ или __cached__ для модуля устарела и перестанет устанавливаться или учитываться системой импорта в Python 3.14. (Автор: Brett Cannon в gh-65961.)

  • Побитовый оператор инверсии (~) для bool устарел. Он будет вызывать ошибку в Python 3.16. Вместо этого используйте not для логического отрицания bool. В редком случае, когда вам действительно нужна побитовая инверсия базового int, явно преобразуйте в int: ~int(x). (Автор: Tim Hoffmann в gh-103487.)

  • Доступ к co_lnotab у объектов кода был объявлен устаревшим в Python 3.10 через PEP 626, но получил надлежащий DeprecationWarning только в 3.12. Может быть удалён в 3.15. (Автор: Nikita Sobolev в gh-101866.)

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

Модули (см. PEP 594):

  • aifc

  • audioop

  • cgi

  • cgitb

  • chunk

  • crypt

  • imghdr

  • mailcap

  • msilib

  • nis

  • nntplib

  • ossaudiodev

  • pipes

  • sndhdr

  • spwd

  • sunau

  • telnetlib

  • uu

  • xdrlib

Другие модули:

  • lib2to3 и программа 2to3 (gh-84540)

API:

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

Запланировано к удалению в 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:

Запланировано к удалению в 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:

    • asyncio.iscoroutinefunction() устарело и будет удалено в Python 3.16, используйте inspect.iscoroutinefunction() вместо него. (Авторы: Jiahao Li и Kumar Aditya в gh-122875.)

  • builtins:

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

  • shutil:

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

  • symtable:

  • sys:

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

Запланировано к удалению в будущих версияхPending Removal in Future Versions

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

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

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

    • Делегирование int() методу __trunc__().

    • Передача комплексного числа в качестве аргумента real или imag в конструкторе complex() теперь устарела; его следует передавать только как единственный позиционный аргумент. (Автор: Сергей Сторчака в gh-109218.)

  • calendar: константы calendar.January и calendar.February устарели и заменены на calendar.JANUARY и calendar.FEBRUARY. (Автор: Prince Roshan в gh-103636.)

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

  • unittest.IsolatedAsyncioTestCase: возврат значения, не являющегося None, из тестового примера устарел.

  • urllib.parse устаревшие функции: используйте urlparse() вместо них.

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • urllib.request: Стиль вызова запросов URLopener и FancyURLopener устарел. Используйте более новые функции и методы urlopen().

  • wsgiref: SimpleHandler.stdout.write() не должна выполнять частичную запись.

  • xml.etree.ElementTree: проверка истинностного значения Element устарела. В будущем выпуске она всегда будет возвращать True. Вместо этого используйте явные проверки len(elem) или elem is not None.

  • zipimport.zipimporter.load_module() устарело: используйте exec_module() вместо него.

УдаленоRemoved

asynchat и asyncoreasynchat and asyncore

  • Эти два модуля были удалены в соответствии с графиком в PEP 594, будучи объявлены устаревшими в Python 3.6. Используйте asyncio вместо этого. (Автор: Nikita Sobolev в gh-96580.)

configparser

  • Несколько имён, объявленных устаревшими в configparser ещё в 3.2, были удалены согласно gh-89336:

    • configparser.ParsingError больше не имеет атрибута filename или аргумента. Вместо этого используйте атрибут и аргумент source.

    • configparser больше не имеет класса SafeConfigParser. Вместо этого используйте более короткое имя ConfigParser.

    • configparser.ConfigParser больше не имеет метода readfp. Вместо этого используйте read_file().

distutils

  • Удалён пакет distutils. Он был объявлен устаревшим в Python 3.10 в PEP 632 «Deprecate distutils module». Для проектов, всё ещё использующих distutils и не имеющих возможности перейти на что-то другое, можно установить проект setuptools: он по-прежнему предоставляет distutils. (Автор: Victor Stinner в gh-92584.)

ensurepip

  • Удалена встроенная сборка setuptools (wheel) из ensurepip, и прекращена установка setuptools в окружениях, создаваемых venv.

    pip (>= 22.1) не требует установки setuptools в окружении. Пакеты на основе setuptoolsdistutils) по-прежнему можно использовать с pip install, поскольку pip предоставляет setuptools в среде сборки, которую он использует для сборки пакета.

    easy_install, pkg_resources, setuptools и distutils больше не предоставляются по умолчанию в окружениях, созданных с помощью venv или начальной загрузки с ensurepip, так как они являются частью пакета setuptools. Для проектов, полагающихся на них во время выполнения, проект setuptools следует объявить как зависимость и установить отдельно (обычно с помощью pip).

    (Автор: Pradyun Gedam в gh-95299.)

enum

  • Удалён EnumMeta.__getattr__ из enum, который больше не нужен для доступа к атрибутам enum. (Автор: Ethan Furman в gh-95083.)

ftplib

  • Удалён атрибут класса FTP_TLS.ssl_version из ftplib: используйте параметр context вместо него. (Автор: Victor Stinner в gh-94172.)

gzip

  • Удалён атрибут filename у gzip.GzipFile из gzip, устаревший с Python 2.6. Используйте атрибут name вместо него. В режиме записи атрибут filename добавлял расширение файла '.gz', если его не было. (Автор: Victor Stinner в gh-94196.)

hashlib

  • Удалена чистая реализация на Python для hashlib.pbkdf2_hmac() из hashlib, устаревшая в Python 3.10. Python 3.10 и новее требует OpenSSL 1.1.1 (PEP 644): эта версия OpenSSL предоставляет реализацию pbkdf2_hmac() на C, которая быстрее. (Автор: Victor Stinner в gh-94199.)

importlib

  • Многие ранее объявленные устаревшими изменения в importlib теперь завершены:

    • References to, and support for module_repr() has been removed. (Contributed by Barry Warsaw in gh-97850.)

    • importlib.util.set_package, importlib.util.set_loader и importlib.util.module_for_loader были удалены. (Авторы: Brett Cannon и Nikita Sobolev в gh-65961 и gh-97850.)

    • Поддержка API find_loader() и find_module() была удалена. (Автор: Barry Warsaw в gh-98040.)

    • importlib.abc.Finder, pkgutil.ImpImporter и pkgutil.ImpLoader были удалены. (Автор: Barry Warsaw в gh-98040.)

imp

  • Модуль imp был удалён. (Автор: Barry Warsaw в gh-98040.)

    Для миграции обратитесь к следующей таблице соответствия:

    imp

    importlib

    imp.NullImporter

    Вставьте None в sys.path_importer_cache

    imp.cache_from_source()

    importlib.util.cache_from_source()

    imp.find_module()

    importlib.util.find_spec()

    imp.get_magic()

    importlib.util.MAGIC_NUMBER

    imp.get_suffixes()

    importlib.machinery.SOURCE_SUFFIXES, importlib.machinery.EXTENSION_SUFFIXES и importlib.machinery.BYTECODE_SUFFIXES

    imp.get_tag()

    sys.implementation.cache_tag

    imp.load_module()

    importlib.import_module()

    imp.new_module(name)

    types.ModuleType(name)

    imp.reload()

    importlib.reload()

    imp.source_from_cache()

    importlib.util.source_from_cache()

    imp.load_source()

    См. ниже

    Замените imp.load_source() на:

    import importlib.util
    import importlib.machinery
    
    def load_source(modname, filename):
        loader = importlib.machinery.SourceFileLoader(modname, filename)
        spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
        module = importlib.util.module_from_spec(spec)
        # Модуль выполняется всегда и не кешируется в sys.modules.
        # Раскомментируйте следующую строку, чтобы закешировать модуль.
        # sys.modules[module.__name__] = module
        loader.exec_module(module)
        return module
    
  • Удалить imp функции и атрибуты без замены:

    • Недокументированные функции:

      • imp.init_builtin()

      • imp.load_compiled()

      • imp.load_dynamic()

      • imp.load_package()

    • imp.lock_held(), imp.acquire_lock(), imp.release_lock(): схема блокировки изменилась в Python 3.3 на блокировки для каждого модуля.

    • imp.find_module() константы: SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN, PY_CODERESOURCE, IMP_HOOK.

io

  • Удалить io io.OpenWrapper и _pyio.OpenWrapper, устаревшие в Python 3.10: вместо них используйте open(). Функция open() (io.open()) является встроенной функцией. Начиная с Python 3.10, _pyio.open() – тоже статический метод. (Автор изменения: Victor Stinner в gh-94169.)

locale

  • Удалить функцию locale.format() модуля locale, устаревшую в Python 3.7: используйте locale.format_string() вместо неё. (Автор изменения: Victor Stinner в gh-94226.)

smtpd

  • Модуль smtpd удалён в соответствии с графиком из PEP 594, который был устаревшим в Python 3.4.7 и 3.5.4. Вместо него используйте модуль PyPI aiosmtpd или любой другой сервер на основе asyncio. (Автор изменения: Oleg Iarygin в gh-93243.)

sqlite3

  • Следующие недокументированные возможности sqlite3, устаревшие в Python 3.10, теперь удалены:

    • sqlite3.enable_shared_cache()

    • sqlite3.OptimizedUnicode

    Если необходимо использовать общий кэш, открывайте базу данных в режиме URI, используя параметр запроса cache=shared.

    Текстовая фабрика sqlite3.OptimizedUnicode была псевдонимом для str начиная с Python 3.3. Код, который ранее устанавливал текстовую фабрику в OptimizedUnicode, может либо явно использовать str, либо полагаться на значение по умолчанию, которое также является str.

    (Автор изменения: Erlend E. Aasland в gh-92548.)

ssl

  • Удалить функцию ssl.RAND_pseudo_bytes() модуля ssl, устаревшую в Python 3.6: используйте os.urandom() или ssl.RAND_bytes() вместо неё. (Автор изменения: Victor Stinner в gh-94199.)

  • Удалить функцию ssl.match_hostname(). Она была устаревшей в Python 3.7. OpenSSL выполняет сопоставление имён хостов начиная с Python 3.7, и Python больше не использует функцию ssl.match_hostname(). (Автор изменения: Victor Stinner в gh-94199.)

  • Удалить функцию ssl.wrap_socket(), устаревшую в Python 3.7: вместо неё создайте объект ssl.SSLContext и вызовите его метод ssl.SSLContext.wrap_socket. Любой пакет, который всё ещё использует ssl.wrap_socket(), является неработоспособным и небезопасным. Эта функция не отправляет расширение SNI TLS и не проверяет имя сервера. Такой код подвержен CWE 295 (Некорректная проверка сертификата). (Автор изменения: Victor Stinner в gh-94199.)

unittest

webbrowser

  • Удалить поддержку устаревших браузеров из webbrowser. Удалённые браузеры включают: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird и Firefox версий 35 и ниже (gh-102871).

xml.etree.ElementTree

  • Удалить метод ElementTree.Element.copy() чистой реализации Python, устаревший в Python 3.10; вместо него используйте функцию copy.copy(). Реализация на C для xml.etree.ElementTree не имеет метода copy(), только метод __copy__(). (Автор изменения: Victor Stinner в gh-94383.)

zipimport

  • Удалите методы find_loader() и find_module() из zipimport, устаревшие в Python 3.10: вместо них используйте метод find_spec(). Обоснование – в PEP 451. (Автор: Victor Stinner в gh-94379.)

ДругиеOthers

  • Удалите правило suspicious из документации Makefile и Doc/tools/rstlint.py, оба заменены на sphinx-lint. (Автор: Julien Palard в gh-98179.)

  • Удалите параметры keyfile и certfile из модулей ftplib, imaplib, poplib и smtplib, а также параметры key_file, cert_file и check_hostname из модуля http.client, все устаревшие с Python 3.6. Вместо них используйте параметр context (ssl_context в imaplib). (Автор: Victor Stinner в gh-94172.)

  • Удалите хаки совместимости Jython из нескольких модулей стандартной библиотеки и тестов. (Автор: Nikita Sobolev в gh-99482.)

  • Удалите флаг _use_broken_old_ctypes_structure_semantics_ из модуля ctypes. (Автор: Nikita Sobolev в gh-99285.)

Перенос на Python 3.12Porting to Python 3.12

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

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

  • Теперь применяются более строгие правила для числовых ссылок на группы и имён групп в регулярных выражениях. В качестве числовой ссылки теперь принимается только последовательность цифр ASCII. Имя группы в байтовых шаблонах и строках замены теперь может содержать только буквы ASCII, цифры и символ подчёркивания. (Автор: Serhiy Storchaka в gh-91760.)

  • Удалена функциональность randrange(), устаревшая с Python 3.10. Ранее randrange(10.0) без потерь преобразовывался в randrange(10). Теперь он вызывает TypeError. Также исключение, возникающее для нецелых значений, таких как randrange(10.5) или randrange('10'), было заменено с ValueError на TypeError. Это также предотвращает ошибки, когда randrange(1e25) незаметно выбирал из большего диапазона, чем randrange(10**25). (Первоначально предложено Serhiy Storchaka gh-86388.)

  • argparse.ArgumentParser изменил кодировку и обработчик ошибок для чтения аргументов из файла (например, опция fromfile_prefix_chars) с кодировки текста по умолчанию (например, locale.getpreferredencoding(False)) на кодировку файловой системы и обработчик ошибок. Файлы аргументов должны быть закодированы в UTF-8 вместо кодовой страницы ANSI в Windows.

  • Удалите основанный на asyncore модуль smtpd, устаревший в Python 3.4.7 и 3.5.4. Рекомендуемая замена – основанный на asyncio модуль aiosmtpd из PyPI.

  • shlex.split(): Передача None в качестве аргумента s теперь вызывает исключение, а не читает sys.stdin. Эта возможность была объявлена устаревшей в Python 3.9. (Автор: Victor Stinner в gh-94352.)

  • Модуль os больше не принимает пути, подобные байтам, такие как типы bytearray и memoryview: для байтовых строк принимается только точный тип bytes. (Автор: Victor Stinner в gh-98393.)

  • syslog.openlog() и syslog.closelog() теперь завершаются ошибкой при использовании в подынтерпретаторах. syslog.syslog() всё ещё можно использовать в подынтерпретаторах, но теперь только если syslog.openlog() уже был вызван в главном интерпретаторе. Эти новые ограничения не применяются к главному интерпретатору, поэтому может быть затронут лишь очень небольшой круг пользователей. Это изменение улучшает изоляцию интерпретаторов. Кроме того, syslog является обёрткой вокруг глобальных ресурсов процесса, которыми лучше управлять из главного интерпретатора. (Автор: Donghee Na в gh-99127.)

  • Незадокументированное поведение блокировки cached_property() удалено, поскольку оно блокировало все экземпляры класса, что приводило к высокой конкуренции за блокировку. Это означает, что функция геттера кэшированного свойства теперь может выполняться более одного раза для одного экземпляра при состязании двух потоков. Для большинства простых кэшированных свойств (например, идемпотентных и просто вычисляющих значение на основе других атрибутов экземпляра) это не проблема. Если необходима синхронизация, реализуйте блокировку внутри функции геттера кэшированного свойства или вокруг точек многопоточного доступа.

  • sys._current_exceptions() теперь возвращает отображение от идентификатора потока к экземпляру исключения, а не к кортежу (typ, exc, tb). (Автор: Irit Katriel в gh-103176.)

  • При извлечении tar-файлов с помощью tarfile или shutil.unpack_archive() передавайте аргумент filter для ограничения возможностей, которые могут быть неожиданными или опасными. Подробнее см. Фильтры извлечения.

  • Вывод функций tokenize.tokenize() и tokenize.generate_tokens() теперь изменён из-за изменений, внесённых в PEP 701. Это означает, что токены STRING больше не генерируются для f-строк, а вместо них теперь создаются токены, описанные в PEP 701: FSTRING_START, FSTRING_MIDDLE и FSTRING_END теперь генерируются для «строковых» частей f-строк в дополнение к соответствующим токенам для токенизации в компонентах выражений. Например, для f-строки f"start {1+1} end" старая версия токенизатора выдавала:

    1,0-1,18:           STRING         'f"start {1+1} end"'
    

    тогда как новая версия выдаёт:

    1,0-1,2:            FSTRING_START  'f"'
    1,2-1,8:            FSTRING_MIDDLE 'start '
    1,8-1,9:            OP             '{'
    1,9-1,10:           NUMBER         '1'
    1,10-1,11:          OP             '+'
    1,11-1,12:          NUMBER         '1'
    1,12-1,13:          OP             '}'
    1,13-1,17:          FSTRING_MIDDLE ' end'
    1,17-1,18:          FSTRING_END    '"'
    

    Кроме того, могут быть некоторые незначительные изменения в поведении в результате изменений, необходимых для поддержки PEP 701. Некоторые из этих изменений включают:

    • Атрибут type токенов, выдаваемых при токенизации некоторых недопустимых символов Python, таких как !, изменился с ERRORTOKEN на OP.

    • Неполные однострочные строки теперь также вызывают tokenize.TokenError, как и неполные многострочные строки.

    • Некоторый неполный или недопустимый код Python теперь вызывает tokenize.TokenError вместо возврата произвольных токенов ERRORTOKEN при его токенизации.

    • Смешивание табуляции и пробелов для отступов в одном файле больше не поддерживается и вызовет TabError.

  • Модуль threading теперь ожидает, что модуль _thread будет иметь атрибут _is_main_interpreter. Это функция без аргументов, возвращающая True, если текущий интерпретатор является главным.

    Любая библиотека или приложение, предоставляющее пользовательский модуль _thread, должно предоставлять _is_main_interpreter(). (См. gh-112826.)

Изменения сборкиBuild Changes

  • Python больше не использует setup.py для сборки разделяемых модулей расширения C. Параметры сборки, такие как заголовки и библиотеки, определяются в скрипте configure. Расширения собираются с помощью Makefile. Большинство расширений используют pkg-config и возвращаются к ручному определению. (Автор: Christian Heimes в gh-93939.)

  • va_start() с двумя параметрами, например va_start(args, format),, теперь требуется для сборки Python. va_start() больше не вызывается с одним параметром. (Автор: Kumar Aditya в gh-93207.)

  • CPython теперь использует опцию ThinLTO в качестве политики оптимизации времени компоновки по умолчанию, если компилятор Clang принимает этот флаг. (Автор: Donghee Na в gh-89536.)

  • Добавлена переменная COMPILEALL_OPTS в Makefile для переопределения параметров compileall (по умолчанию: -j0) в make install. Также три команды compileall объединены в одну команду для сборки .pyc-файлов для всех уровней оптимизации (0, 1, 2) сразу. (Автор: Victor Stinner в gh-99289.)

  • Добавлены тройки платформ для 64-битной архитектуры LoongArch:

    • loongarch64-linux-gnusf

    • loongarch64-linux-gnuf32

    • loongarch64-linux-gnu

    (Автор: Zhang Na в gh-90656.)

  • PYTHON_FOR_REGEN теперь требует Python 3.10 или новее.

  • Для повторной генерации !configure теперь требуется Autoconf 2.71 и aclocal 1.16.4. (Автор: Christian Heimes в gh-89886.)

  • Сборки для Windows и установщики для macOS с python.org теперь используют OpenSSL 3.0.

Изменения C APIC API Changes

Новые возможностиNew Features

  • PEP 697: Представлен уровень нестабильного C API, предназначенный для низкоуровневых инструментов, таких как отладчики и JIT-компиляторы. Этот API может меняться в каждом минорном выпуске CPython без предупреждения об устаревании. Его содержимое помечается префиксом PyUnstable_ в именах.

    Конструкторы объектов кода:

    • PyUnstable_Code_New() (переименован из PyCode_New)

    • PyUnstable_Code_NewWithPosOnlyArgs() (переименован из PyCode_NewWithPosOnlyArgs)

    Дополнительное хранилище для объектов кода (PEP 523):

    • PyUnstable_Eval_RequestCodeExtraIndex() (переименован из _PyEval_RequestCodeExtraIndex)

    • PyUnstable_Code_GetExtra() (переименован из _PyCode_GetExtra)

    • PyUnstable_Code_SetExtra() (переименован из _PyCode_SetExtra)

    Оригинальные имена будут доступны до соответствующих изменений API.

    (Автор: Petr Viktorin в gh-101101.)

  • PEP 697: Добавлен API для расширения типов, чей макет памяти экземпляров является непрозрачным:

    • PyType_Spec.basicsize может быть нулевым или отрицательным, чтобы указать наследование или расширение размера базового класса.

    • PyObject_GetTypeData() и PyType_GetTypeDataSize() добавлены для обеспечения доступа к данным экземпляра, специфичным для подкласса.

    • Py_TPFLAGS_ITEMS_AT_END и PyObject_GetItemData() добавлены для безопасного расширения некоторых типов переменного размера, включая PyType_Type.

    • Py_RELATIVE_OFFSET добавлен, чтобы разрешить определение members через структуру, специфичную для подкласса.

    (Автор: Petr Viktorin в gh-103509.)

  • Добавлена новая функция PyType_FromMetaclass() в ограниченный C API, которая обобщает существующую PyType_FromModuleAndSpec() с помощью дополнительного аргумента метакласса. (Автор: Wenzel Jakob в gh-93012.)

  • API для создания объектов, которые можно вызывать с помощью протокола vectorcall, был добавлен в Ограниченный API:

    Флаг Py_TPFLAGS_HAVE_VECTORCALL теперь удаляется из класса, когда метод __call__() класса переназначается. Это делает vectorcall безопасным для использования с изменяемыми типами (то есть типами кучи без флага неизменяемости, Py_TPFLAGS_IMMUTABLETYPE). Изменяемые типы, которые не переопределяют tp_call, теперь наследуют флаг Py_TPFLAGS_HAVE_VECTORCALL. (Автор: Petr Viktorin в gh-93274.)

    Добавлены флаги Py_TPFLAGS_MANAGED_DICT и Py_TPFLAGS_MANAGED_WEAKREF. Это позволяет классам расширений поддерживать __dict__ и слабые ссылки с меньшим количеством служебных операций, используя меньше памяти и с более быстрым доступом.

  • API для выполнения вызовов с помощью протокола vectorcall был добавлен в Ограниченный API:

    Это означает, что как входящий, так и исходящий концы протокола vector call теперь доступны в Limited API. (Автор: Wenzel Jakob в gh-98586.)

  • Добавлены две новые публичные функции PyEval_SetProfileAllThreads() и PyEval_SetTraceAllThreads(), которые позволяют устанавливать функции трассировки и профилирования во всех выполняющихся потоках, помимо того потока, из которого они вызваны. (Автор: Pablo Galindo в gh-93503.)

  • Добавлена новая функция PyFunction_SetVectorcall() в C API, которая устанавливает поле vectorcall для заданного PyFunctionObject. (Автор: Andrew Frost в gh-92257.)

  • C API теперь позволяет регистрировать колбэки через PyDict_AddWatcher(), PyDict_Watch() и связанные API, которые вызываются при каждом изменении словаря. Это предназначено для использования оптимизирующими интерпретаторами, JIT-компиляторами или отладчиками. (Автор: Carl Meyer в gh-91052.)

  • Добавлены API PyType_AddWatcher() и PyType_Watch() для регистрации колбэков, получающих уведомления об изменениях типа. (Автор: Carl Meyer в gh-91051.)

  • Добавлены API PyCode_AddWatcher() и PyCode_ClearWatcher() для регистрации колбэков, получающих уведомления о создании и уничтожении объектов кода. (Автор: Itamar Oren в gh-91054.)

  • Добавлены функции PyFrame_GetVar() и PyFrame_GetVarString() для получения переменной фрейма по её имени. (Автор: Victor Stinner в gh-91248.)

  • Добавлены PyErr_GetRaisedException() и PyErr_SetRaisedException() для сохранения и восстановления текущего исключения. Эти функции возвращают и принимают один объект исключения, а не три аргумента, как в устаревших PyErr_Fetch() и PyErr_Restore(). Это менее подвержено ошибкам и немного эффективнее. (Автор: Mark Shannon в gh-101578.)

  • Добавлен _PyErr_ChainExceptions1, принимающий экземпляр исключения, взамен устаревшего API _PyErr_ChainExceptions. (Автор: Mark Shannon в gh-101578.)

  • Добавлены PyException_GetArgs() и PyException_SetArgs() как удобные функции для получения и изменения args, переданного конструктору исключения. (Автор: Mark Shannon в gh-101578.)

  • Добавлен PyErr_DisplayException(), принимающий экземпляр исключения, взамен устаревшего API PyErr_Display(). (Автор: Irit Katriel в gh-102755).

  • PEP 683: Представлены Immortal Objects, которые позволяют объектам обходить подсчёт ссылок, и связанные изменения в C API:

    • _Py_IMMORTAL_REFCNT: счётчик ссылок, который определяет объект

      как бессмертный.

    • _Py_IsImmortal Проверяет, имеет ли объект бессмертный счётчик ссылок.

    • PyObject_HEAD_INIT Теперь будет инициализировать счётчик ссылок значением

      _Py_IMMORTAL_REFCNT при использовании с Py_BUILD_CORE.

    • SSTATE_INTERNED_IMMORTAL Идентификатор для интернированных объектов Unicode

      которые являются бессмертными.

    • SSTATE_INTERNED_IMMORTAL_STATIC Идентификатор для интернированных Unicode

      объектов, которые являются бессмертными и статическими

    • sys.getunicodeinternedsize Возвращает общее количество Unicode

      объектов, которые были интернированы. Теперь это необходимо для refleak.py, чтобы правильно отслеживать счётчики ссылок и выделенные блоки

    (Автор: Eddie Elizondo в gh-84436.)

  • PEP 684: Добавлены новая функция Py_NewInterpreterFromConfig() и PyInterpreterConfig, которые можно использовать для создания под-интерпретаторов с собственными GIL. (Подробнее см. PEP 684: A Per-Interpreter GIL.) (Автор: Eric Snow в gh-104110.)

  • В ограниченном C API версии 3.12 функции Py_INCREF() и Py_DECREF() теперь реализованы как непрозрачные вызовы функций для скрытия деталей реализации. (Автор: Victor Stinner в gh-105387.)

Перенос на Python 3.12Porting to Python 3.12

  • Устаревшие API Unicode, основанные на представлении Py_UNICODE*, удалены. Пожалуйста, перейдите на API, основанные на UTF-8 или wchar_t*.

  • Функции разбора аргументов, такие как PyArg_ParseTuple(), больше не поддерживают формат на основе Py_UNICODE* (например, u, Z). Пожалуйста, перейдите на другие форматы для Unicode, такие как s, z, es и U.

  • tp_weaklist для всех статических встроенных типов всегда равно NULL. Это внутреннее поле в PyTypeObject, но мы указываем на это изменение на случай, если кто-то всё же обращается к полю напрямую. Чтобы избежать проблем, рассмотрите возможность использования существующего публичного C API или, при необходимости, (внутреннего) макроса _PyObject_GET_WEAKREFS_LISTPTR().

  • Это внутреннее PyTypeObject.tp_subclasses теперь может не быть корректным указателем на объект. Его тип был изменён на void*, чтобы отразить это. Мы упоминаем об этом на случай, если кто-то обращается к этому внутреннему полю напрямую.

    Чтобы получить список подклассов, вызовите метод Python __subclasses__() (например, с помощью PyObject_CallMethod()).

  • Добавлена поддержка дополнительных параметров форматирования (выравнивание влево, восьмеричные числа, шестнадцатеричные в верхнем регистре, intmax_t, ptrdiff_t, wchar_t C-строки, переменная ширина и точность) в PyUnicode_FromFormat() и PyUnicode_FromFormatV(). (Автор: Serhiy Storchaka в gh-98836.)

  • Неизвестный символ форматирования в PyUnicode_FromFormat() и PyUnicode_FromFormatV() теперь вызывает SystemError. В предыдущих версиях это приводило к тому, что вся оставшаяся строка формата копировалась в результирующую строку как есть, а лишние аргументы отбрасывались. (Автор: Serhiy Storchaka в gh-95781.)

  • Исправлено неверное размещение знака в PyUnicode_FromFormat() и PyUnicode_FromFormatV(). (Автор: Philip Georgi в gh-95504.)

  • Классы расширений, желающие добавить слот __dict__ или слабой ссылки, должны использовать Py_TPFLAGS_MANAGED_DICT и Py_TPFLAGS_MANAGED_WEAKREF вместо tp_dictoffset и tp_weaklistoffset соответственно. Использование tp_dictoffset и tp_weaklistoffset по-прежнему поддерживается, но не полностью поддерживает множественное наследование (gh-95589), и производительность может быть хуже. Классы, объявляющие Py_TPFLAGS_MANAGED_DICT, должны вызывать _PyObject_VisitManagedDict() и _PyObject_ClearManagedDict() для обхода и очистки словарей своих экземпляров. Для очистки слабых ссылок вызывайте PyObject_ClearWeakRefs(), как и раньше.

  • Функция PyUnicode_FSDecoder() больше не принимает пути, подобные байтовым, такие как типы bytearray и memoryview: для байтовых строк принимается только точный тип bytes. (Автор: Victor Stinner в gh-98393.)

  • Макросы Py_CLEAR, Py_SETREF и Py_XSETREF теперь вычисляют свои аргументы только один раз. Если аргумент имеет побочные эффекты, эти побочные эффекты больше не дублируются. (Автор: Victor Stinner в gh-98724.)

  • Индикатор ошибок интерпретатора теперь всегда нормализован. Это означает, что PyErr_SetObject(), PyErr_SetString() и другие функции, устанавливающие индикатор ошибок, теперь нормализуют исключение перед его сохранением. (Автор: Mark Shannon в gh-101578.)

  • _Py_RefTotal больше не является авторитетным и сохраняется только для совместимости ABI. Обратите внимание, что это внутренняя глобальная переменная и доступна только в отладочных сборках. Если вы используете её, вам нужно начать использовать _Py_GetGlobalRefTotal().

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

    Создание классов, метакласс которых переопределяет tp_new, устарело, а в Python 3.14+ будет запрещено. Обратите внимание, что эти функции игнорируют tp_new метакласса, что может привести к неполной инициализации.

    Обратите внимание, что PyType_FromMetaclass() (добавлен в Python 3.12) уже запрещает создание классов, метакласс которых переопределяет tp_new (__new__() в Python).

    Поскольку tp_new переопределяет почти всё, что делают функции PyType_From*, они несовместимы друг с другом. Существующее поведение – игнорирование метакласса на нескольких этапах создания типа – в целом небезопасно, так как (мета)классы предполагают, что tp_new был вызван. Простого общего решения не существует. Один из следующих вариантов может вам подойти:

    • Если вы управляете метаклассом, избегайте использования tp_new в нём:

      • Если инициализацию можно пропустить, её можно выполнить в tp_init вместо этого.

      • Если метакласс не нужно инстанцировать из Python, установите его tp_new в NULL с помощью флага Py_TPFLAGS_DISALLOW_INSTANTIATION. Это делает его приемлемым для функций PyType_From*.

    • Избегайте функций PyType_From*: если вам не нужны специфические для C возможности (слоты или установка размера экземпляра), создавайте типы, вызывая метакласс.

    • Если вы уверены, что tp_new можно безопасно пропустить, отфильтруйте предупреждение об устаревании с помощью warnings.catch_warnings() из Python.

  • PyOS_InputHook и PyOS_ReadlineFunctionPointer больше не вызываются в субинтерпретаторах. Это связано с тем, что клиенты обычно полагаются на глобальное состояние процесса (поскольку эти колбэки не имеют возможности восстановить состояние модуля расширения).

    Это также позволяет избежать ситуаций, когда расширения могут оказаться работающими в субинтерпретаторе, который они не поддерживают (или в который ещё не были загружены). См. gh-104668 для получения дополнительной информации.

  • Внутренняя реализация PyLongObject была изменена для повышения производительности. Хотя внутренности PyLongObject являются приватными, они используются некоторыми модулями расширений. К внутренним полям больше не следует обращаться напрямую, вместо этого следует использовать API-функции, начинающиеся с PyLong_.... Предоставлены две новые нестабильные API-функции для эффективного доступа к значению PyLongObject, которые помещаются в одно машинное слово:

  • Пользовательские аллокаторы, устанавливаемые через PyMem_SetAllocator(), теперь обязаны быть потокобезопасными, независимо от домена памяти. Аллокаторы, не имеющие собственного состояния, включая «хуки», не затрагиваются. Если ваш пользовательский аллокатор ещё не потокобезопасен и вам нужна помощь, создайте новую проблему на GitHub и добавьте в копию @ericsnowcurrently.

УстарелоDeprecated

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

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

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

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

Запланировано к удалению в будущих версияхPending Removal in Future Versions

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

УдаленоRemoved

  • Удалён заголовочный файл token.h. Никогда не существовало публичного C API для токенизатора. Заголовочный файл token.h был предназначен исключительно для внутреннего использования Python. (Автор: Victor Stinner в gh-92651.)

  • Устаревшие Unicode API удалены. Подробнее см. PEP 623.

    • PyUnicode_WCHAR_KIND

    • PyUnicode_AS_UNICODE()

    • PyUnicode_AsUnicode()

    • PyUnicode_AsUnicodeAndSize()

    • PyUnicode_AS_DATA()

    • PyUnicode_FromUnicode()

    • PyUnicode_GET_SIZE()

    • PyUnicode_GetSize()

    • PyUnicode_GET_DATA_SIZE()

  • Удалён макрос функции PyUnicode_InternImmortal(). (Автор: Victor Stinner в gh-85858.)