Содержание страницы
Что нового в Python 3.12¶What’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 669, мониторинг с низким влиянием
Улучшенные подсказки «Вы имели в виду…» для исключений
NameError,ImportErrorиSyntaxError
Улучшения модели данных Python:
PEP 688 – использование протокола буфера из Python
Значительные улучшения в стандартной библиотеке:
Класс
pathlib.Pathтеперь поддерживает создание подклассовМодуль
osполучил несколько улучшений для поддержки WindowsВ модуль
sqlite3добавлен интерфейс командной строкиПроверки
isinstance()на соответствиеruntime-checkable protocolsускорились от двух до 20 разПакет
asyncioполучил ряд улучшений производительности, причём некоторые тесты показывают ускорение на 75%.В модуль
uuidдобавлен интерфейс командной строкиБлагодаря изменениям в PEP 701 генерация токенов через модуль
tokenizeвыполняется до 64% быстрее.
Улучшения в области безопасности:
Замена встроенных реализаций
hashlibдля SHA1, SHA3, SHA2-384, SHA2-512 и MD5 на формально верифицированный код из проекта HACL*. Эти встроенные реализации остаются в качестве запасных и используются только тогда, когда OpenSSL их не предоставляет.
Улучшения C API:
Улучшения реализации CPython:
PEP 709 – встраивание генераторов списков
Поддержка CPython для профилировщика Linux
perfРеализация защиты от переполнения стека на поддерживаемых платформах
Новые возможности типизации:
PEP 698 – декоратор
typing.override()
Важные устаревания, удаления и ограничения:
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: Мониторинг с низким воздействием для CPython¶PEP 669: Low impact monitoring for CPython
PEP 669 определяет новый API для профилировщиков,
отладчиков и других инструментов для мониторинга событий в CPython.
Он охватывает широкий спектр событий, включая вызовы,
возвраты, строки, исключения, переходы и другое.
Это означает, что вы платите только за то, что используете, что обеспечивает поддержку
отладчиков и инструментов покрытия с почти нулевыми издержками.
Подробнее см. sys.monitoring.
(Автор: Марк Шеннон в gh-103082.)
PEP 688: Доступность протокола буфера в Python¶PEP 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¶
Класс
array.arrayтеперь поддерживает индексацию, что делает его обобщённым типом. (Предложено Йелле Зейлстрой в gh-98658.)
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¶
Добавлены флаги
csv.QUOTE_NOTNULLиcsv.QUOTE_STRINGSдля более тонкого контроля надNoneи пустыми строками в объектахreaderиwriter.
dis¶
Псевдоинструкции (коды операций, используемые компилятором, но не появляющиеся в исполняемом байт-коде) теперь доступны в модуле
dis.HAVE_ARGUMENTпо-прежнему относится к реальным кодам операций, но не подходит для псевдоинструкций. Вместо этого используйте новую коллекциюdis.hasarg. (Предложено Ирит Катриель в gh-94216.)Добавлена коллекция
dis.hasexc, обозначающая инструкции, которые устанавливают обработчик исключений. (Предложено Ирит Катриель в gh-94216.)
fractions¶
Объекты типа
fractions.Fractionтеперь поддерживают форматирование в стиле float. (Предложено Марком Дикинсоном в gh-100161.)
importlib.resources¶
importlib.resources.as_file()теперь поддерживает каталоги ресурсов. (Предложено Джейсоном Р. Кумбсом в gh-97930.)Переименован первый параметр
importlib.resources.files()в anchor. (Предложено Джейсоном Р. Кумбсом в gh-100598.)
inspect¶
Добавлен
inspect.markcoroutinefunction()для пометки синхронных функций, возвращающих корутину, для использования сinspect.iscoroutinefunction(). (Предложено Карлтоном Гибсоном в gh-99247.)Добавлены
inspect.getasyncgenstate()иinspect.getasyncgenlocals()для определения текущего состояния асинхронных генераторов. (Предложено Томасом Креннвалльнером в gh-79940.)Производительность
inspect.getattr_static()значительно улучшена. Большинство вызовов функции должны быть как минимум в 2 раза быстрее, чем в Python 3.11. (Автор: Alex Waygood в gh-103193.)
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¶
Добавлена
random.binomialvariate(). (Автор: Raymond Hettinger в gh-81620.)Добавлено значение по умолчанию
lambd=1.0дляrandom.expovariate(). (Автор: Raymond Hettinger в gh-100234.)
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¶
Добавлен интерфейс командной строки. (Автор: Erlend E. Aasland, gh-77617.)
Add the
sqlite3.Connection.autocommitattribute tosqlite3.Connectionand the autocommit parameter tosqlite3.connect()to control PEP 249-compliant transaction handling. (Contributed by Erlend E. Aasland in gh-83638.)Добавлен параметр только по ключевому слову entrypoint в
sqlite3.Connection.load_extension()для переопределения точки входа расширения SQLite. (Автор: Erlend E. Aasland, gh-103015.)Добавлены
sqlite3.Connection.getconfig()иsqlite3.Connection.setconfig()вsqlite3.Connectionдля изменения конфигурации подключения к базе данных. (Автор: Erlend E. Aasland, gh-103489.)
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¶
Добавлены
threading.settrace_all_threads()иthreading.setprofile_all_threads(), позволяющие устанавливать функции трассировки и профилирования во всех запущенных потоках, а не только в вызывающем. (Автор: Pablo Galindo, gh-93503.)
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¶
Добавлен
types.get_original_bases()для поддержки дальнейшей интроспекции определяемых пользователем обобщённых типов при наследовании. (Авторы: James Hilton-Balfe и Alex Waygood, gh-101827.)
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¶
Добавлен интерфейс командной строки. (Автор: Adam Chhina в gh-88597.)
Оптимизации¶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.)
Изменения байткода CPython¶CPython 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.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Вместо этого используйте
ast.Constant. (Автор: Serhiy Storchaka в gh-90953.)-
Классы наблюдателя дочерних процессов
asyncio.MultiLoopChildWatcher,asyncio.FastChildWatcher,asyncio.AbstractChildWatcherиasyncio.SafeChildWatcherустарели и будут удалены в Python 3.14. (Автор: Kumar Aditya в gh-94597.)asyncio.set_child_watcher(),asyncio.get_child_watcher(),asyncio.AbstractEventLoopPolicy.set_child_watcher()иasyncio.AbstractEventLoopPolicy.get_child_watcher()объявлены устаревшими и будут удалены в Python 3.14. (Автор: Kumar Aditya, gh-94597.)Метод
get_event_loop()политики цикла событий по умолчанию теперь генерируетDeprecationWarning, если текущий цикл событий не установлен и он решает создать новый. (Авторы: Serhiy Storchaka и Guido van Rossum, gh-100160.)
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.datetimeutcnow()и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.ResourceReaderimportlib.abc.Traversableimportlib.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). Добавление предупреждения во время выполнения было признано слишком разрушительным, поскольку большинство кода, как ожидается, не будет этим затронуто. Используйте APIget_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.)-
адаптеры и преобразователи по умолчанию теперь устарели. Вместо этого используйте рецепты адаптеров и преобразователей и адаптируйте их под свои нужды. (Автор: Erlend E. Aasland в gh-90016.)
В
execute()теперь вызываетсяDeprecationWarning, когда именованные заполнители используются вместе с параметрами, переданными как последовательность, вместоdict. Начиная с Python 3.14, использование именованных заполнителей с параметрами, переданными как последовательность, будет вызыватьProgrammingError. (Автор: Erlend E. Aasland в gh-101698.)
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.Hashableиtyping.Sized, псевдонимы дляcollections.abc.Hashableиcollections.abc.Sizedсоответственно, устарели. (gh-94309.)typing.ByteString, устаревший с Python 3.9, теперь вызываетDeprecationWarningпри его использовании. (Автор: Alex Waygood в gh-91896.)
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.13¶Pending Removal in Python 3.13
Модули (см. PEP 594):
aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib
Другие модули:
lib2to3и программа 2to3 (gh-84540)
API:
configparser.LegacyInterpolation(gh-90765)locale.resetlocale()(gh-90817)turtle.RawTurtle.settiltangle()(gh-50096)unittest.findTestCases()(gh-50096)unittest.getTestCaseNames()(gh-50096)unittest.makeSuite()(gh-50096)unittest.TestProgram.usageExit()(gh-67048)webbrowser.MacOSX(gh-86421)classmethodцепочка дескрипторов (gh-89519)
Запланировано к удалению в Python 3.14¶Pending Removal in Python 3.14
argparse: Параметры type, choices и metavar функцииargparse.BooleanOptionalActionустарели и будут удалены в версии 3.14. (Автор: Nikita Sobolev в gh-92248.)ast: Следующие возможности были объявлены устаревшими в документации начиная с Python 3.8, теперь при обращении к ним или их использовании во время выполнения вызываетсяDeprecationWarning, и они будут удалены в Python 3.14:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Вместо этого используйте
ast.Constant. (Автор: Serhiy Storchaka в gh-90953.)-
Классы наблюдателя дочерних процессов
MultiLoopChildWatcher,FastChildWatcher,AbstractChildWatcherиSafeChildWatcherустарели и будут удалены в Python 3.14. (Автор: Kumar Aditya в gh-94597.)asyncio.set_child_watcher(),asyncio.get_child_watcher(),asyncio.AbstractEventLoopPolicy.set_child_watcher()иasyncio.AbstractEventLoopPolicy.get_child_watcher()объявлены устаревшими и будут удалены в Python 3.14. (Автор: Kumar Aditya, gh-94597.)Метод
get_event_loop()политики цикла событий по умолчанию теперь генерируетDeprecationWarning, если текущий цикл событий не установлен и он решает создать новый. (Авторы: Serhiy Storchaka и Guido van Rossum, gh-100160.)
builtins:bool(NotImplemented)теперь выводитDeprecationWarningи будет вызыватьTypeErrorв Python 3.14. (Автор: Jelle Zijlstra в gh-118767.)email: объявлен устаревшим параметр isdst вemail.utils.localtime(). (Автор: Alan Williams, gh-72346.)importlib.abcустаревшие классы:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
Вместо них используйте классы
importlib.resources.abc:(Авторы: Jason R. Coombs и Hugo van Kemenade в gh-93963.)
itertoolsимел недокументированную, неэффективную, исторически ошибочную и непоследовательную поддержку операций copy, deepcopy и pickle. Это будет удалено в версии 3.14 для значительного сокращения объёма кода и нагрузки по сопровождению. (Автор: Raymond Hettinger, gh-101588.)multiprocessing: метод запуска по умолчанию изменится на более безопасный на Linux, BSD и других POSIX-платформах (кроме macOS), где в настоящее время по умолчанию используется'fork'(gh-84559). Добавление предупреждения во время выполнения было сочтено слишком деструктивным, так как большинству кода это не важно. Используйте APIget_context()илиset_start_method(), чтобы явно указать, когда код требует'fork'. См. Контексты и методы запуска.pathlib:is_relative_to()иrelative_to(): передача дополнительных аргументов объявлена устаревшей.pkgutil:find_loader()иget_loader()теперь вызываютDeprecationWarning; используйтеimportlib.util.find_spec()вместо этого. (Автор: Nikita Sobolev, gh-97850.)pty:master_open(): используйтеpty.openpty().slave_open(): используйтеpty.openpty().
-
execute()иexecutemany(), если используются именованные заполнители и параметры являются последовательностью, а неdict.
urllib:urllib.parse.Quoterобъявлен устаревшим: он не был задуман как публичный API. (Автор: Gregory P. Smith, gh-88168.)
Запланировано к удалению в Python 3.15¶Pending Removal in Python 3.15
Система импорта:
Установка
__cached__в модуле без установки__spec__.cachedсчитается устаревшей. Начиная с Python 3.15__cached__больше не будет устанавливаться или учитываться системой импорта или стандартной библиотекой. (gh-97879)Установка
__package__в модуле без установки__spec__.parentсчитается устаревшей. Начиная с Python 3.15__package__больше не будет устанавливаться или учитываться системой импорта или стандартной библиотекой. (gh-97879)
-
Незадокументированная функция
ctypes.SetPointerType()считается устаревшей начиная с Python 3.13.
-
Устаревшая и редко используемая
CGIHTTPRequestHandlerсчитается устаревшей начиная с Python 3.13. Прямой замены не существует. Что угодно лучше, чем CGI, для взаимодействия веб-сервера с обработчиком запросов.Флаг
--cgiдля python -m http.server интерфейса командной строки считается устаревшим начиная с Python 3.13.
-
Метод
load_module(): вместо него используйтеexec_module().
-
PurePath.is_reserved()считается устаревшим начиная с Python 3.13. Используйтеos.path.isreserved()для обнаружения зарезервированных путей в Windows.
-
java_ver()считается устаревшим начиная с Python 3.13. Эта функция полезна только для поддержки Jython, имеет запутанный API и в значительной степени не тестировалась.
-
Аргумент check_home функции
sysconfig.is_python_build()считается устаревшим начиная с Python 3.12.
-
RLock()не будет принимать аргументов в Python 3.15. Передача любых аргументов считается устаревшей начиная с Python 3.14, поскольку версия на Python не допускает никаких аргументов, но версия на C позволяет любое количество позиционных или именованных аргументов, игнорируя все аргументы.
-
types.CodeType: доступ кco_lnotabбыл объявлен устаревшим в PEP 626 начиная с версии 3.10 и планировался к удалению в 3.12, но получил надлежащийDeprecationWarningтолько в 3.12. Может быть удалён в 3.15. (Предложено Никитой Соболевым в gh-101866.)
-
Незадокументированный синтаксис именованных аргументов для создания
NamedTupleклассов (например,Point = NamedTuple("Point", x=int, y=int)) является устаревшим начиная с Python 3.13. Вместо него используйте синтаксис на основе классов или функциональный синтаксис.При использовании функционального синтаксиса
TypedDict, отсутствие передачи значения параметру поля (TD = TypedDict("TD")) или передачаNone(TD = TypedDict("TD", None)) считается устаревшим начиная с Python 3.13. Используйтеclass TD(TypedDict): passилиTD = TypedDict("TD", {})для создания TypedDict без полей.Функция-декоратор
typing.no_type_check_decorator()считается устаревшей начиная с Python 3.13. За восемь лет в модулеtypingона так и не была поддержана ни одним крупным средством проверки типов.
wave:Методы
getmark(),setmark()иgetmarkers()классовWave_readиWave_writeустарели начиная с Python 3.13.
Запланировано к удалению в Python 3.16¶Pending removal in Python 3.16
Система импорта:
Установка
__loader__в модуле при отсутствии__spec__.loaderустарела. В Python 3.16__loader__перестанет устанавливаться или учитываться системой импорта или стандартной библиотекой.
-
Код формата
'u'(wchar_t) устарел в документации начиная с Python 3.3 и во время выполнения начиная с Python 3.13. Используйте код формата'w'(Py_UCS4) для символов Unicode.
-
asyncio.iscoroutinefunction()устарело и будет удалено в Python 3.16, используйтеinspect.iscoroutinefunction()вместо него. (Авторы: Jiahao Li и Kumar Aditya в gh-122875.)
-
Поразрядная инверсия для булевых типов,
~Trueили~Falseустарела начиная с Python 3.12, поскольку даёт неожиданные и неинтуитивные результаты (-2и-1). Используйтеnot xдля логического отрицания булевого значения. В редких случаях, когда требуется поразрядная инверсия базового целого числа, явно преобразуйте вint(~int(x)).
-
Исключение
ExecErrorустарело начиная с Python 3.14. Оно не используется ни одной функцией вshutilначиная с Python 3.4 и теперь является псевдонимомRuntimeError.
-
Метод
Class.get_methodsустарел начиная с Python 3.14.
sys:Функция
_enablelegacywindowsfsencoding()устарела начиная с Python 3.13. Используйте переменную окруженияPYTHONLEGACYWINDOWSFSENCODING.
-
Недокументированный и неиспользуемый атрибут
TarFile.tarfileустарел начиная с Python 3.13.
Запланировано к удалению в Python 3.17¶Pending removal in Python 3.17
-
collections.abc.ByteStringзапланирован к удалению в Python 3.17.Используйте
isinstance(obj, collections.abc.Buffer)для проверки, реализует лиobjпротокол буфера во время выполнения. Для использования в аннотациях типов используйтеBufferили объединение, которое явно указывает типы, поддерживаемые вашим кодом (например,bytes | bytearray | memoryview).ByteStringизначально задумывался как абстрактный класс, который должен был служить супертипом как дляbytes, так и дляbytearray. Однако, поскольку у ABC никогда не было методов, знание того, что объект является экземпляромByteString, никогда не давало полезной информации об объекте. Другие распространённые типы буферов, такие какmemoryview, также никогда не рассматривались как подтипыByteString(ни во время выполнения, ни статическими проверками типов).См. PEP 688 для получения подробностей. (Автор: Shantanu Jain в gh-91896.)
-
До Python 3.14 старые объединения реализовывались с помощью приватного класса
typing._UnionGenericAlias. Этот класс больше не нужен для реализации, но он сохранён для обратной совместимости, его удаление запланировано на Python 3.17. Пользователям следует использовать документированные вспомогательные средства интроспекции, такие какtyping.get_origin()иtyping.get_args(), вместо того чтобы полагаться на детали приватной реализации.typing.ByteString, устаревший с Python 3.9, запланирован к удалению в Python 3.17.Используйте
isinstance(obj, collections.abc.Buffer)для проверки, реализует лиobjпротокол буфера во время выполнения. Для использования в аннотациях типов используйтеBufferили объединение, которое явно указывает типы, поддерживаемые вашим кодом (например,bytes | bytearray | memoryview).ByteStringизначально задумывался как абстрактный класс, который должен был служить супертипом как дляbytes, так и дляbytearray. Однако, поскольку у ABC никогда не было методов, знание того, что объект является экземпляромByteString, никогда не давало полезной информации об объекте. Другие распространённые типы буферов, такие какmemoryview, также никогда не рассматривались как подтипыByteString(ни во время выполнения, ни статическими проверками типов).См. PEP 688 для получения подробностей. (Автор: Shantanu Jain в gh-91896.)
Запланировано к удалению в будущих версиях¶Pending Removal in Future Versions
Следующие API будут удалены в будущем, хотя на данный момент нет запланированной даты их удаления.
argparse: Вложение групп аргументов и вложение взаимоисключающих групп устарело.-
Генераторы: сигнатура
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()вместо этого.-
utcnow(): используйтеdatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): используйтеdatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: значение множественного числа должно быть целым числом.-
cache_from_source(): параметр debug_override устарел: используйте параметр optimization вместо него.
-
EntryPoints: интерфейс кортежа.Неявное
Noneдля возвращаемых значений.
logging: методwarn()устарел начиная с Python 3.3, используйтеwarning()вместо него.mailbox: использование StringIO в режиме ввода и текстовом режиме устарело, используйте BytesIO и двоичный режим.os: вызовos.register_at_fork()в многопоточном процессе.pydoc.ErrorDuringImport: кортежное значение для параметра exc_info устарело, используйте экземпляр исключения.re: теперь применяются более строгие правила для числовых ссылок на группы и имён групп в регулярных выражениях. В качестве числовой ссылки теперь принимается только последовательность цифр ASCII. Имя группы в байтовых шаблонах и строках замены теперь может содержать только буквы ASCII, цифры и знак подчёркивания. (Автор: Сергей Сторчака в gh-91760.)Модули
sre_compile,sre_constantsиsre_parse.shutil: параметр onerror методаrmtree()устарел в Python 3.12; используйте параметр onexc вместо него.ssl: опции и протоколы:ssl.SSLContextбез аргумента протокол устарело.ssl.SSLContext:set_npn_protocols()иselected_npn_protocol()устарели: используйте ALPN вместо них.ssl.OP_NO_SSL*: опцииssl.OP_NO_TLS*: опцииssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threading: методыthreading.Condition.notifyAll(): используйтеnotify_all().threading.Event.isSet(): используйтеis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): используйте атрибутthreading.Thread.daemon.threading.Thread.getName(),threading.Thread.setName(): используйте атрибутthreading.Thread.name.threading.currentThread(): используйтеthreading.current_thread().threading.activeCount(): используйтеthreading.active_count().
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 и asyncore¶asynchat and asyncore
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 в окружении. Пакеты на основеsetuptools(иdistutils) по-прежнему можно использовать сpip install, поскольку pip предоставляетsetuptoolsв среде сборки, которую он использует для сборки пакета.easy_install,pkg_resources,setuptoolsиdistutilsбольше не предоставляются по умолчанию в окружениях, созданных с помощьюvenvили начальной загрузки сensurepip, так как они являются частью пакетаsetuptools. Для проектов, полагающихся на них во время выполнения, проектsetuptoolsследует объявить как зависимость и установить отдельно (обычно с помощью pip).(Автор: Pradyun Gedam в gh-95299.)
enum¶
ftplib¶
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_cacheimp.cache_from_source()imp.find_module()imp.get_magic()imp.get_suffixes()importlib.machinery.SOURCE_SUFFIXES,importlib.machinery.EXTENSION_SUFFIXESиimportlib.machinery.BYTECODE_SUFFIXESimp.get_tag()imp.load_module()imp.new_module(name)types.ModuleType(name)imp.reload()imp.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¶
locale¶
Удалить функцию
locale.format()модуляlocale, устаревшую в Python 3.7: используйтеlocale.format_string()вместо неё. (Автор изменения: Victor Stinner в gh-94226.)
smtpd¶
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¶
Удаление многих давно устаревших возможностей
unittest:Ряд псевдонимов методов
TestCase:Устаревший псевдоним
Имя метода
Устарело в
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.5
Для автоматической модернизации модульных тестов можно использовать https://github.com/isidentical/teyit.
Недокументированный и неработающий метод
TestCaseassertDictContainsSubset(устарел в Python 3.2).Недокументированный параметр
TestLoader.loadTestsFromModuleuse_load_tests (устарел и игнорируется начиная с Python 3.5).Псевдоним класса
TextTestResult:_TextTestResult(устарел в Python 3.2).
(Автор изменения: Serhiy Storchaka в gh-89325.)
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¶
Другие¶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.12¶Porting to Python 3.12
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Изменения в Python API¶Changes 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 API¶C 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(), принимающий экземпляр исключения, взамен устаревшего APIPyErr_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.12¶Porting 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_tC-строки, переменная ширина и точность) в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
В соответствии с PEP 699, поле
ma_version_tagвPyDictObjectобъявлено устаревшим для модулей расширений. Доступ к этому полю будет вызывать предупреждение компилятора во время компиляции. Это поле будет удалено в Python 3.14. (Авторы: Ramvikrams и Kumar Aditya в gh-101193. PEP: Ken Jin.)Устаревание глобальной переменной конфигурации:
Py_DebugFlag: используйтеPyConfig.parser_debugPy_VerboseFlag: используйтеPyConfig.verbosePy_QuietFlag: используйтеPyConfig.quietPy_InteractiveFlag: используйтеPyConfig.interactivePy_InspectFlag: используйтеPyConfig.inspectPy_OptimizeFlag: используйтеPyConfig.optimization_levelPy_NoSiteFlag: используйтеPyConfig.site_importPy_BytesWarningFlag: используйтеPyConfig.bytes_warningPy_FrozenFlag: используйтеPyConfig.pathconfig_warningsPy_IgnoreEnvironmentFlag: используйтеPyConfig.use_environmentPy_DontWriteBytecodeFlag: используйтеPyConfig.write_bytecodePy_NoUserSiteDirectory: используйтеPyConfig.user_site_directoryPy_UnbufferedStdioFlag: используйтеPyConfig.buffered_stdioPy_HashRandomizationFlag: используйтеPyConfig.use_hash_seedиPyConfig.hash_seedPy_IsolatedFlag: используйтеPyConfig.isolatedPy_LegacyWindowsFSEncodingFlag: используйтеPyPreConfig.legacy_windows_fs_encodingPy_LegacyWindowsStdioFlag: используйтеPyConfig.legacy_windows_stdioPy_FileSystemDefaultEncoding: используйтеPyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding: используйтеPyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors: используйтеPyConfig.filesystem_errorsPy_UTF8Mode: используйтеPyPreConfig.utf8_mode(см.Py_PreInitialize())
API
Py_InitializeFromConfig()следует использовать сPyConfigвместо этого. (Предложено Victor Stinner в gh-77782.)Создание
immutable typesс изменяемыми базовыми классами устарело и будет отключено в Python 3.14. (gh-95388)Заголовок
structmember.hустарел, хотя он по-прежнему доступен, и удалять его не планируется.Его содержимое теперь доступно просто при включении
Python.h, с добавлением префиксаPy, если он отсутствовал:Макросы типов, такие как
Py_T_INT,Py_T_DOUBLEи т.д. (ранееT_INT,T_DOUBLEи т.д.)Флаги
Py_READONLY(ранееREADONLY) иPy_AUDIT_READ(ранее все заглавные)
Несколько элементов не экспортируются из
Python.h:T_OBJECT(используйтеPy_T_OBJECT_EX)T_NONE(ранее недокументированный и довольно странный)Макрос
WRITE_RESTRICTED, который ничего не делает.Макросы
RESTRICTEDиREAD_RESTRICTED, эквивалентыPy_AUDIT_READ.В некоторых конфигурациях
<stddef.h>не включается изPython.h. Его следует включать вручную при использованииoffsetof().
Устаревший заголовок продолжает предоставлять своё исходное содержимое под исходными именами. Ваш старый код может остаться без изменений, если только лишнее включение и макросы без пространства имён вас сильно не смущают.
(Предложено в gh-47146 Petr Viktorin на основе более ранней работы Alexander Belopolsky и Matthias Braun.)
PyErr_Fetch()иPyErr_Restore()устарели. ИспользуйтеPyErr_GetRaisedException()иPyErr_SetRaisedException()вместо этого. (Предложено Mark Shannon в gh-101578.)PyErr_Display()устарело. ИспользуйтеPyErr_DisplayException()вместо. (Предложено Irit Katriel в gh-102755)._PyErr_ChainExceptionsустарело. Используйте_PyErr_ChainExceptions1вместо. (Предложено Irit Katriel в gh-102192.)Использование
PyType_FromSpec(),PyType_FromSpecWithBases()илиPyType_FromModuleAndSpec()для создания класса, метакласс которого переопределяетtp_new, устарело. Вместо этого вызовите метакласс.
Запланировано к удалению в Python 3.14¶Pending Removal in Python 3.14
Поле
ma_version_tagвPyDictObjectдля модулей расширения (PEP 699; gh-101193).Создание
immutable typesс изменяемыми базовыми классами (gh-95388).Функции для настройки инициализации Python, устаревшие в Python 3.11:
PySys_SetArgvEx(): Вместо этого задайтеPyConfig.argv.PySys_SetArgv(): Вместо этого задайтеPyConfig.argv.Py_SetProgramName(): Вместо этого задайтеPyConfig.program_name.Py_SetPythonHome(): Вместо этого задайтеPyConfig.home.
API
Py_InitializeFromConfig()следует использовать сPyConfigвместо этого.Глобальные переменные конфигурации:
Py_DebugFlag: Вместо этого используйтеPyConfig.parser_debug.Py_VerboseFlag: Вместо этого используйтеPyConfig.verbose.Py_QuietFlag: Вместо этого используйтеPyConfig.quiet.Py_InteractiveFlag: Вместо этого используйтеPyConfig.interactive.Py_InspectFlag: Вместо этого используйтеPyConfig.inspect.Py_OptimizeFlag: Вместо этого используйтеPyConfig.optimization_level.Py_NoSiteFlag: Вместо этого используйтеPyConfig.site_import.Py_BytesWarningFlag: Вместо этого используйтеPyConfig.bytes_warning.Py_FrozenFlag: Вместо этого используйтеPyConfig.pathconfig_warnings.Py_IgnoreEnvironmentFlag: Вместо этого используйтеPyConfig.use_environment.Py_DontWriteBytecodeFlag: Вместо этого используйтеPyConfig.write_bytecode.Py_NoUserSiteDirectory: Вместо этого используйтеPyConfig.user_site_directory.Py_UnbufferedStdioFlag: Вместо этого используйтеPyConfig.buffered_stdio.Py_HashRandomizationFlag: ИспользуйтеPyConfig.use_hash_seedиPyConfig.hash_seed.Py_IsolatedFlag: Вместо этого используйтеPyConfig.isolated.Py_LegacyWindowsFSEncodingFlag: Вместо этого используйтеPyPreConfig.legacy_windows_fs_encoding.Py_LegacyWindowsStdioFlag: Вместо этого используйтеPyConfig.legacy_windows_stdio.Py_FileSystemDefaultEncoding: Вместо этого используйтеPyConfig.filesystem_encoding.Py_HasFileSystemDefaultEncoding: Вместо этого используйтеPyConfig.filesystem_encoding.Py_FileSystemDefaultEncodeErrors: Вместо этого используйтеPyConfig.filesystem_errors.Py_UTF8Mode: ИспользуйтеPyPreConfig.utf8_modeвместо этого. (см.Py_PreInitialize())
API
Py_InitializeFromConfig()следует использовать сPyConfigвместо этого.
Запланировано к удалению в Python 3.15¶Pending Removal in Python 3.15
PyImport_ImportModuleNoBlock(): Вместо этого используйтеPyImport_ImportModule().PyWeakref_GetObject()иPyWeakref_GET_OBJECT(): ИспользуйтеPyWeakref_GetRef()вместо этого.Тип
Py_UNICODEи макросPy_UNICODE_WIDE: Вместо них используйтеwchar_t.Функции инициализации Python:
PySys_ResetWarnOptions(): Вместо этого очиститеsys.warnoptionsиwarnings.filters.Py_GetExecPrefix(): Вместо этого получайтеsys.base_exec_prefixиsys.exec_prefix.Py_GetPath(): Вместо этого используйтеsys.path.Py_GetPrefix(): Вместо этого получайтеsys.base_prefixиsys.prefix.Py_GetProgramFullPath(): Вместо этого используйтеsys.executable.Py_GetProgramName(): Вместо этого используйтеsys.executable.Py_GetPythonHome(): Вместо этого используйтеPyConfig.homeили переменную окруженияPYTHONHOME.
Запланировано к удалению в Python 3.16¶Pending removal in Python 3.16
Встроенная копия
libmpdec.
Запланировано к удалению в будущих версиях¶Pending Removal in Future Versions
Следующие API устарели и будут удалены, хотя на данный момент дата их удаления не назначена.
Py_TPFLAGS_HAVE_FINALIZE: Не требуется начиная с Python 3.8.PyErr_Fetch(): Вместо этого используйтеPyErr_GetRaisedException().PyErr_NormalizeException(): Вместо этого используйтеPyErr_GetRaisedException().PyErr_Restore(): Вместо этого используйтеPyErr_SetRaisedException().PyModule_GetFilename(): Вместо этого используйтеPyModule_GetFilenameObject().PyOS_AfterFork(): Вместо этого используйтеPyOS_AfterFork_Child().PySlice_GetIndicesEx(): Вместо этого используйтеPySlice_Unpack()иPySlice_AdjustIndices().PyUnicode_AsDecodedObject(): Вместо этого используйтеPyCodec_Decode().PyUnicode_AsDecodedUnicode(): Вместо этого используйтеPyCodec_Decode().PyUnicode_AsEncodedObject(): Вместо этого используйтеPyCodec_Encode().PyUnicode_AsEncodedUnicode(): Вместо этого используйтеPyCodec_Encode().PyUnicode_READY(): Не требуется начиная с Python 3.12PyErr_Display(): Вместо этого используйтеPyErr_DisplayException()._PyErr_ChainExceptions(): Вместо этого используйте_PyErr_ChainExceptions1().Элемент
PyBytesObject.ob_shash: вместо этого вызывайтеPyObject_Hash().Элемент
PyDictObject.ma_version_tag.API локального хранилища потока (TLS):
PyThread_create_key(): Вместо этого используйтеPyThread_tss_alloc().PyThread_delete_key(): Вместо этого используйтеPyThread_tss_free().PyThread_set_key_value(): Вместо этого используйтеPyThread_tss_set().PyThread_get_key_value(): Вместо этого используйтеPyThread_tss_get().PyThread_delete_key_value(): Вместо этого используйтеPyThread_tss_delete().PyThread_ReInitTLS(): Не требуется с Python 3.7.
Удалено¶Removed
Удалён заголовочный файл
token.h. Никогда не существовало публичного C API для токенизатора. Заголовочный файлtoken.hбыл предназначен исключительно для внутреннего использования Python. (Автор: Victor Stinner в gh-92651.)Устаревшие Unicode API удалены. Подробнее см. PEP 623.
PyUnicode_WCHAR_KINDPyUnicode_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.)