Что нового в Python 3.12¶
- Редактор:
Адам Тернер
В этой статье рассказывается о новых возможностях Python 3.12 по сравнению с 3.11. Python 3.12 был выпущен 2 октября 2023 года. Более подробную информацию можно найти в changelog.
См.также
PEP 693 – График выхода Python 3.12
Резюме - Основные моменты выпуска¶
Python 3.12 - это последний стабильный выпуск языка программирования Python, содержащий множество изменений в языке и стандартной библиотеке. Изменения в библиотеке направлены на очистку устаревших API, удобство использования и корректность. Следует отметить, что пакет distutils
был удален из стандартной библиотеки. Поддержка файловой системы в os
и pathlib
получила ряд улучшений, а некоторые модули стали более производительными.
Изменения в языке направлены на удобство использования, так как из f-strings было удалено множество ограничений, а предложения «Вы имели в виду…» продолжают улучшаться. Новые формулировки type parameter syntax и type
улучшают эргономику использования generic types и type aliases со статическими программами проверки типов.
В этой статье не делается попытка дать полное описание всех новых возможностей, а вместо этого приводится удобный обзор. За подробной информацией следует обращаться к документации, такой как Library Reference и Language Reference. Если вы хотите получить полное представление о реализации и обосновании изменений, обратитесь к PEP для конкретной новой функции; но учтите, что PEP обычно не обновляются после полной реализации функции.
Новые возможности синтаксиса:
Новые возможности грамматики:
Улучшения в работе переводчика:
PEP 669, мониторинг низкого воздействия
Improved „Did you mean …“ suggestions для исключений
NameError
,ImportError
иSyntaxError
Улучшение модели данных Python:
PEP 688, используя buffer protocol из Python
Значительные улучшения в стандартной библиотеке:
Класс
pathlib.Path
теперь поддерживает подклассыМодуль
os
получил несколько улучшений для поддержки WindowsМодуль command-line interface был добавлен к модулю
sqlite3
.isinstance()
проверяет противruntime-checkable protocols
с ускорением от двух до 20 разПакет
asyncio
получил ряд улучшений производительности: в некоторых бенчмарках скорость работы увеличилась на 75 %.Модуль command-line interface был добавлен к модулю
uuid
.Благодаря изменениям в PEP 701 производство токенов через модуль
tokenize
стало на 64 % быстрее.
Улучшения в системе безопасности:
Замените встроенные
hashlib
реализации SHA1, SHA3, SHA2-384, SHA2-512 и MD5 формально проверенным кодом из проекта HACL*. Эти встроенные реализации остаются в качестве запасных вариантов, которые используются только в тех случаях, когда OpenSSL их не предоставляет.
Улучшения в API на языке C:
Улучшения в реализации CPython:
PEP 709, инлайнинг понимания
CPython support для профилировщика Linux
perf
Реализуйте защиту от переполнения стека на поддерживаемых платформах
Новые возможности набора текста:
Декоратор PEP 698,
typing.override()
Важные устаревания, удаления или ограничения:
PEP 623: Удалите
wstr
из объектов Unicode в C API Python, уменьшив размер каждого объектаstr
по крайней мере на 8 байт.PEP 632: Удалите пакет
distutils
. Рекомендации по замене предоставляемых им API см. в разделе the migration guide. Сторонний пакет Setuptools продолжает предоставлятьdistutils
, если он по-прежнему необходим в Python 3.12 и последующих версиях.gh-95299: Не устанавливайте
setuptools
в виртуальных средах, созданных с помощьюvenv
. Это означает, чтоdistutils
,setuptools
,pkg_resources
иeasy_install
больше не будут доступны по умолчанию; чтобы получить к ним доступ, запуститеpip install setuptools
в виртуальной среде activated.Модули
asynchat
,asyncore
иimp
были удалены, а также несколькоunittest.TestCase
method aliases.
Новые возможности¶
PEP 695: Синтаксис параметра типа¶
Общие классы и функции под PEP 484 объявлялись с использованием многословного синтаксиса, который оставлял область видимости параметров типа неясной и требовал явного объявления дисперсии.
PEP 695 представляет новый, более компактный и явный способ создания generic classes и functions:
def max[T](args: Iterable[T]) -> T:
...
class list[T]:
def __getitem__(self, index: int, /) -> T:
...
def append(self, element: T) -> None:
...
Кроме того, PEP вводит новый способ объявления type aliases с помощью оператора type
, который создает экземпляр TypeAliasType
:
type Point = tuple[float, float]
Псевдонимы типов также могут быть generic:
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 with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T] # TypeVar with constraints
Значение псевдонимов типов, а также границы и ограничения переменных типов, созданных с помощью этого синтаксиса, оцениваются только по требованию (см. lazy evaluation). Это означает, что псевдонимы типов могут ссылаться на другие типы, определенные позже в файле.
Параметры типа, объявленные через список параметров типа, видны в области видимости объявления и во всех вложенных областях, но не во внешней области видимости. Например, их можно использовать в аннотациях типов для методов общего класса или в теле класса. Однако их нельзя использовать в области видимости модуля после определения класса. Подробное описание семантики параметров типа во время выполнения см. в Списки параметров типа.
Для поддержки этой семантики вводится новый вид области видимости, annotation scope. Области аннотаций ведут себя по большей части как области функций, но по-разному взаимодействуют с окружающими областями классов. В Python 3.13 annotations также будет оцениваться в диапазонах аннотаций.
Более подробную информацию см. в разделе PEP 695.
(PEP написан Эриком Траутом. Реализация - Jelle Zijlstra, Eric Traut и другие в gh-103764).
PEP 701: Синтаксическая формализация f-строк¶
PEP 701 снимает некоторые ограничения на использование f-strings. Компоненты выражений внутри f-строк теперь могут быть любыми допустимыми выражениями Python, включая строки, использующие ту же кавычку, что и содержащая f-строка, многострочные выражения, комментарии, обратные слэши и юникодные управляющие последовательности. Давайте рассмотрим их подробнее:
Повторное использование кавычек: в 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-строк должны быть определены в одной строке, даже если выражение внутри 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'
Обратные косые черты и символы юникода: до Python 3.12 выражения f-строк не могли содержать символы
\
. Это также влияло на юникодные escape sequences (например,\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-строк с помощью the PEG parser) является то, что теперь сообщения об ошибках для 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 вводит возможность работы с каждым интерпретатором GIL, так что теперь можно создавать подинтерпретаторы с уникальным GIL для каждого интерпретатора. Это позволяет программам на Python использовать все преимущества нескольких ядер процессора. В настоящее время это доступно только через C-API, хотя API для Python уже anticipated for 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;
}
/* The new interpreter is now active in the current thread. */
Другие примеры использования C-API для суб-интерпретаторов с GIL для каждого интерпретатора см. в Modules/_xxsubinterpretersmodule.c.
(Внесено Эриком Сноу в gh-104210 и т.д.)
PEP 669: Низкоударный мониторинг для CPython¶
PEP 669 определяет новый API
для профилировщиков, отладчиков и других инструментов для мониторинга событий в CPython. Он охватывает широкий спектр событий, включая вызовы, возвраты, строки, исключения, переходы и многое другое. Это означает, что вы платите только за то, что используете, обеспечивая поддержку отладчиков и инструментов покрытия с почти нулевыми накладными расходами. Подробности см. в sys.monitoring
.
(Внесено Марком Шенноном в gh-103082).
PEP 688: Создание доступа к буферному протоколу в Python¶
PEP 688 представляет способ использования buffer protocol из кода Python. Классы, реализующие метод __buffer__()
, теперь можно использовать в качестве буферных типов.
Новый collections.abc.Buffer
ABC обеспечивает стандартный способ представления буферных объектов, например, в аннотациях типов. Новое перечисление inspect.BufferFlags
представляет флаги, которые могут быть использованы для настройки создания буфера. (Внесено Jelle Zijlstra в gh-102500).
PEP 709: Встраивание понимания¶
Постижения словарей, списков и множеств теперь встраиваются, а не создают новый объект одноразовой функции для каждого выполнения постижения. Это ускоряет выполнение постижения в два раза. Более подробную информацию см. в разделе PEP 709.
Итерационные переменные при осмыслении остаются изолированными и не перезаписывают одноименные переменные во внешней области видимости, а также не видны после осмысления. Инлайнинг приводит к нескольким заметным изменениям в поведении:
В трассировках больше нет отдельного фрейма для понимания, а трассировка/профилирование больше не показывает понимание как вызов функции.
Модуль
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).
Улучшенные сообщения об ошибках¶
Модули из стандартной библиотеки теперь потенциально могут быть предложены в качестве части сообщений об ошибках, выводимых интерпретатором, когда
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'?
Другие языковые изменения¶
Парсер теперь поднимает
SyntaxError
при разборе исходного кода, содержащего нулевые байты. (Внесено Пабло Галиндо в gh-96670).Пара обратный слеш-символ, не являющаяся допустимой управляющей последовательностью, теперь генерирует
SyntaxWarning
, а неDeprecationWarning
. Например,re.compile("\d+\.\d+")
теперь выдаетSyntaxWarning
("\d"
- недопустимая управляющая последовательность, используйте необработанные строки для регулярных выражений:re.compile(r"\d+\.\d+")
). В одной из будущих версий Python вместоSyntaxWarning
будет выдаватьсяSyntaxError
. (Внесено Виктором Стиннером в gh-98401).Октальные эскейпы со значением больше
0o377
(например,"\477"
), устаревшие в Python 3.11, теперь выдаютSyntaxWarning
, а неDeprecationWarning
. В одной из будущих версий Python они в конечном итоге будут иметь видSyntaxError
. (Внесено Виктором Стиннером в gh-98401).Переменные, используемые в целевой части вычислений, которые не хранятся в памяти, теперь можно использовать в выражениях присваивания (
:=
). Например, в[(b := 1) for a, b.prop in some_iter]
теперь разрешено присваиваниеb
. Обратите внимание, что присваивание переменным, хранящимся в целевой части постижений (например,a
), по-прежнему запрещено, как и в PEP 572. (Внесено Никитой Соболевым в gh-100581).Исключения, возникающие в методе
__set_name__
класса или типа, больше не оборачиваются символомRuntimeError
. Информация о контексте добавляется к исключению в виде примечания PEP 678. (Внесено Ирит Катриэль в gh-77757).Когда конструкция
try-except*
обрабатывает весьExceptionGroup
и вызывает еще одно исключение, это исключение больше не оборачивается вExceptionGroup
. Также изменено в версии 3.11.4. (Внесено Ирит Катриэль в gh-103590).Теперь сборщик мусора работает только на механизме eval breaker цикла оценки байткода Python, а не на выделении объектов. GC также может запускаться при вызове
PyErr_CheckSignals()
, так что расширения на C, которым нужно долгое время работать без выполнения кода Python, также имеют возможность периодически запускать GC. (Внесено Пабло Галиндо в gh-97922).Все встроенные и расширенные вызываемые модули, ожидающие булевых параметров, теперь принимают аргументы любого типа, а не только
bool
иint
. (Внесено Сергеем Сторчакой в gh-60203).memoryview
теперь поддерживает тип half-float (код формата «e»). (Внесено Донгхи На и Антуаном Питру в gh-90751).Объекты
slice
теперь хешируются, что позволяет использовать их в качестве ключей dict и элементов множеств. (Внесено Уиллом Брэдшоу, Фурканом Ондером и Раймондом Хеттингером в gh-101264).sum()
теперь использует суммирование Неймайера для повышения точности и коммутативности при суммировании плавающих чисел или смешанных интов и плавающих чисел. (Внесено Раймондом Хеттингером в gh-100425).При разборе исходного кода, содержащего нулевой байт,
ast.parse()
теперь выдаетSyntaxError
, а неValueError
. (Внесено Пабло Галиндо в gh-96670).Методы извлечения в
tarfile
иshutil.unpack_archive()
имеют новый аргумент filter, который позволяет ограничить возможности tar, которые могут быть неожиданными или опасными, например создание файлов вне целевого каталога. Подробности см. в tarfile extraction filters. В Python 3.14 по умолчанию будет использоваться'data'
. (Внесено Петром Викториным в PEP 706).Экземпляры
types.MappingProxyType
теперь хэшируются, если базовое отображение является хэшируемым. (Внесено Сергеем Сторчакой в gh-87995).Добавьте support for the perf profiler с помощью новой переменной окружения
PYTHONPERFSUPPORT
и опции командной строки-X perf
, а также новых функцийsys.activate_stack_trampoline()
,sys.deactivate_stack_trampoline()
иsys.is_stack_trampoline_active()
. (Дизайн Пабло Галиндо. Вклад Пабло Галиндо и Кристиана Хаймса при участии Грегори П. Смита [Google] и Марка Шеннона в gh-96123).
Новые модули¶
Нет.
Улучшенные модули¶
массив¶
Класс
array.array
теперь поддерживает подзапись, что делает его классом generic type. (Внесено Jelle Zijlstra в 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 для 4x-6x ускорения. (Внесено Итамаром Ореном и Пранавом Туласирамом Бхатом в gh-100344).asyncio.iscoroutine()
теперь возвращаетFalse
для генераторов, посколькуasyncio
не поддерживает унаследованные корутины на основе генераторов. (Внесено Кумаром Адитьей в gh-102748).asyncio.wait()
иasyncio.as_completed()
теперь принимают генераторы, дающие задания. (Внесено Кумаром Адитьей в gh-78530).
календарь¶
Добавьте перечисления
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.Fraction
теперь поддерживают форматирование в стиле float. (Внесено Марком Дикинсоном в gh-100161).
importlib.resources¶
importlib.resources.as_file()
теперь поддерживает каталоги ресурсов. (Внесено Джейсоном Р. Кумбсом в gh-97930).Переименуйте первый параметр
importlib.resources.files()
в anchor. (Внесено Джейсоном Р. Кумбсом в gh-100598).
осмотреть¶
Добавьте
inspect.markcoroutinefunction()
, чтобы отметить функции синхронизации, возвращающие coroutine, для использования сinspect.iscoroutinefunction()
. (Внесено Карлтоном Гибсоном в gh-99247).Добавьте
inspect.getasyncgenstate()
иinspect.getasyncgenlocals()
для определения текущего состояния асинхронных генераторов. (Внесено Томасом Креннвалльнером в gh-79940).Производительность
inspect.getattr_static()
была значительно улучшена. Большинство обращений к функции должно быть как минимум в 2 раза быстрее, чем в Python 3.11. (Внесено Алексом Уэйгудом в gh-103193).
itertools¶
Добавьте
itertools.batched()
для сбора в кортежи четного размера, когда последняя партия может быть короче остальных. (Внесено Раймондом Хеттингером в gh-98363).
математика¶
Добавьте
math.sumprod()
для вычисления суммы произведений. (Внесено Раймондом Хеттингером в gh-100485).Расширьте
math.nextafter()
, добавив аргумент steps для перемещения вверх или вниз на несколько ступеней за раз. (Внесено Маттиасом Гергенсом, Марком Дикинсоном и Раймондом Хеттингером в gh-94906).
os¶
Добавьте
os.PIDFD_NONBLOCK
, чтобы открыть дескриптор файла для процесса сos.pidfd_open()
в неблокирующем режиме. (Внесено Кумаром Адитьей в gh-93312).os.DirEntry
теперь включает методos.DirEntry.is_junction()
для проверки, является ли запись перекрестком. (Внесено Чарльзом Мачалоу в gh-99547).Добавьте функции
os.listdrives()
,os.listvolumes()
иos.listmounts()
в Windows для перечисления дисков, томов и точек монтирования. (Внесено Стивом Дауэром в gh-102519).Поля
os.stat()
иos.lstat()
теперь более точны в Windows. Полеst_birthtime
теперь будет заполняться временем создания файла, аst_ctime
устарело, но по-прежнему содержит время создания (но в будущем будет возвращать последнее изменение метаданных, для согласованности с другими платформами).st_dev
может быть до 64 бит, аst_ino
- до 128 бит, в зависимости от вашей файловой системы, аst_rdev
всегда устанавливается на ноль, а не на неверные значения. Обе функции могут быть значительно быстрее в новых версиях Windows. (Внесено Стивом Дауэром в gh-99726).
os.path¶
Добавьте
os.path.isjunction()
, чтобы проверить, является ли данный путь перекрестком. (Внесено Чарльзом Мачалоу в gh-99547).Добавьте
os.path.splitroot()
, чтобы разбить путь на триаду(drive, root, tail)
. (Внесено Барни Гейлом в gh-101000).
pathlib¶
Добавьте поддержку подклассов
pathlib.PurePath
иpathlib.Path
, а также их вариантов, специфичных для Posix и Windows. Подклассы могут переопределять методpathlib.PurePath.with_segments()
для передачи информации между экземплярами пути.Добавьте
pathlib.Path.walk()
для обхода деревьев каталогов и генерации всех имен файлов или каталогов в них, аналогичноos.walk()
. (Внесено Станиславом Змиевым в gh-90385).Добавьте необязательный параметр walk_up в
pathlib.PurePath.relative_to()
, чтобы разрешить вставку записей..
в результат; такое поведение более соответствуетos.path.relpath()
. (Внесено Доменико Рагузой в gh-84538).Добавьте
pathlib.Path.is_junction()
в качестве прокси кos.path.isjunction()
. (Внесено Чарльзом Мачалоу в gh-99547).Добавьте необязательный параметр case_sensitive в
pathlib.Path.glob()
,pathlib.Path.rglob()
иpathlib.PurePath.match()
для соответствия чувствительности пути к регистру, что позволяет более точно контролировать процесс соответствия.
pdb¶
Добавьте удобные переменные, чтобы временно хранить значения для отладочной сессии и обеспечивать быстрый доступ к таким значениям, как текущий кадр или возвращаемое значение. (Внесено Тианом Гао в gh-103693).
случайно¶
Добавьте
random.binomialvariate()
. (Внесено Раймондом Хеттингером в gh-81620).Добавьте значение по умолчанию
lambd=1.0
кrandom.expovariate()
. (Внесено Раймондом Хеттингером в gh-100234).
ШУТИЛ¶
shutil.make_archive()
теперь передает аргумент root_dir пользовательским архиваторам, которые его поддерживают. В этом случае он больше не будет временно менять текущий рабочий каталог процесса на root_dir для выполнения архивации. (Внесено Сергеем Сторчакой в gh-74696).shutil.rmtree()
теперь принимает новый аргумент onexc, который представляет собой обработчик ошибок, подобный onerror, но ожидающий экземпляр исключения, а не триплет (typ, val, tb). onerror устарел. (Внесено Ирит Катриэль в gh-102828).shutil.which()
теперь обращается к переменной окружения PATHEXT для поиска совпадений в пределах PATH в Windows, даже если заданный cmd включает компонент каталога. (Внесено Чарльзом Мачалоу в gh-103179).shutil.which()
будет вызыватьNeedCurrentDirectoryForExePathW
при запросе исполняемых файлов в Windows, чтобы определить, нужно ли добавлять текущий рабочий каталог к пути поиска. (Внесено Чарльзом Мачалоу в gh-103179).shutil.which()
вернет путь, соответствующий cmd с компонентом изPATHEXT
до прямого совпадения в другом месте пути поиска в Windows. (Внесено Чарльзом Мачалоу в gh-103179).
sqlite3¶
Добавьте command-line interface. (Внесено Эрлендом Э. Аасланом в gh-77617).
Добавьте атрибут
sqlite3.Connection.autocommit
вsqlite3.Connection
и параметр autocommit вsqlite3.connect()
для управления PEP 249-совместимыми transaction handling. (Внесено Эрлендом Э. Аасландом в gh-83638).Добавьте в
sqlite3.Connection.load_extension()
параметр entrypoint только для ключевого слова, чтобы переопределить точку входа расширения SQLite. (Внесено Эрлендом Э. Аасланом в gh-103015).Добавьте
sqlite3.Connection.getconfig()
иsqlite3.Connection.setconfig()
кsqlite3.Connection
, чтобы внести изменения в конфигурацию соединения с базой данных. (Внесено Эрлендом Э. Аасланом в gh-103489).
статистика¶
Расширьте
statistics.correlation()
, включив в него в качествеranked
метод вычисления корреляции Спирмена для ранжированных данных. (Внесено Раймондом Хеттингером в gh-95861).
sys¶
Добавьте пространство имен
sys.monitoring
, чтобы открыть новый API мониторинга PEP 669. (Внесено Марком Шенноном в gh-103082).Добавьте
sys.activate_stack_trampoline()
иsys.deactivate_stack_trampoline()
для активации и деактивации батутов стекового профилировщика, а такжеsys.is_stack_trampoline_active()
для запроса, активны ли батуты стекового профилировщика. (Внесено Пабло Галиндо и Кристианом Хаймсом при участии Грегори П. Смита [Google] и Марка Шеннона в gh-96123).Добавьте
sys.last_exc
, в котором хранится последнее необработанное исключение, которое было поднято (для случаев посмертной отладки). Утратить три поля, содержащие ту же информацию в устаревшей форме:sys.last_type
,sys.last_value
иsys.last_traceback
. (Внесено Ирит Катриэль в gh-102778).sys._current_exceptions()
теперь возвращает отображение из thread-id в экземпляр исключения, а не в кортеж(typ, exc, tb)
. (Внесено Ирит Катриэль в gh-103176).sys.setrecursionlimit()
иsys.getrecursionlimit()
. Ограничение рекурсии теперь применяется только к коду Python. Встроенные функции не используют ограничение рекурсии, но защищены другим механизмом, который не позволяет рекурсии вызвать сбой виртуальной машины.
tempfile¶
В функции
tempfile.NamedTemporaryFile
появился новый необязательный параметр delete_on_close (Внесен Евгением Зориным в gh-58451).tempfile.mkdtemp()
теперь всегда возвращает абсолютный путь, даже если аргумент, указанный в параметре dir, является относительным путем.
нарезка резьбы¶
Добавьте
threading.settrace_all_threads()
иthreading.setprofile_all_threads()
, позволяющие устанавливать функции трассировки и профилирования во всех запущенных потоках, помимо вызывающего. (Внесено Пабло Галиндо в gh-93503).
tkinter¶
tkinter.Canvas.coords()
теперь сглаживает свои аргументы. Теперь он принимает не только координаты как отдельные аргументы (x1, y1, x2, y2, ...
) и последовательность координат ([x1, y1, x2, y2, ...]
), но и координаты, сгруппированные попарно ((x1, y1), (x2, y2), ...
и[(x1, y1), (x2, y2), ...]
), как методыcreate_*()
. (Внесено Сергеем Сторчакой в gh-94473).
tokenize¶
Модуль
tokenize
включает в себя изменения, внесенные в PEP 701 (вклад Марты Гомес Масиас и Пабло Галиндо в gh-102856). См. Переход на Python 3.12 для получения дополнительной информации об изменениях в модулеtokenize
.
типы¶
Добавьте
types.get_original_bases()
, чтобы обеспечить дальнейшую интроспекцию Определяемые пользователем общие типы при подклассификации. (Внесено Джеймсом Хилтон-Балфом и Алексом Уэйгудом в gh-101827).
набор текста¶
При проверке
isinstance()
наruntime-checkable protocols
теперь используетсяinspect.getattr_static()
, а неhasattr()
для поиска наличия атрибутов. Это означает, что дескрипторы и методы__getattr__()
больше не будут неожиданно оцениваться при проверкеisinstance()
на соответствие протоколам, проверяемым во время выполнения. Однако это также может означать, что некоторые объекты, которые раньше считались экземплярами протокола, проверяемого временем выполнения, больше не будут считаться экземплярами этого протокола на Python 3.12+, и наоборот. Большинство пользователей вряд ли пострадают от этого изменения. (Внесено Алексом Уэйгудом в gh-102433).Члены протокола, проверяемого временем выполнения, теперь считаются «замороженными» во время выполнения, как только класс был создан. Обезьяньи исправления атрибутов протокола, проверяемого временем выполнения, по-прежнему будут работать, но не будут влиять на проверки
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) # unchanged, even though HasX now also has a "y" attribute True
Это изменение было сделано для того, чтобы ускорить проверку
isinstance()
на протоколах, проверяемых во время выполнения.Профиль производительности проверок
isinstance()
противruntime-checkable protocols
значительно изменился. Большинствоisinstance()
проверок протоколов с несколькими членами должны быть как минимум в 2 раза быстрее, чем в 3.11, а некоторые могут быть в 20 раз быстрее или больше. Однако проверкиisinstance()
протоколов с большим количеством членов могут быть медленнее, чем в Python 3.11. (Вклад Алекса Уэйгуда в gh-74690 и gh-103193).Все классы
typing.TypedDict
иtyping.NamedTuple
теперь имеют атрибут__orig_bases__
. (Внесено Адрианом Гарсией Бадаракко в gh-103699).Добавьте параметр
frozen_default
вtyping.dataclass_transform()
. (Внесено Эриком де Бонте в gh-99957).
unicodedata¶
База данных Unicode была обновлена до версии 15.0.0. (Внесено Бенджамином Петерсоном в 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)
(Внесено Джампаоло Родола в gh-48330)
uuid¶
Добавьте command-line interface. (Внесено Адамом Чхиной в gh-88597).
Оптимизации¶
Удаляет члены
wstr
иwstr_length
из объектов Unicode. Это уменьшает размер объекта на 8 или 16 байт на 64-разрядной платформе. (PEP 623) (Внесено Инадой Наоки в gh-92536).Добавьте экспериментальную поддержку использования бинарного оптимизатора BOLT в процессе сборки, что повышает производительность на 1-5%. (Внесено Кевином Модзелевски в gh-90536 и настроено Донгхи На в gh-101525)
Ускорение подстановки регулярных выражений (функции
re.sub()
иre.subn()
и соответствующие методыre.Pattern
) для подстановки строк, содержащих групповые ссылки, в 2–3 раза. (Внесено Сергеем Сторчакой в gh-91524).Ускорьте создание
asyncio.Task
, отложив дорогостоящее форматирование строк. (Внесено Итамаром Ореном в gh-103793).Функции
tokenize.tokenize()
иtokenize.generate_tokens()
работают на 64 % быстрее, что является побочным эффектом изменений, необходимых для покрытия PEP 701 в модулеtokenize
. (Вклад Марты Гомес Масиас и Пабло Галиндо в gh-102856).Ускорьте вызовы методов
super()
и загрузку атрибутов с помощью новой инструкцииLOAD_SUPER_ATTR
. (Вклад Карла Мейера и Владимира Матвеева в gh-103497).
Изменения байткода CPython¶
Удалите инструкцию
LOAD_METHOD
. Она была объединена с инструкциейLOAD_ATTR
. ИнструкцияLOAD_ATTR
теперь будет вести себя как старая инструкцияLOAD_METHOD
, если младший бит ее oparg установлен. (Внесено Кеном Джином в gh-93429).Удалите инструкции
JUMP_IF_FALSE_OR_POP
иJUMP_IF_TRUE_OR_POP
. (Внесено Ирит Катриэль в gh-102859).Удалите инструкцию
PRECALL
. (Внесено Марком Шенноном в gh-92925).Добавьте инструкции
BINARY_SLICE
иSTORE_SLICE
. (Внесено Марком Шенноном в gh-94163).Добавьте инструкции
CALL_INTRINSIC_1
. (Внесено Марком Шенноном в gh-99005).Добавьте инструкцию
CALL_INTRINSIC_2
. (Внесено Ирит Катриэль в gh-101799).Добавьте инструкцию
CLEANUP_THROW
. (Внесено Брандтом Бухером в gh-90997).Добавьте инструкцию
END_SEND
. (Внесено Марком Шенноном в gh-103082).Добавьте инструкцию
LOAD_FAST_AND_CLEAR
как часть реализации PEP 709. (Внесено Карлом Мейером в gh-101441).Добавьте инструкцию
LOAD_FAST_CHECK
. (Внесено Деннисом Суини в 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
. (Внесено Карлом Мейером и Владимиром Матвеевым в gh-103497).Добавьте инструкцию
RETURN_CONST
. (Вклад Веньяна Ванга в gh-101632).
Демонстрации и инструменты¶
Удалите каталог
Tools/demo/
, содержащий старые демо-скрипты. Копию можно найти в old-demos project. (Внесено Виктором Стиннером в gh-97681).Удалите устаревшие примеры скриптов из каталога
Tools/scripts/
. Копию можно найти в old-demos project. (Внесено Виктором Стиннером в gh-97669).
Утратившие актуальность¶
argparse
: Параметры type, choices и metavar изargparse.BooleanOptionalAction
устарели и будут удалены в 3.14. (Внесено Никитой Соболевым в gh-92248).ast
: Следующие функцииast
были устаревшими в документации с Python 3.8, теперь вызываютDeprecationWarning
во время выполнения при обращении к ним или их использовании, и будут удалены в Python 3.14:ast.Num
ast.Str
ast.Bytes
ast.NameConstant
ast.Ellipsis
Вместо этого используйте
ast.Constant
. (Внесено Сергеем Сторчакой в gh-90953).-
Классы дочерних наблюдателей
asyncio.MultiLoopChildWatcher
,asyncio.FastChildWatcher
,asyncio.AbstractChildWatcher
иasyncio.SafeChildWatcher
устарели и будут удалены в Python 3.14. (Внесено Кумаром Адитьей в gh-94597).asyncio.set_child_watcher()
,asyncio.get_child_watcher()
,asyncio.AbstractEventLoopPolicy.set_child_watcher()
иasyncio.AbstractEventLoopPolicy.get_child_watcher()
являются устаревшими и будут удалены в Python 3.14. (Внесено Кумаром Адитьей в gh-94597).Метод
get_event_loop()
политики циклов событий по умолчанию теперь выдаетDeprecationWarning
, если нет текущего набора циклов событий и он решает его создать. (Внесено Сергеем Сторчакой и Гвидо ван Россумом в gh-100160).
calendar
: Константыcalendar.January
иcalendar.February
устарели и заменены наcalendar.JANUARY
иcalendar.FEBRUARY
. (Внесено принцем Рошаном в gh-103636).collections.abc
: Утратившие актуальностьcollections.abc.ByteString
. ПредпочтитеSequence
илиcollections.abc.Buffer
. Для использования в типизации предпочтите объединение, напримерbytes | bytearray
илиcollections.abc.Buffer
. (Внесено Shantanu Jain в gh-91896).datetime
:datetime.datetime
,utcnow()
иutcfromtimestamp()
устарели и будут удалены в будущей версии. Вместо этого используйте объекты, учитывающие временные зоны, для представления дат в UTC: соответственно, вызывайтеnow()
иfromtimestamp()
с параметром tz, установленным вdatetime.UTC
. (Внесено Полом Ганслом в gh-103857).email
: Утратить параметр isdst вemail.utils.localtime()
. (Внесено Аланом Уильямсом в gh-72346).importlib.abc
: Утратили актуальность следующие классы, которые планируется удалить в Python 3.14:importlib.abc.ResourceReader
importlib.abc.Traversable
importlib.abc.TraversableResources
Вместо этого используйте классы
importlib.resources.abc
:(Предоставлено Джейсоном Р. Кумбсом и Хьюго ван Кеменаде в gh-93963).
itertools
: Откажитесь от поддержки операций copy, deepcopy и pickle, которые недокументированы, неэффективны, исторически ошибочны и непоследовательны. Они будут удалены в версии 3.14, что значительно сократит объем кода и нагрузку по сопровождению. (Внесено Раймондом Хеттингером в gh-101588).multiprocessing
: В Python 3.14 метод запускаmultiprocessing
по умолчанию будет заменен на более безопасный для Linux, BSD и других POSIX-платформ, отличных от macOS, где в настоящее время по умолчанию используется'fork'
(gh-84559). Добавление предупреждения об этом во время выполнения было сочтено слишком разрушительным, так как большинство кода, как ожидается, не будет беспокоиться об этом. Используйтеget_context()
илиset_start_method()
API, чтобы явно указать, когда ваш код требует'fork'
. См. contexts and start methods.pkgutil
:pkgutil.find_loader()
иpkgutil.get_loader()
устарели и будут удалены в Python 3.14; используйте вместо нихimportlib.util.find_spec()
. (Внесено Никитой Соболевым в 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
. (Внесено Стивом Дауэром в gh-99726).На POSIX-платформах
os.fork()
теперь может вызыватьDeprecationWarning
, если обнаруживает, что его вызывают из многопоточного процесса. При этом всегда существовала фундаментальная несовместимость с платформой POSIX. Даже если такой код кажется работающим. Мы добавили предупреждение, чтобы повысить осведомленность, поскольку проблемы, возникающие при выполнении такого кода, становятся все более частыми. См. документациюos.fork()
для получения более подробной информации, а также this discussion on fork being incompatible with threads для объяснения того, почему мы теперь обращаем внимание разработчиков на эту давнюю проблему совместимости с платформой.
Если это предупреждение появляется из-за использования
multiprocessing
илиconcurrent.futures
, исправление заключается в использовании другого метода запускаmultiprocessing
, например"spawn"
или"forkserver"
.shutil
: Аргумент onerror изshutil.rmtree()
устарел; вместо него используйте onexc. (Внесено Ирит Катриэль в gh-102828).-
default adapters and converters теперь устарели. Вместо этого используйте Рецепты адаптеров и преобразователей и адаптируйте их под свои нужды. (Внесено Эрлендом Э. Аасланом в gh-90016).
В
execute()
теперь выдаетсяDeprecationWarning
, когда named placeholders используются вместе с параметрами, представленными как sequence, а не какdict
. Начиная с Python 3.14, использование именованных плейсхолдеров с параметрами, представленными в виде последовательности, будет вызывать ошибкуProgrammingError
. (Внесено Эрлендом Э. Аасланд в gh-101698).
sys
: Поляsys.last_type
,sys.last_value
иsys.last_traceback
устарели. Вместо них используйтеsys.last_exc
. (Внесено Ирит Катриэль в gh-102778).tarfile
: Извлечение tar-архивов без указания фильтра устарело до Python 3.14, когда фильтр'data'
станет фильтром по умолчанию. Подробнее см. в разделе Фильтры для извлечения.-
typing.Hashable
теперь устарели. Вместо этого используйтеtyping.Sized
и адаптируйте их под свои нужды. […] […]typing.ByteString
теперь устарели. Вместо этого используйтеDeprecationWarning
и адаптируйте их под свои нужды. […] […]
xml.etree.ElementTree
: Теперь модуль выдаетDeprecationWarning
при проверке истинности значенияxml.etree.ElementTree.Element
. До этого реализация на Python выдавалаFutureWarning
, а реализация на C не выдавала ничего. (Внесено Джейкобом Уоллсом в gh-83122).Трехарговые сигнатуры (type, value, traceback) функций
coroutine throw()
,generator throw()
иasync generator throw()
устарели и могут быть удалены в будущих версиях Python. Вместо них используйте одноарговые версии этих функций. (Внесено Офей Чаном в gh-89874).DeprecationWarning
теперь поднимается, если__package__
на модуле отличается от__spec__.parent
(ранее это былоImportWarning
). (Внесено Бреттом Кэнноном в gh-65961).Установка
__package__
или__cached__
для модуля устарела и перестанет устанавливаться или учитываться системой импорта в Python 3.14. (Внесено Бреттом Кэнноном в gh-65961).Оператор побитовой инверсии (
~
) для bool устарел. В Python 3.14 он будет вызывать ошибку. Вместо него используйтеnot
для логического отрицания bool. В редких случаях, когда вам действительно нужна побитовая инверсия базовогоint
, преобразуйте его в int явно:~int(x)
. (Внесено Тимом Хоффманом в gh-103487).Доступ к
co_lnotab
для объектов кода был устаревшим в Python 3.10 через PEP 626, но только в 3.12 он получил правильноеDeprecationWarning
, поэтому будет удален в 3.14. (Внесено Никитой Соболевым в gh-101866).
Отложенное удаление в Python 3.13¶
Следующие модули и API были устаревшими в предыдущих выпусках Python и будут удалены в Python 3.13.
Модули (см. PEP 594):
aifc
audioop
cgi
cgitb
chunk
crypt
imghdr
mailcap
msilib
nis
nntplib
ossaudiodev
pipes
sndhdr
spwd
sunau
telnetlib
uu
xdrlib
Другие модули:
lib2to3
, а программа 2to3 (gh-84540)
API:
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)importlib.resources
устаревшие методы:contents()
is_resource()
open_binary()
open_text()
path()
read_binary()
read_text()
Вместо этого используйте
importlib.resources.files()
. Обратитесь к importlib-resources: Migrating from Legacy (gh-106531)
Удаление ожиданий в Python 3.14¶
Следующие API были устаревшими и будут удалены в Python 3.14.
argparse
: Параметры type, choices и metavar изargparse.BooleanOptionalAction
.ast
:ast.Num
ast.Str
ast.Bytes
ast.NameConstant
ast.Ellipsis
-
asyncio.MultiLoopChildWatcher
asyncio.FastChildWatcher
asyncio.AbstractChildWatcher
asyncio.SafeChildWatcher
asyncio.set_child_watcher()
asyncio.get_child_watcher()
,asyncio.AbstractEventLoopPolicy.set_child_watcher()
asyncio.AbstractEventLoopPolicy.get_child_watcher()
collections.abc
:collections.abc.ByteString
.email
: параметр isdst вemail.utils.localtime()
.-
importlib.abc.ResourceReader
importlib.abc.Traversable
importlib.abc.TraversableResources
itertools
: Поддержка операций копирования, глубокого копирования и pickle.-
pkgutil.find_loader()
pkgutil.get_loader()
.
pty
:pty.master_open()
pty.slave_open()
shutil
: Аргумент onerror изshutil.rmtree()
.typing
:typing.ByteString
xml.etree.ElementTree
: Проверка истинности значенияxml.etree.ElementTree.Element
.Атрибуты
__package__
и__cached__
на объектах модуля.Атрибут
co_lnotab
объектов кода.
Удаление ожиданий в Python 3.15¶
Следующие API были устаревшими и будут удалены в Python 3.15.
API:
Ожидается удаление в будущих версиях¶
Следующие API были устаревшими в предыдущих версиях Python и будут удалены, хотя на данный момент дата их удаления не назначена.
В настоящее время 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)
Удалено¶
asynchat и 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
. (Внесено Виктором Стиннером в gh-92584).
ensurepip¶
Удалите поставляемое колесо setuptools из
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
вgzip.GzipFile
, устаревший с Python 2.6, вместо него используйте атрибутname
. В режиме записи атрибутfilename
добавлял расширение файла'.gz'
, если оно отсутствовало. (Внесено Виктором Стиннером в gh-94196).
hashlib¶
Удалите чисто питоновскую реализацию
hashlib
дляhashlib.pbkdf2_hmac()
, устаревшую в Python 3.10. Для Python 3.10 и новее требуется OpenSSL 1.1.1 (PEP 644): эта версия OpenSSL обеспечивает реализациюpbkdf2_hmac()
на C, которая работает быстрее. (Внесено Виктором Стиннером в gh-94199).
importlib¶
Многие ранее устаревшие очистки в
importlib
теперь завершены:Ссылки на
module_repr()
и поддержкаmodule_repr()
были удалены. (Внесено Барри Варшавом в gh-97850).importlib.util.set_package
,importlib.util.set_loader
иimportlib.util.module_for_loader
были удалены. (Вклад Бретта Кэннона и Никиты Соболева в gh-65961 и gh-97850).Поддержка
find_loader()
иfind_module()
API была удалена. (Внесено Барри Варшавой в gh-98040).importlib.abc.Finder
,pkgutil.ImpImporter
иpkgutil.ImpLoader
были удалены. (Внесено Барри Варшавой в gh-98040).
имп¶
Модуль
imp
был удален. (Внесен Барри Варшавой в gh-98040).Для миграции обратитесь к следующей таблице соответствия:
имп
importlib
imp.NullImporter
Вставьте
None
вsys.path_importer_cache
imp.cache_from_source()
imp.find_module()
imp.get_magic()
imp.get_suffixes()
importlib.machinery.SOURCE_SUFFIXES
,importlib.machinery.EXTENSION_SUFFIXES
иimportlib.machinery.BYTECODE_SUFFIXES
.imp.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) # The module is always executed and not cached in sys.modules. # Uncomment the following line to cache the module. # 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()
, устаревшую в Python 3.7: вместо нее используйтеlocale.format_string()
. (Внесено Виктором Стиннером в 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
.(Предоставлено Эрлендом Э. Аасланом в gh-92548).
ssl¶
Удалите функцию
ssl
изssl.RAND_pseudo_bytes()
, устаревшую в Python 3.6: вместо нее используйтеos.urandom()
илиssl.RAND_bytes()
. (Внесено Виктором Стиннером в gh-94199).Удалите функцию
ssl.match_hostname()
. Она была устаревшей в Python 3.7. OpenSSL выполняет сопоставление имен хостов начиная с Python 3.7, Python больше не использует функциюssl.match_hostname()
. (Внесено Виктором Стиннером в gh-94199).Уберите функцию
ssl.wrap_socket()
, устаревшую в Python 3.7: вместо нее создайте объектssl.SSLContext
и вызовите его методssl.SSLContext.wrap_socket
. Любой пакет, который все еще используетssl.wrap_socket()
, сломан и небезопасен. Функция не отправляет расширение SNI TLS и не проверяет имя хоста сервера. Код подвержен CWE-295 (Неправильная проверка сертификата). (Внесено Виктором Стиннером в gh-94199).
unittest¶
Удалите многие давно устаревшие функции
unittest
:Несколько псевдонимов методов
TestCase
:Утраченный псевдоним
Название метода
Утратил актуальность в
failUnless
3.1
failIf
3.1
failUnlessEqual
3.1
failIfEqual
3.1
failUnlessAlmostEqual
3.1
failIfAlmostEqual
3.1
failUnlessRaises
3.1
assert_
3.2
assertEquals
3.2
assertNotEquals
3.2
assertAlmostEquals
3.2
assertNotAlmostEquals
3.2
assertRegexpMatches
3.2
assertRaisesRegexp
3.2
assertNotRegexpMatches
3.5
Вы можете использовать https://github.com/isidentical/teyit для автоматической модернизации ваших модульных тестов.
Недокументированный и неработающий метод
TestCase
assertDictContainsSubset
(устаревший в Python 3.2).Недокументированный
TestLoader.loadTestsFromModule
параметр use_load_tests (устаревший и игнорируемый с Python 3.5).Псевдоним класса
TextTestResult
:_TextTestResult
(устаревший в Python 3.2).
(Предоставлено Serhiy Storchaka в gh-89325).
веб-браузер¶
Удалите поддержку устаревших браузеров из
webbrowser
. К удаленным браузерам относятся: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird и Firefox версий 35 и ниже (gh-102871).
xml.etree.ElementTree¶
Удалите метод
ElementTree.Element.copy()
из чисто питоновской реализации, устаревший в Python 3.10, вместо него используйте функциюcopy.copy()
. Реализацияxml.etree.ElementTree
на языке C не имеет методаcopy()
, только метод__copy__()
. (Внесено Виктором Стиннером в gh-94383).
zipimport¶
Другие¶
Удалите правило
suspicious
из документацииMakefile
иDoc/tools/rstlint.py
в пользу sphinx-lint. (Внесено Жюльеном Паларом в gh-98179).Удалите параметры keyfile и certfile из модулей
ftplib
,imaplib
,poplib
иsmtplib
, а также параметры key_file, cert_file и check_hostname из модуляhttp.client
. Все они устарели с версии Python 3.6. Вместо них используйте параметр context (ssl_context вimaplib
). (Внесено Виктором Стиннером в gh-94172).Удалите хаки совместимости с
Jython
из нескольких модулей и тестов stdlib. (Внесено Никитой Соболевым в gh-99482).Уберите флаг
_use_broken_old_ctypes_structure_semantics_
из модуляctypes
. (Внесено Никитой Соболевым в gh-99285).
Переход на Python 3.12¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код.
Изменения в API Python¶
Для числовых ссылок на группы и имен групп в регулярных выражениях теперь применяются более строгие правила. Теперь в качестве числовой ссылки принимается только последовательность ASCII-цифр. Имя группы в байтовых шаблонах и строках замены теперь может содержать только буквы и цифры ASCII и знак подчеркивания. (Внесено Сергеем Сторчакой в gh-91760).
Удалите функциональность
randrange()
, устаревшую с Python 3.10. Раньшеrandrange(10.0)
без потерь преобразовывался вrandrange(10)
. Теперь при этом возникает ошибкаTypeError
. Кроме того, исключение, возникающее для нецелых значений, таких какrandrange(10.5)
илиrandrange('10')
, было изменено сValueError
наTypeError
. Это также предотвращает ошибки, когдаrandrange(1e25)
молча выбирает из большего диапазона, чемrandrange(10**25)
. (Первоначально предложено Сергеем Сторчакой gh-86388).argparse.ArgumentParser
изменил кодировку и обработчик ошибок при чтении аргументов из файла (например, опцияfromfile_prefix_chars
) со стандартной текстовой кодировки (например,locale.getpreferredencoding(False)
) на filesystem encoding and error handler. Файлы аргументов должны быть закодированы в UTF-8 вместо ANSI Codepage в Windows.Удалите модуль
asyncore
-базированныйsmtpd
, устаревший в Python 3.4.7 и 3.5.4. Рекомендуемая замена -asyncio
-базированный aiosmtpd. модуль PyPI.Удалите модуль
shlex.split()
-базированныйNone
, устаревший в Python 3.4.7 и 3.5.4. Рекомендуемая замена -sys.stdin
-базированный gh-94352. модуль PyPI. […]Удалите модуль
os
-базированныйbytearray
, устаревший в Python 3.4.7 и 3.5.4. Рекомендуемая замена -memoryview
-базированныйbytes
. модуль PyPI. […]Удалите модуль
syslog.openlog()
-базированныйsyslog.closelog()
, устаревший в Python 3.4.7 и 3.5.4. Рекомендуемая замена -syslog.syslog()
-базированныйsyslog.openlog()
. модуль PyPI. […]Недокументированное поведение блокировки
cached_property()
удалено, поскольку она блокировала все экземпляры класса, что приводило к высокой конкуренции блокировок. Это означает, что функция получения кэшированного свойства теперь может выполняться более одного раза для одного экземпляра, если два потока работают в гонке. Для большинства простых кэшируемых свойств (например, тех, которые являются идемпотентными и просто вычисляют значение на основе других атрибутов экземпляра) это будет нормально. Если необходима синхронизация, реализуйте блокировку внутри функции получения кэшированного свойства или вокруг многопоточных точек доступа.sys._current_exceptions()
теперь возвращает отображение из thread-id в экземпляр исключения, а не в кортеж(typ, exc, tb)
. (Внесено Ирит Катриэль в 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-строки «string» в дополнение к соответствующим токенам для токенизации в компонентах выражения. Например, для 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
удалено, поскольку она блокировала все экземпляры класса, что приводило к высокой конкуренции блокировок. Это означает, что функция получения кэшированного свойства теперь может выполняться более одного раза для одного экземпляра, если два потока работают в гонке. […] […]Недокументированное поведение блокировки
tokenize.TokenError
удалено, поскольку она блокировала все экземпляры класса, что приводило к высокой конкуренции блокировок. Это означает, что функция получения кэшированного свойства теперь может выполняться более одного раза для одного экземпляра, если два потока работают в гонке. […] […]Недокументированное поведение блокировки
tokenize.TokenError
удалено, поскольку она блокировала все экземпляры класса, что приводило к высокой конкуренции блокировок. Это означает, что функция получения кэшированного свойства теперь может выполняться более одного раза для одного экземпляра, если два потока работают в гонке. […] […]Смешивание табуляции и пробелов в качестве отступа в одном файле больше не поддерживается и приведет к ошибке
TabError
.
Модуль
threading
теперь ожидает, что модуль_thread
будет иметь атрибут_is_main_interpreter
. Это функция без аргументов, которая возвращаетTrue
, если текущий интерпретатор является основным.Любая библиотека или приложение, предоставляющее пользовательский модуль
_thread
, должно предоставлять_is_main_interpreter()
(см. gh-112826).
Изменения в конструкции¶
Python больше не использует
setup.py
для сборки общих модулей расширения C. Параметры сборки, такие как заголовки и библиотеки, определяются в скриптеconfigure
. Расширения собираются с помощьюMakefile
. Большинство расширений используютpkg-config
и возвращаются к ручному обнаружению. (Внесено Кристианом Хаймсом в gh-93939).va_start()
с двумя параметрами, какva_start(args, format),
, теперь требуется для сборки Python.va_start()
больше не вызывается с одним параметром. (Внесено Кумаром Адитьей в gh-93207).CPython теперь использует опцию ThinLTO в качестве политики оптимизации времени соединения по умолчанию, если компилятор Clang принимает этот флаг. (Внесено Donghee Na в gh-89536).
Добавьте переменную
COMPILEALL_OPTS
вMakefile
, чтобы переопределить опцииcompileall
(по умолчанию:-j0
) вmake install
. Также объединены 3 командыcompileall
в одну команду для создания .pyc-файлов для всех уровней оптимизации (0, 1, 2) одновременно. (Внесено Виктором Стиннером в gh-99289).Добавьте платформенные триплеты для 64-битного LoongArch:
loongarch64-linux-gnusf
loongarch64-linux-gnuf32
loongarch64-linux-gnu
(Внесено Чжан На в gh-90656).
PYTHON_FOR_REGEN
теперь требует Python 3.10 или более новой версии.Для регенерации
!configure
теперь требуется Autoconf 2.71 и aclocal 1.16.4. (Внесено Кристианом Хаймсом в gh-89886).Сборки для Windows и установщики для macOS с сайта python.org теперь используют OpenSSL 3.0.
Изменения в API на языке C¶
Новые возможности¶
PEP 697: Представляем Unstable C API tier, предназначенный для низкоуровневых инструментов, таких как отладчики и 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.
(Внесено Петром Викториным в 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
в терминах структуры, специфичной для подкласса.
(Внесено Петром Викториным в gh-103509).
Добавьте новую функцию limited C API
PyType_FromMetaclass()
, которая обобщает существующуюPyType_FromModuleAndSpec()
, используя дополнительный аргумент метакласса. (Внесено Венцелем Якобом в gh-93012).В Limited API добавлен API для создания объектов, которые можно вызывать с помощью the vectorcall protocol:
Флаг
Py_TPFLAGS_HAVE_VECTORCALL
теперь снимается с класса при переназначении его метода__call__()
. Это делает vectorcall безопасным для использования с мутабельными типами (т. е. типами кучи без флага неизменяемости,Py_TPFLAGS_IMMUTABLETYPE
). Мутабельные типы, не переопределяющиеtp_call
, теперь наследуют флагPy_TPFLAGS_HAVE_VECTORCALL
. (Внесено Петром Викторином в gh-93274).Добавлены флаги
Py_TPFLAGS_MANAGED_DICT
иPy_TPFLAGS_MANAGED_WEAKREF
. Это позволяет классам расширений поддерживать объектные__dict__
и слабые ссылки с меньшим количеством записей, используя меньше памяти и имея более быстрый доступ.В Limited API добавлен API для выполнения вызовов с помощью the vectorcall protocol:
Это означает, что в Limited API теперь доступны и входящий, и исходящий концы протокола векторного вызова. (Внесено Венцелем Якобом в gh-98586).
Добавьте две новые публичные функции,
PyEval_SetProfileAllThreads()
иPyEval_SetTraceAllThreads()
, которые позволяют установить функции трассировки и профилирования во всех запущенных потоках, помимо вызывающего. (Внесено Пабло Галиндо в gh-93503).Добавьте в C API новую функцию
PyFunction_SetVectorcall()
, которая устанавливает поле векторного вызова для данногоPyFunctionObject
. (Внесено Эндрю Фростом в gh-92257).API языка C теперь позволяет регистрировать обратные вызовы через
PyDict_AddWatcher()
,PyDict_Watch()
и связанные с ними API, которые будут вызываться при каждом изменении словаря. Это предназначено для использования оптимизирующими интерпретаторами, JIT-компиляторами или отладчиками. (Внесено Карлом Мейером в gh-91052).Добавьте
PyType_AddWatcher()
иPyType_Watch()
API для регистрации обратных вызовов, чтобы получать уведомления об изменении типа. (Внесено Карлом Мейером в gh-91051).Добавьте
PyCode_AddWatcher()
иPyCode_ClearWatcher()
API для регистрации обратных вызовов для получения уведомлений о создании и уничтожении объектов кода. (Внесено Итамаром Ореном в gh-91054).Добавьте функции
PyFrame_GetVar()
иPyFrame_GetVarString()
, чтобы получить переменную кадра по ее имени. (Внесено Виктором Стиннером в gh-91248).Добавьте
PyErr_GetRaisedException()
иPyErr_SetRaisedException()
для сохранения и восстановления текущего исключения. Эти функции возвращают и принимают один объект исключения, а не тройной аргумент в уже устаревшихPyErr_Fetch()
иPyErr_Restore()
. Это меньше подвержено ошибкам и немного эффективнее. (Внесено Марком Шенноном в gh-101578).Добавьте
_PyErr_ChainExceptions1
, который принимает экземпляр исключения, чтобы заменить legacy-API_PyErr_ChainExceptions
, который теперь устарел. (Внесено Марком Шенноном в gh-101578).Добавьте
PyException_GetArgs()
иPyException_SetArgs()
в качестве удобных функций для получения и измененияargs
, переданного конструктору исключения. (Внесено Марком Шенноном в gh-101578).Добавьте
PyErr_DisplayException()
, который принимает экземпляр исключения, чтобы заменить legacy-apiPyErr_Display()
. (Внесено Ирит Катриэль в gh-102755).
PEP 683: Вводятся бессмертные объекты, позволяющие объектам обходить счетчики ссылок, и связанные с этим изменения в C-API:
_Py_IMMORTAL_REFCNT
: Количество ссылок, определяющих объекткак бессмертный.
_Py_IsImmortal
Проверяет, есть ли у объекта бессмертный счетчик ссылок.PyObject_HEAD_INIT
Теперь счетчик ссылок будет инициализирован до значения_Py_IMMORTAL_REFCNT
при использовании сPy_BUILD_CORE
.
SSTATE_INTERNED_IMMORTAL
Идентификатор для интернированных объектов юникодакоторые бессмертны.
SSTATE_INTERNED_IMMORTAL_STATIC
Идентификатор для интернированного юникодабессмертные и статичные объекты
sys.getunicodeinternedsize
Возвращается общее количество юникодаобъекты, которые были интернированы. Теперь это необходимо для того, чтобы
refleak.py
правильно отслеживал количество ссылок и выделенных блоков
(Предоставлено Эдди Элизондо в gh-84436).
PEP 684: Добавьте новую функцию
Py_NewInterpreterFromConfig()
иPyInterpreterConfig
, которые можно использовать для создания подинтерпретаторов с собственными GIL. (См. PEP 684: Пер-интерпретатор GIL для получения дополнительной информации.) (Внесено Эриком Сноу в gh-104110).В ограниченном API C версии 3.12 функции
Py_INCREF()
иPy_DECREF()
теперь реализованы как непрозрачные вызовы функций, чтобы скрыть детали реализации. (Внесено Виктором Стиннером в gh-105387).
Переход на Python 3.12¶
Устаревшие API, основанные на представлении Юникода
Py_UNICODE*
, были удалены. Пожалуйста, перейдите на API, основанные на UTF-8 илиwchar_t*
.Функции разбора аргументов, такие как
PyArg_ParseTuple()
, больше не поддерживают формат, основанный наPy_UNICODE*
(например,u
,Z
). Пожалуйста, перейдите на другие форматы для Юникода, такие какs
,z
,es
иU
.tp_weaklist
для всех статических встроенных типов всегда становитсяNULL
. Это поле только для внутреннего использования вPyTypeObject
, но мы указываем на это изменение на случай, если кто-то все равно будет обращаться к этому полю напрямую. Чтобы избежать поломок, используйте вместо этого существующий общедоступный C-API или, при необходимости, макрос_PyObject_GET_WEAKREFS_LISTPTR()
(только для внутреннего использования).Теперь этот внутренний указатель
PyTypeObject.tp_subclasses
может не быть корректным указателем объекта. Его тип был изменен на void*, чтобы отразить это. Мы упомянули об этом на случай, если кто-то обратится к полю, предназначенному только для внутреннего использования, напрямую.Чтобы получить список подклассов, вызовите метод Python
__subclasses__()
(например, используяPyObject_CallMethod()
).Добавьте поддержку дополнительных опций форматирования (выравнивание по левому краю, восьмеричные числа, прописные шестнадцатеричные числа,
intmax_t
,ptrdiff_t
,wchar_t
) вPyUnicode_FromFormat()
иPyUnicode_FromFormatV()
. C-строки, переменная ширина и точность) вPyUnicode_FromFormat()
иPyUnicode_FromFormatV()
. (Внесено Сергеем Сторчакой в gh-98836).Нераспознанный символ формата в
PyUnicode_FromFormat()
иPyUnicode_FromFormatV()
теперь устанавливаетSystemError
. В предыдущих версиях это приводило к тому, что вся остальная часть строки формата копировалась в строку результата как есть, а лишние аргументы отбрасывались. (Внесено Сергеем Сторчакой в gh-95781).Исправьте неправильное расположение знаков в
PyUnicode_FromFormat()
иPyUnicode_FromFormatV()
. (Внесено Филипом Георги в 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
. (Внесено Виктором Стиннером в gh-98393).Макросы
Py_CLEAR
,Py_SETREF
иPy_XSETREF
теперь оценивают свои аргументы только один раз. Если аргумент имеет побочные эффекты, то эти побочные эффекты больше не дублируются. (Внесено Виктором Стиннером в gh-98724).Индикатор ошибки интерпретатора теперь всегда нормализован. Это означает, что
PyErr_SetObject()
,PyErr_SetString()
и другие функции, устанавливающие индикатор ошибки, теперь нормализуют исключение перед его сохранением. (Внесено Марком Шенноном в 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 возможности (слоты или установка размера экземпляра), создавайте типы с помощью calling метакласса.Если вы знаете, что
tp_new
можно безопасно пропустить, отфильтруйте предупреждение об устаревании, используяwarnings.catch_warnings()
из Python.
PyOS_InputHook
иPyOS_ReadlineFunctionPointer
больше не вызываются в subinterpreters. Это связано с тем, что клиенты обычно полагаются на глобальное состояние всего процесса (поскольку эти обратные вызовы не имеют возможности восстановить состояние модуля расширения).Это также позволяет избежать ситуаций, когда расширения могут оказаться запущенными в подинтерпретаторе, который они не поддерживают (или в который они еще не были загружены). Дополнительную информацию см. в разделе gh-104668.
Внутренние компоненты
PyLongObject
были изменены для повышения производительности. Хотя внутренние поляPyLongObject
являются приватными, они используются некоторыми модулями расширения. К внутренним полям больше не следует обращаться напрямую, вместо этого следует использовать API-функции, начинающиеся сPyLong_...
. Две новые нестабильные API-функции предназначены для эффективного доступа к значениямPyLongObject
, которые помещаются в одно машинное слово:Пользовательские аллокаторы, задаваемые через
PyMem_SetAllocator()
, теперь обязаны быть потокобезопасными, независимо от домена памяти. Аллокаторы, не имеющие собственного состояния, включая «крючки», не затрагиваются. Если ваш пользовательский аллокатор еще не является потокобезопасным и вам нужны рекомендации, создайте новый вопрос на GitHub и CC@ericsnowcurrently
.
Утратившие актуальность¶
В соответствии с PEP 699 поле
ma_version_tag
вPyDictObject
является устаревшим для модулей расширения. Обращение к этому полю будет генерировать предупреждение компилятора во время компиляции. Это поле будет удалено в Python 3.14. (Внесено Рамвикрамсом и Кумаром Адитьей в gh-101193. PEP Кена Джина).Утратить значение глобальной конфигурационной переменной:
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()
API следует использовать сPyConfig
. (Внесено Виктором Стиннером в 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()
его следует включить вручную.
Утративший актуальность заголовок продолжает предоставлять свое оригинальное содержимое под оригинальными именами. Ваш старый код может оставаться неизменным, если только лишние макросы include и макросы без разметки имен вас сильно не беспокоят.
(Внесено в gh-47146 Петром Викториным на основе более ранних работ Александра Белопольского и Маттиаса Брауна).
PyErr_Fetch()
иPyErr_Restore()
устарели. Вместо них используйтеPyErr_GetRaisedException()
иPyErr_SetRaisedException()
. (Внесено Марком Шенноном в gh-101578).PyErr_Display()
устарело. Вместо этого используйтеPyErr_DisplayException()
. (Внесено Ирит Катриэль в gh-102755)._PyErr_ChainExceptions
устарел. Вместо него используйте_PyErr_ChainExceptions1
. (Внесено Ирит Катриэль в gh-102192).Использование
PyType_FromSpec()
,PyType_FromSpecWithBases()
илиPyType_FromModuleAndSpec()
для создания класса, чей метакласс переопределяетtp_new
, устарело. Вместо этого вызывайте метакласс.
Удаление ожиданий в Python 3.14¶
Поле
ma_version_tag
вPyDictObject
для модулей расширения (PEP 699; gh-101193).Глобальные переменные конфигурации:
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()
API следует использовать сPyConfig
.Создание
immutable types
с изменяемыми базами (gh-95388).
Удаление ожиданий в Python 3.15¶
PyImport_ImportModuleNoBlock()
: использоватьPyImport_ImportModule()
Py_UNICODE_WIDE
тип: использоватьwchar_t
Py_UNICODE
тип: использоватьwchar_t
Функции инициализации Python:
PySys_ResetWarnOptions()
: очиститьsys.warnoptions
иwarnings.filters
Py_GetPath()
: getsys.path
Py_GetPrefix()
: getsys.prefix
Py_GetPythonHome()
: получитьPyConfig.home
или переменную окруженияPYTHONHOME
.
Ожидается удаление в будущих версиях¶
Следующие API устарели и будут удалены, хотя в настоящее время дата их удаления не назначена.
Py_TPFLAGS_HAVE_FINALIZE
: ненужно с Python 3.8PyErr_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 Thread Local Storage (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
Удалено¶
Удалите заголовочный файл
token.h
. Публичного API токенизатора на C никогда не существовало. Заголовочный файлtoken.h
был предназначен только для использования внутренними модулями Python. (Внесено Виктором Стиннером в gh-92651).Устаревшие API Unicode были удалены. Подробности см. в разделе PEP 623.
PyUnicode_WCHAR_KIND
PyUnicode_AS_UNICODE()
PyUnicode_AsUnicode()
PyUnicode_AsUnicodeAndSize()
PyUnicode_AS_DATA()
PyUnicode_FromUnicode()
PyUnicode_GET_SIZE()
PyUnicode_GetSize()
PyUnicode_GET_DATA_SIZE()
Удалите макрос функции
PyUnicode_InternImmortal()
. (Внесено Виктором Стиннером в gh-85858).