Содержание страницы
Что нового в Python 3.13¶What’s New In Python 3.13
- Редакторы:
Адам Тёрнер и Томас Воутерс
Эта статья описывает новые возможности Python 3.13 по сравнению с 3.12. Python 3.13 вышел 7 октября 2024 года. Полные подробности приведены в журнале изменений.
См. также
PEP 719 – график выпуска Python 3.13
Краткое содержание – основные новшества¶Summary – Release Highlights
Python 3.13 – стабильный релиз языка программирования Python, в котором сочетаются изменения в языке, реализации и стандартной библиотеке. Самые значительные изменения включают новый интерактивный интерпретатор, экспериментальную поддержку работы в режиме без глобальной блокировки (PEP 703) и JIT-компилятор (PEP 744).
Сообщения об ошибках продолжают улучшаться: трассировки теперь по умолчанию подсвечиваются цветом. Встроенная функция locals() теперь имеет определённую семантику при изменении возвращаемого отображения, а параметры типов теперь поддерживают значения по умолчанию.
Изменения в библиотеке включают удаление устаревших API и модулей, а также обычные улучшения удобства и корректности. Некоторые устаревшие модули стандартной библиотеки были удалены после объявления их устаревшими в Python 3.11 (PEP 594).
Эта статья не претендует на полное описание всех новых возможностей, а даёт удобный обзор. За полными сведениями обращайтесь к документации: Справочнику по библиотеке и Справочнику по языку. Чтобы понять реализацию и обоснование изменений, обращайтесь к PEP для конкретной возможности; но учтите, что PEP обычно не обновляются после полной реализации. См. Переход на Python 3.13 для руководства по обновлению с предыдущих версий Python.
Улучшения интерпретатора:
Значительно улучшенный интерактивный интерпретатор и улучшенные сообщения об ошибках.
PEP 667: встроенная функция
locals()теперь имеет определённую семантику при изменении возвращаемого отображения. Отладчики Python и подобные инструменты теперь могут более надёжно обновлять локальные переменные в оптимизированных областях видимости даже во время одновременного выполнения кода.PEP 703: CPython 3.13 получил экспериментальную поддержку работы с отключённой глобальной блокировкой интерпретатора. Подробнее см. Free-threaded CPython.
PEP 744: добавлен базовый JIT-компилятор. Сейчас он по умолчанию отключён (хотя впоследствии мы можем его включить). Прирост производительности скромный – мы планируем улучшить его в следующих выпусках.
Поддержка цветов в новом интерактивном интерпретаторе, а также в трассировках и выводе doctest. Это можно отключить через переменные окружения
PYTHON_COLORSиNO_COLOR.
Улучшения модели данных Python:
__static_attributes__хранит имена атрибутов, к которым обращаются черезself.Xв любой функции внутри тела класса.__firstlineno__записывает номер первой строки определения класса.
Значительные улучшения в стандартной библиотеке:
Добавлено новое исключение
PythonFinalizationError, которое возникает, когда операция блокируется во время финализации.Модуль
argparseтеперь поддерживает объявление устаревшими параметров командной строки, позиционных аргументов и подкоманд.Новые функции
base64.z85encode()иbase64.z85decode()поддерживают кодирование и декодирование данных Z85.В модуле
copyтеперь есть функцияcopy.replace(), которая поддерживает многие встроенные типы и любой класс, определяющий метод__replace__().Новый модуль
dbm.sqlite3теперь является backend’ом по умолчанию дляdbm.В модуле
osпоявился набор новых функций для работы с файловыми дескрипторами уведомлений таймеров Linux.Модуль
randomтеперь имеет интерфейс командной строки.
Улучшения безопасности:
ssl.create_default_context()устанавливаетssl.VERIFY_X509_PARTIAL_CHAINиssl.VERIFY_X509_STRICTв качестве флагов по умолчанию.
Улучшения C API:
Слот
Py_mod_gilтеперь используется, чтобы указать, что модуль расширения поддерживает работу с отключённым GIL.Добавлен C API PyTime, предоставляющий доступ к системным часам.
PyMutex– это новый легковесный мьютекс, занимающий один байт.Появился новый набор функций для генерации событий мониторинга PEP 669 в C API.
Новые возможности типизации:
PEP 696: Параметры типов (
typing.TypeVar,typing.ParamSpec, иtyping.TypeVarTuple) теперь поддерживают значения по умолчанию.PEP 702: Новый декоратор
warnings.deprecated()добавляет поддержку для пометки устаревания в системе типов и во время выполнения.PEP 705:
typing.ReadOnlyможно использовать для пометки элементаtyping.TypedDictкак доступного только для чтения для проверщиков типов.PEP 742:
typing.TypeIsобеспечивает более интуитивное поведение сужения типа, как альтернативаtyping.TypeGuard.
Поддержка платформ:
PEP 730: iOS от Apple теперь официально поддерживаемая платформа, на уровне tier 3.
PEP 738: Android теперь официально поддерживаемая платформа, на уровне tier 3.
wasm32-wasiтеперь поддерживается как платформа tier 2.wasm32-emscriptenбольше не является официально поддерживаемой платформой.
Важные удаления:
PEP 594: Оставшиеся 19 «мёртвых батареек» (устаревшие модули stdlib) удалены из стандартной библиотеки:
aifc,audioop,cgi,cgitb,chunk,crypt,imghdr,mailcap,msilib,nis,nntplib,ossaudiodev,pipes,sndhdr,spwd,sunau,telnetlib,uuиxdrlib.Удалены инструмент 2to3 и модуль
lib2to3(устарело в Python 3.11).Удалён модуль
tkinter.tix(устарело в Python 3.6).Удалена функция
locale.resetlocale().Удалены пространства имён
typing.ioиtyping.re.Удалены цепочечные дескрипторы
classmethod.
Изменения графика выпусков:
PEP 602 («Ежегодный цикл выпуска Python») обновлён: период полной поддержки (исправления ошибок) для новых выпусков продлён до двух лет. Это обновлённое правило означает, что:
Python 3.9–3.12 имеют полтора года полной поддержки, затем три с половиной года исправлений безопасности.
Python 3.13 и новее имеют два года полной поддержки, затем три года исправлений безопасности.
Новые возможности¶New Features
Улучшенный интерактивный интерпретатор¶A better interactive interpreter
Теперь Python по умолчанию использует новую интерактивную оболочку, основанную на коде из проекта PyPy. Когда пользователь запускает REPL из интерактивного терминала, теперь поддерживаются следующие новые возможности:
Многострочное редактирование с сохранением истории.
Прямая поддержка команд, специфичных для REPL, таких как help, exit, и quit, без необходимости вызывать их как функции.
Приглашения и трассировки с цветом, включённым по умолчанию.
Интерактивный просмотр справки с помощью F1 с отдельной историей команд.
Просмотр истории с помощью F2, который пропускает вывод, а также приглашения >>> и ….
«Режим вставки» с F3, который упрощает вставку больших блоков кода (нажмите F3 снова, чтобы вернуться к обычному приглашению).
Чтобы отключить новую интерактивную оболочку,
установите переменную окружения PYTHON_BASIC_REPL.
Подробнее об интерактивном режиме см. Интерактивный режим.
(Авторы: Pablo Galindo Salgado, Łukasz Langa и Lysandros Nikolaou в gh-111201 на основе кода проекта PyPy. Поддержка Windows – Dino Viehland и Anthony Shaw.)
Улучшенные сообщения об ошибках¶Improved error messages
Теперь интерпретатор по умолчанию использует цвет при выводе трассировок в терминале. Эту возможность можно контролировать через новую переменную окружения
PYTHON_COLORS, а также канонические переменныеNO_COLORиFORCE_COLOR. (Автор: Pablo Galindo Salgado в gh-112730.)Частая ошибка – написать скрипт с тем же именем, что и у модуля стандартной библиотеки. Если это приводит к ошибкам, теперь выводится более понятное сообщение об ошибке:
$ python random.py Traceback (most recent call last): File "/home/me/random.py", line 1, in <module> import random File "/home/me/random.py", line 3, in <module> print(random.randint(5)) ^^^^^^^^^^^^^^ AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
Аналогично, если скрипт имеет то же имя, что и сторонний модуль, который он пытается импортировать, и это вызывает ошибки, теперь также выводится более понятное сообщение об ошибке:
$ python numpy.py Traceback (most recent call last): File "/home/me/numpy.py", line 1, in <module> import numpy as np File "/home/me/numpy.py", line 3, in <module> np.array([1, 2, 3]) ^^^^^^^^ AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
(Автор: Shantanu Jain в gh-95754.)
Теперь сообщение об ошибке пытается предложить правильный именованный аргумент, когда в функцию передан неверный именованный аргумент.
>>> "Better error messages!".split(max_split=1) Traceback (most recent call last): File "<python-input-0>", line 1, in <module> "Better error messages!".split(max_split=1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
(Авторы: Pablo Galindo Salgado и Shantanu Jain в gh-107944.)
Free-threaded CPython¶
Теперь CPython экспериментально поддерживает работу в режиме без GIL –
глобальная блокировка интерпретатора (GIL) отключена.
Это экспериментальная возможность, поэтому она не включена по умолчанию.
Режим без GIL требует другого исполняемого файла,
обычно называемого python3.13t или python3.13t.exe.
Готовые сборки, помеченные как free-threaded, можно установить в составе
официальных установщиков Windows
и macOS,
или CPython можно собрать из исходных кодов с опцией --disable-gil.
Выполнение без GIL позволяет полностью задействовать доступную
вычислительную мощность за счет параллельного выполнения потоков на доступных ядрах CPU.
Хотя не все программы выиграют от этого автоматически, программы,
спроектированные с учетом многопоточности, будут работать быстрее на многоядерном оборудовании.
Режим без GIL является экспериментальным, и работа по его улучшению продолжается:
ожидайте некоторых ошибок и существенного снижения производительности в однопоточном режиме.
Сборки CPython без GIL поддерживают опциональную работу с включенным GIL
во время выполнения с помощью переменной окружения PYTHON_GIL или
опции командной строки -X gil=1.
Чтобы проверить, поддерживает ли текущий интерпретатор работу без GIL, python -VV
и sys.version содержат «experimental free-threading build».
Новая функция sys._is_gil_enabled() позволяет проверить,
действительно ли GIL отключен в текущем процессе.
Модули расширений C-API необходимо собирать специально для сборки без GIL.
Расширения, поддерживающие работу с отключенным GIL, должны
использовать слот Py_mod_gil. Расширения, использующие однофазную инициализацию, должны
использовать PyUnstable_Module_SetGIL(), чтобы указать, поддерживают ли они
работу с отключенным GIL. Импорт расширений C, не использующих эти механизмы,
приведет к включению GIL, если только GIL не был явно отключен
с помощью переменной окружения PYTHON_GIL или
опции -X gil=0.
Для установки пакетов с C-расширениями в сборке без GIL требуется pip 24.1 или новее.
Эта работа стала возможной благодаря многим людям и организациям, включая большое сообщество участников Python и сторонних проектов, которые тестировали и внедряли поддержку режима без GIL. Среди заметных участников: Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou и многие другие. Многие из этих участников работают в Meta, которая предоставила значительные инженерные ресурсы для поддержки этого проекта.
См. также
PEP 703 «Сделать глобальную блокировку интерпретатора необязательной в CPython» содержит обоснование и информацию об этой работе.
Porting Extension Modules to Support Free-Threading: руководство по переносу, поддерживаемое сообществом, для авторов расширений.
Экспериментальный JIT-компилятор (just-in-time)¶An experimental just-in-time (JIT) compiler
Если CPython настроен и собран с использованием
опции --enable-experimental-jit,
добавляется JIT-компилятор, который может ускорить некоторые программы на Python.
В Windows используйте PCbuild/build.bat --experimental-jit для включения JIT
или --experimental-jit-interpreter для включения интерпретатора Tier 2.
Требования к сборке и дополнительная информация содержатся в
Tools/jit/README.md.
Опция --enable-experimental-jit принимает следующие (необязательные) значения,
по умолчанию yes, если --enable-experimental-jit указан
без дополнительного значения.
no: Отключить весь конвейер Tier 2 и JIT.yes: Включить JIT. Чтобы отключить JIT во время выполнения, передайте переменную окруженияPYTHON_JIT=0.yes-off: Собрать JIT, но отключить его по умолчанию. Чтобы включить JIT во время выполнения, передайте переменную окруженияPYTHON_JIT=1.interpreter: Включить интерпретатор Tier 2, но отключить JIT. Интерпретатор можно отключить, запустив сPYTHON_JIT=0.
Внутренняя архитектура выглядит примерно так:
Мы начинаем со специализированного байт-кода Tier 1. Подробнее см. Что нового в 3.11.
Когда байт-код Tier 1 становится достаточно «горячим», он транслируется в новое чисто внутреннее промежуточное представление (IR), называемое Tier 2 IR, иногда называемое микро-операциями («uops»).
Tier 2 IR использует ту же стековую виртуальную машину, что и Tier 1, но формат команд лучше подходит для трансляции в машинный код.
Для Tier 2 IR применяется несколько проходов оптимизации, которые выполняются до его интерпретации или трансляции в машинный код.
Существует интерпретатор Tier 2, но он в основном предназначен для отладки ранних этапов конвейера оптимизации. Интерпретатор Tier 2 можно включить, настроив Python с
--enable-experimental-jit=interpreter.Если JIT включен, оптимизированный Tier 2 IR транслируется в машинный код, который затем выполняется.
Процесс трансляции в машинный код использует технику, называемую copy-and-patch. У нее нет зависимостей во время выполнения, но появляется новая зависимость на этапе сборки – LLVM.
См. также
(JIT – Brandt Bucher, вдохновлено статьей Haoran Xu и Fredrik Kjolstad. Tier 2 IR – Mark Shannon и Guido van Rossum. Оптимизатор Tier 2 – Ken Jin.)
Определена семантика мутаций для locals()¶Defined mutation semantics for locals()
Исторически ожидаемый результат мутации возвращаемого значения locals() оставлялся на усмотрение отдельных реализаций Python. Начиная с Python 3.13, PEP 667 стандартизирует историческое поведение CPython для большинства областей выполнения кода, но изменяет оптимизированные области (функции, генераторы, корутины, включения и генераторные выражения) так, чтобы они явно возвращали независимые снимки текущих присвоенных локальных переменных, включая локально ссылающиеся нелокальные переменные, захваченные в замыканиях.
Это изменение семантики locals() в оптимизированных областях также влияет на поведение по умолчанию функций выполнения кода, которые неявно используют locals(), если не передано явное пространство имён (например, exec() и eval()). В предыдущих версиях возможность доступа к изменениям через вызов locals() после вызова функции выполнения кода зависела от реализации. В CPython такой код обычно работал как ожидалось, но иногда мог давать сбой в оптимизированных областях из-за того, что другой код (включая отладчики и инструменты трассировки выполнения) мог сбросить общий снимок в этой области. Теперь код всегда выполняется с независимым снимком локальных переменных в оптимизированных областях, поэтому изменения не будут видны при последующих вызовах locals(). Чтобы получить доступ к изменениям, теперь необходимо передать соответствующей функции явную ссылку на пространство имён. Альтернативно, можно переработать затронутый код, чтобы использовать API выполнения кода более высокого уровня, возвращающий результирующее пространство имён (например, runpy.run_path() при выполнении файлов Python с диска).
Чтобы отладчики и подобные инструменты могли надёжно обновлять локальные переменные в областях, затронутых этим изменением, FrameType.f_locals теперь возвращает прокси-объект со сквозной записью (write-through proxy) для локальных и локально ссылающихся нелокальных переменных фрейма в этих областях, а не неконсистентно обновляемый общий экземпляр dict с неопределённой семантикой времени выполнения.
Подробнее см. PEP 667, включая связанные изменения и устаревания в C API. Также ниже приведены заметки по переносу для затронутых Python API и C API.
(PEP и реализация предоставлены Mark Shannon и Tian Gao в gh-74929. Обновления документации – Guido van Rossum и Alyssa Coghlan.)
Поддержка мобильных платформ¶Support for mobile platforms
PEP 730: iOS теперь является поддерживаемой платформой PEP 11 с целями arm64-apple-ios и arm64-apple-ios-simulator на уровне 3 (устройства iPhone и iPad, выпущенные после 2013 года, и симулятор iOS Xcode, работающий на оборудовании Apple silicon соответственно). x86_64-apple-ios-simulator (симулятор iOS Xcode, работающий на старом оборудовании x86_64) не является поддерживаемой платформой уровня 3, но будет поддерживаться по возможности. (PEP написан и реализован Russell Keith-Magee в gh-114099.)
PEP 738: Android теперь является поддерживаемой платформой PEP 11 с целями aarch64-linux-android и x86_64-linux-android на уровне 3. 32-битные цели arm-linux-androideabi и i686-linux-android не являются поддерживаемыми платформами уровня 3, но будут поддерживаться по возможности. (PEP написан и реализован Malcolm Smith в gh-116622.)
Прочие изменения языка¶Other Language Changes
Компилятор теперь удаляет общие начальные пробелы из каждой строки в docstring. Это уменьшает размер кэша байт-кода (например, файлов
.pyc), с сокращением размера файла примерно на 5%, например вsqlalchemy.orm.sessionиз SQLAlchemy 2.0. Это изменение затрагивает инструменты, использующие docstring, такие какdoctest.>>> def spam(): ... """ ... Это докстринг с ... начальные пробелы. ... ... Он даже состоит из нескольких абзацев! ... """ ... >>> spam.__doc__ '\nThis is a docstring with\n leading whitespace.\n\nIt even has multiple paragraphs!\n'
(Предоставлено Inada Naoki в gh-81283.)
Области аннотаций внутри областей классов теперь могут содержать лямбды и включения. Включения, находящиеся внутри областей классов, не встраиваются в родительскую область.
class C[T]: type Alias = lambda: T
Future-выражения больше не активируются относительными импортами модуля
__future__; это означает, что выражения видаfrom .__future__ import ...теперь являются просто стандартными относительными импортами, без активации каких-либо особых возможностей. (Предоставлено Jeremiah Gabriel Pascual в gh-118216.)Объявления
globalтеперь разрешены в блокахexcept, если эта глобальная переменная используется в блокеelse. Ранее это вызывало ошибочноеSyntaxError. (Предоставлено Irit Katriel в gh-111123.)Добавлена
PYTHON_FROZEN_MODULES, новая переменная окружения, определяющая, игнорируются ли замороженные модули механизмом импорта; эквивалентна опции командной строки-X frozen_modules. (Предоставлено Yilei Yang в gh-111374.)Добавлена поддержка профилировщика perf, работающего без указателей фреймов, с помощью новой переменной окружения
PYTHON_PERF_JIT_SUPPORTи опции командной строки-X perf_jit. (Предоставлено Pablo Galindo в gh-118518.)Расположение файла
.python_historyможно изменить через новую переменную окруженияPYTHON_HISTORY. (Предоставлено Levi Sabah, Zackery Spytz и Hugo van Kemenade в gh-73965.)У классов появился новый атрибут
__static_attributes__. Он заполняется компилятором кортежем имён атрибутов класса, которые присваиваются черезself.<name>из любой функции в его теле. (Предоставлено Irit Katriel в gh-115775.)Компилятор теперь создаёт атрибут
__firstlineno__у классов, содержащий номер строки первой строки определения класса. (Предоставлено Serhiy Storchaka в gh-118465.)Встроенные функции
exec()иeval()теперь принимают аргументы globals и locals в качестве именованных. (Предоставлено Raphael Gaschignard в gh-105879)Встроенная функция
compile()теперь принимает новый флагast.PyCF_OPTIMIZED_AST, который похож наast.PyCF_ONLY_AST, за исключением того, что возвращаемое AST оптимизируется в соответствии со значением аргумента optimize. (Предоставлено Irit Katriel в gh-108113).Добавлен атрибут
__name__для объектовproperty. (Предоставлено Eugene Toder в gh-101860.)Добавлено
PythonFinalizationError, новое исключение, производное отRuntimeError, используемое для сигнализации о блокировке операций во время финализации. Следующие вызываемые объекты теперь возбуждаютPythonFinalizationErrorвместоRuntimeError:(Предоставлено Victor Stinner в gh-114570.)
Разрешено передавать аргумент count функции
str.replace()в качестве именованного. (Предоставлено Hugo van Kemenade в gh-106487.)Многие функции теперь выводят предупреждение, если в качестве аргумента-файлового дескриптора передано булево значение. Это помогает раньше выявлять некоторые ошибки. (Предоставлено Serhiy Storchaka в gh-82626.)
Добавлены атрибуты
nameиmodeдля сжатых и архивированных файлоподобных объектов в модуляхbz2,lzma,tarfileиzipfile. (Предоставлено Serhiy Storchaka в gh-115961.)
Новые модули¶New Modules
dbm.sqlite3: SQLite-бэкенд дляdbm. (Авторы: Raymond Hettinger и Erlend E. Aasland, gh-100414.)
Улучшенные модули¶Improved Modules
argparse¶
Добавлен параметр устарело в методы
add_argument()иadd_parser(), чтобы можно было помечать устаревшими параметры командной строки, позиционные аргументы и подкоманды. (Автор: Serhiy Storchaka, gh-83648.)
array¶
Добавлен код типа
'w'(Py_UCS4) для символов Unicode. Его следует использовать вместо устаревшего кода типа'u'. (Автор: Inada Naoki, gh-80480.)Регистрация
array.arrayв качествеMutableSequenceпутём реализации методаclear(). (Автор: Mike Zimin, gh-114894.)
ast¶
Конструкторы типов узлов в модуле
astтеперь строже проверяют принимаемые аргументы, а при их пропуске ведут себя более интуитивно.Если необязательное поле узла AST не указано в качестве аргумента при создании экземпляра, то теперь оно будет установлено в
None. Аналогично, если поле-список опущено, оно будет установлено в пустой список, а если опущено полеexpr_context, по умолчанию оно равноLoad(). (Раньше во всех этих случаях атрибут отсутствовал у вновь созданного экземпляра узла AST.)Во всех остальных случаях, когда обязательный аргумент опущен, конструктор узла выдаст
DeprecationWarning. В Python 3.15 это будет приводить к исключению. Аналогично, передача конструктору именованного аргумента, не соответствующего ни одному полю узла AST, теперь считается устаревшей и в Python 3.15 будет вызывать исключение.Эти изменения не затрагивают определяемые пользователем подклассы
ast.AST, если только класс не включит новое поведение, определив отображениеAST._field_types.ast.parse()теперь принимает необязательный аргумент optimize, который передаётся вcompile(). Это позволяет получить оптимизированное AST. (Автор: Irit Katriel, gh-108113.)
asyncio¶
asyncio.as_completed()теперь возвращает объект, который является одновременно асинхронным итератором и обычным итератором из ожидаемых объектов. Ожидаемые объекты, возвращаемые асинхронной итерацией, включают исходные объекты задач или future, переданные в вызов, что упрощает сопоставление результатов с завершаемыми задачами. (Автор: Justin Arthur, gh-77714.)asyncio.loop.create_unix_server()теперь автоматически удаляет Unix-сокет при закрытии сервера. (Автор: Pierre Ossman, gh-111246.)DatagramTransport.sendto()теперь отправляет дейтаграммы нулевой длины, если вызван с пустым объектом bytes. Управление потоком транспорта также теперь учитывает заголовок дейтаграммы при вычислении размера буфера. (Автор: Jamie Phan, gh-115199.)Добавлены
Queue.shutdownиQueueShutDownдля управления завершением очереди. (Авторы: Laurie Opperman и Yves Duprat, gh-104228.)Добавлены методы
Server.close_clients()иServer.abort_clients(), которые более принудительно закрывают asyncio-сервер. (Автор: Pierre Ossman, gh-113538.)StreamReader.readuntil()теперь принимает кортеж разделителей, останавливаясь при обнаружении любого из них. (Автор: Bruce Merry, gh-81322.)Улучшено поведение
TaskGroup, когда внешняя отмена сталкивается с внутренней отменой. Например, когда две группы задач вложены и обе одновременно получают исключение в дочерней задаче, раньше внешняя группа задач могла зависнуть, потому что её внутренняя отмена поглощалась внутренней группой задач.В случае, когда группа задач отменяется извне и при этом должна вызвать
ExceptionGroup, теперь она вызывает методcancel()родительской задачи. Это гарантирует, чтоCancelledErrorбудет возбуждена при следующейawait, и отмена не теряется.Дополнительное преимущество этих изменений: группы задач теперь сохраняют счётчик отмен (
cancelling()).Для обработки некоторых граничных случаев
uncancel()теперь может сбрасывать недокументированный флаг_must_cancel, когда счётчик отмен достигает нуля.(По мотивам проблемы, сообщённой Arthur Tacca, gh-116720.)
Когда
TaskGroup.create_task()вызывается для неактивногоTaskGroup, указанная корутина будет закрыта (что предотвращаетRuntimeWarningо том, что данную корутину никогда не ожидали). (Авторы: Arthur Tacca и Jason Zhang, gh-115957.)Функция и методы с именем
create_taskполучили новый аргумент**kwargs, который передаётся конструктору задачи. Это изменение было случайно добавлено в 3.13.3 и нарушило контракт API для пользовательских фабрик задач. Некоторые сторонние фабрики задач реализовали обходные пути для этого. В версии 3.13.4 и более поздних старый контракт фабрики снова соблюдается (до 3.14). Чтобы обходные пути продолжали работать, дополнительный аргумент**kwargsпо-прежнему позволяет передавать дополнительные именованные аргументы вTaskи в пользовательские фабрики задач.Это затрагивает следующие функцию и методы:
asyncio.create_task(),asyncio.loop.create_task(),asyncio.TaskGroup.create_task(). (Автор: Thomas Grainger, gh-128307.)
base64¶
Добавлены функции
z85encode()иz85decode()для кодированияbytesв данные Z85 и декодирования данных, закодированных в Z85, вbytes. (Автор: Matan Perelman, gh-75299.)
compileall¶
Количество рабочих потоков и процессов по умолчанию теперь выбирается с помощью
os.process_cpu_count()вместоos.cpu_count(). (Автор: Victor Stinner в gh-109649.)
concurrent.futures¶
Количество рабочих потоков и процессов по умолчанию теперь выбирается с помощью
os.process_cpu_count()вместоos.cpu_count(). (Автор: Victor Stinner в gh-109649.)
configparser¶
ConfigParserтеперь поддерживает безымянные секции, что позволяет использовать пары ключ-значение на верхнем уровне. Это можно включить с помощью нового параметра allow_unnamed_section. (Автор: Pedro Sousa Lacerda в gh-66449.)
copy¶
Новая функция
replace()иreplace protocolзначительно упрощают создание изменённых копий объектов. Это особенно полезно при работе с неизменяемыми объектами. Следующие типы поддерживают функциюreplace()и реализуют протокол replace:объекты кодаcode objects
Любой пользовательский класс также может поддерживать
copy.replace(), определив метод__replace__(). (Автор: Serhiy Storchaka в gh-108751.)
ctypes¶
В результате необходимого внутреннего рефакторинга инициализация внутренних метаклассов теперь происходит в
__init__, а не в__new__. Это затрагивает проекты, которые наследуют эти внутренние метаклассы для предоставления собственной инициализации. В общем случае:Собственную логику, которая выполнялась в
__new__после вызоваsuper().__new__, следует перенести в__init__.Для создания класса вызывайте метакласс, а не только его метод
__new__.
См. gh-124520 для обсуждения и ссылок на изменения в некоторых затронутых проектах.
Объекты
ctypes.Structureимеют новый атрибут_align_, который позволяет явно задавать выравнивание структуры, упаковываемой в память или распаковываемой из неё. (Автор: Matt Sanderson в gh-112433)
dbm¶
Добавлен модуль
dbm.sqlite3, реализующий бэкенд на SQLite, и сделан бэкендом по умолчанию дляdbm. (Авторы: Raymond Hettinger и Erlend E. Aasland в gh-100414.)Разрешено удалять все элементы из базы данных через новые методы
clear()объектов баз данных GDBM и NDBM. (Автор: Donghee Na в gh-107122.)
dis¶
Изменён вывод функций модуля
dis: теперь отображаются логические метки для целей переходов и обработчиков исключений вместо смещений. Смещения можно добавить с помощью нового параметра командной строки-Oили аргумента show_offsets. (Автор: Irit Katriel в gh-112137.)get_instructions()больше не представляет записи кэша как отдельные инструкции. Вместо этого он возвращает их как частьInstructionв новом поле cache_info. Аргумент show_caches функцииget_instructions()устарел и больше не действует. (Автор: Irit Katriel в gh-112962.)
doctest¶
Вывод
doctestтеперь по умолчанию цветной. Это можно настроить через новую переменную окруженияPYTHON_COLORS, а также через канонические переменныеNO_COLORиFORCE_COLOR. См. также Управление цветом. (Автор: Hugo van Kemenade в gh-117225.)Метод
DocTestRunner.run()теперь подсчитывает количество пропущенных тестов. Добавлены атрибутыDocTestRunner.skipsиTestResults.skipped. (Автор: Victor Stinner в gh-108794.)
email¶
Заголовки с встроенными переводами строк теперь экранируются при выводе.
generatorтеперь отказывается сериализовать (записывать) заголовки, которые неправильно свёрнуты или разделены, так что они могут быть разобраны как несколько заголовков или объединены с соседними данными. Если необходимо отключить эту защитную функцию, задайтеverify_generated_headers. (Авторы: Bas Bloemsaat и Petr Viktorin в gh-121650.)getaddresses()иparseaddr()теперь возвращают пары('', '')в большем количестве ситуаций, когда встречаются недопустимые email-адреса, вместо потенциально неточных значений. У этих двух функций появился новый необязательный параметр strict (по умолчаниюTrue). Чтобы получить старое поведение (принимать некорректный ввод), используйтеstrict=False.getattr(email.utils, 'supports_strict_parsing', False)можно использовать для проверки доступности параметра strict. (Авторы: Thomas Dwyer и Victor Stinner для gh-102988 с целью улучшения исправления CVE 2023-27043.)
enum¶
fractions¶
Объекты
Fractionтеперь поддерживают стандартные правила мини-языка спецификации форматирования для заполнения, выравнивания, обработки знака, минимальной ширины и группировки. (Автор: Mark Dickinson в gh-111320.)
glob¶
Добавлена
translate(), функция для преобразования пути с shell-маской в регулярное выражение. (Предложено Barney Gale в gh-72904.)
importlib¶
Следующие функции в
importlib.resourcesтеперь позволяют получать доступ к каталогу (или дереву) ресурсов, используя несколько позиционных аргументов (аргументы encoding и errors в функциях чтения текста теперь являются только ключевыми):Эти функции больше не считаются устаревшими и не планируются к удалению. (Предложено Petr Viktorin в gh-116608.)
contents()по-прежнему считается устаревшим в пользу полнофункционального APITraversable. Однако теперь нет планов по его удалению. (Предложено Petr Viktorin в gh-116608.)
io¶
Финализатор
IOBaseтеперь регистрирует вsys.unraisablehookлюбые ошибки, возникающие при вызове методаclose(). Ранее по умолчанию ошибки игнорировались без сообщения, и запись велась только в режиме разработки Python или при использовании отладочной сборки Python. (Предложено Victor Stinner в gh-62948.)
ipaddress¶
Добавлено свойство
IPv4Address.ipv6_mapped, которое возвращает IPv4-отображённый IPv6-адрес. (Предложено Charles Machalow в gh-109466.)Исправлено поведение
is_globalиis_privateвIPv4Address,IPv6Address,IPv4NetworkиIPv6Network. (Предложено Jakub Stasiak в gh-113171.)
itertools¶
batched()получил новый параметр strict, который вызывает исключениеValueError, если последний пакет короче указанного размера. (Предложено Raymond Hettinger в gh-113202.)
marshal¶
Добавлен параметр allow_code в функции модуля. Передача
allow_code=Falseпредотвращает сериализацию и десериализацию объектов кода, несовместимых между версиями Python. (Предложено Serhiy Storchaka в gh-113626.)
math¶
Новая функция
fma()выполняет операции слитного умножения-сложения. Она вычисляетx * y + zза одно округление, что позволяет избежать потери точности на промежуточных этапах. Она обёртывает функциюfma()из C99 и следует спецификации операции IEEE 754 «fusedMultiplyAdd» для особых случаев. (Предложено Mark Dickinson и Victor Stinner в gh-73468.)
mimetypes¶
Добавлена функция
guess_file_type()для определения MIME-типа по пути в файловой системе. Использование путей сguess_type()теперь мягко устарело. (Предложено Serhiy Storchaka в gh-66543.)
mmap¶
mmapтеперь защищён от аварийного завершения в Windows, когда отображаемая память недоступна из-за ошибок файловой системы или нарушений доступа. (Предложено Jannis Weigend в gh-118209.)mmapимеет новый методseekable(), который можно использовать, когда требуется файлоподобный объект с поддержкой позиционирования (seekable). Методseek()теперь возвращает новую абсолютную позицию. (Предложено Donghee Na и Sylvie Liberman в gh-111835.)Новый параметр trackfd (только для UNIX) для
mmapуправляет дублированием файловых дескрипторов; если false, файловый дескриптор, заданный fileno, не будет дублироваться. (Предложено Zackery Spytz и Petr Viktorin в gh-78502.)
multiprocessing¶
Количество рабочих потоков и процессов по умолчанию теперь выбирается с помощью
os.process_cpu_count()вместоos.cpu_count(). (Предложено Victor Stinner в gh-109649.)
os¶
Добавлена функция
process_cpu_count()для получения количества логических ядер ЦП, доступных вызывающему потоку текущего процесса. (Предложено Victor Stinner в gh-109649.)cpu_count()иprocess_cpu_count()можно переопределить с помощью новой переменной окруженияPYTHON_CPU_COUNTили новой опции командной строки-X cpu_count. Эта опция полезна для пользователей, которым нужно ограничить ресурсы ЦП контейнерной системы без изменения кода приложения или самого контейнера. (Предложено Donghee Na в gh-109595.)Добавлен низкоуровневый интерфейс к файловым дескрипторам таймеров Linux через
timerfd_create(),timerfd_settime(),timerfd_settime_ns(),timerfd_gettime(),timerfd_gettime_ns(),TFD_NONBLOCK,TFD_CLOEXEC,TFD_TIMER_ABSTIMEиTFD_TIMER_CANCEL_ON_SET. (Предложено Masaru Tsuchiyama в gh-108277.)lchmod()и аргумент follow_symlinks функцииchmod()теперь доступны в Windows. Обратите внимание, что значение по умолчанию follow_symlinks вlchmod()равноFalseв Windows. (Предложено Serhiy Storchaka в gh-59616.)fchmod()и поддержка файловых дескрипторов вchmod()теперь доступны в Windows. (Предложено Serhiy Storchaka в gh-113191.)On Windows,
mkdir()andmakedirs()now support passing a mode value of0o700to apply access control to the new directory. This implicitly affectstempfile.mkdtemp()and is a mitigation for CVE 2024-4030. Other values for mode continue to be ignored. (Contributed by Steve Dower in gh-118486.)posix_spawn()теперь принимаетNoneдля аргумента env, что заставляет вновь порождённый процесс использовать окружение текущего процесса. (Предложено Jakub Kulik в gh-113119.)posix_spawn()теперь может использовать атрибутPOSIX_SPAWN_CLOSEFROMв параметре file_actions на платформах, поддерживающихposix_spawn_file_actions_addclosefrom_np(). (Автор: Jakub Kulik в gh-113117.)
os.path¶
Добавлена
isreserved()для проверки, зарезервирован ли путь в текущей системе. Эта функция доступна только в Windows. (Автор: Barney Gale в gh-88569.)В Windows
isabs()больше не считает пути, начинающиеся ровно с одной косой черты (\or/), абсолютными. (Авторы: Barney Gale и Jon Foster в gh-44626.)realpath()теперь разрешает имена файлов в стиле MS-DOS, даже если файл недоступен. (Автор: Moonsik Park в gh-82367.)
pathlib¶
Добавлено
UnsupportedOperation, которое возбуждается вместоNotImplementedError, когда операция над путём не поддерживается. (Автор: Barney Gale в gh-89812.)Добавлен новый конструктор для создания объектов
Pathиз URI вида 'file' (file:///),Path.from_uri(). (Автор: Barney Gale в gh-107465.)Добавлена
PurePath.full_match()для сопоставления путей с шаблонами в стиле оболочки, включая рекурсивный шаблон “**”. (Автор: Barney Gale в gh-73435.)Добавлен атрибут класса
PurePath.parserдля хранения реализацииos.path, используемой для низкоуровневого разбора и объединения путей. Это будет либоposixpath, либоntpath.Добавлен аргумент recurse_symlinks, передаваемый только по ключевому слову, в
Path.glob()иrglob(). (Автор: Barney Gale в gh-77609.)Path.glob()иrglob()теперь возвращают файлы и каталоги, если задан шаблон, оканчивающийся на “**”. Ранее возвращались только каталоги. (Автор: Barney Gale в gh-70303.)Добавлен аргумент follow_symlinks, передаваемый только по ключевому слову, в
Path.is_file,Path.is_dir,Path.owner()иPath.group(). (Авторы: Barney Gale в gh-105793 и Kamil Turek в gh-107962.)
pdb¶
breakpoint()иset_trace()теперь сразу переходят в отладчик, а не на следующей строке выполняемого кода. Это изменение предотвращает выход отладчика за пределы контекста, когдаbreakpoint()расположен в конце контекста. (Автор: Tian Gao в gh-118579.)sys.path[0]больше не заменяется каталогом отлаживаемого скрипта, когда установленsys.flags.safe_path. (Авторы: Tian Gao и Christian Walther в gh-111762.)zipappтеперь поддерживается в качестве цели отладки. (Автор: Tian Gao в gh-118501.)Добавлена возможность переключения между связанными исключениями во время посмертной отладки в
pm()с помощью новой командыexceptions [exc_number]для Pdb. (Автор: Matthias Bussonnier в gh-106676.)Выражения и инструкции, префикс которых является командой pdb, теперь корректно опознаются и выполняются. (Автор: Tian Gao в gh-108464.)
очередь¶queue
Добавлены
Queue.shutdownиShutDownдля управления завершением очереди. (Авторы: Laurie Opperman и Yves Duprat в gh-104750.)
random¶
Добавлен интерфейс командной строки. (Автор: Hugo van Kemenade в gh-118131.)
re¶
Переименован
re.errorвPatternErrorдля улучшения ясности.re.errorсохранён для обратной совместимости.
shutil¶
site¶
Файлы
.pthтеперь декодируются сначала с использованием UTF-8, а затем с кодировкой локали, если декодирование UTF-8 не удаётся. (Автор: Inada Naoki в gh-117802.)
sqlite3¶
Теперь выводится
ResourceWarning, если объектConnectionне был явноclosed. (Автор: Erlend E. Aasland в gh-105539.)Добавлен параметр filter, передаваемый только по ключевому слову, в
Connection.iterdump()для фильтрации объектов базы данных при выгрузке. (Автор: Mariusz Felisiak в gh-91602.)
ssl¶
API
create_default_context()теперь включаетVERIFY_X509_PARTIAL_CHAINиVERIFY_X509_STRICTв свои флаги по умолчанию.Примечание
VERIFY_X509_STRICTможет отклонять сертификаты до RFC 5280 или повреждённые сертификаты, которые базовая реализация OpenSSL в противном случае могла бы принять. Хотя отключать это не рекомендуется, это можно сделать с помощью:import ssl ctx = ssl.create_default_context() ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
(Автор: William Woodruff в gh-112389.)
statistics¶
Добавлен
kde()для оценки плотности ядра. Это позволяет оценить непрерывную функцию плотности вероятности по фиксированному числу дискретных выборок. (Автор: Raymond Hettinger в gh-115863.)Добавлен
kde_random()для выборки из оценённой функции плотности вероятности, созданной с помощьюkde(). (Автор: Raymond Hettinger в gh-115863.)
подпроцесс¶subprocess
Модуль
subprocessтеперь использует функциюposix_spawn()в большем числе ситуаций.В частности, когда close_fds равно
True(по умолчанию),posix_spawn()будет использоваться, если библиотека C предоставляетposix_spawn_file_actions_addclosefrom_np(), что включает последние версии Linux, FreeBSD и Solaris. На Linux это должно работать аналогично существующему коду на основеvfork()для Linux.Частный регулировочный параметр
subprocess._USE_POSIX_SPAWNможно установить вFalse, если необходимо принудительно запретитьsubprocessиспользоватьposix_spawn(). Пожалуйста, сообщите причину и информацию о платформе в трекер задач, если вы установите это, чтобы мы могли улучшить логику выбора API для всех. (Автор: Jakub Kulik в gh-113117.)
sys¶
Добавлена функция
_is_interned()для проверки, была ли строка интернирована. Эта функция не гарантированно существует во всех реализациях Python. (Автор: Serhiy Storchaka в gh-78573.)
tempfile¶
В Windows режим по умолчанию
0o700, используемыйtempfile.mkdtemp(), теперь ограничивает доступ к новому каталогу из-за изменений вos.mkdir(). Это смягчение для CVE 2024-4030. (Автор: Steve Dower в gh-118486.)
time¶
В Windows
monotonic()теперь использует тактовый генераторQueryPerformanceCounter()с разрешением 1 микросекунда, вместо тактового генератораGetTickCount64(), который имеет разрешение 15,6 миллисекунд. (Автор: Victor Stinner в gh-88494.)В Windows
time()теперь использует тактовый генераторGetSystemTimePreciseAsFileTime()с разрешением 1 микросекунда, вместо тактового генератораGetSystemTimeAsFileTime(), который имеет разрешение 15,6 миллисекунд. (Автор: Victor Stinner в gh-63207.)
tkinter¶
Добавлены методы виджета
tkinter:tk_busy_hold(),tk_busy_configure(),tk_busy_cget(),tk_busy_forget(),tk_busy_current()иtk_busy_status(). (Авторы: Miguel, klappnase и Serhiy Storchaka в gh-72684.)Метод виджета
tkinterwm_attributes()теперь принимает имя атрибута без префикса минус для получения атрибутов окна, напримерw.wm_attributes('alpha'), и позволяет указывать атрибуты и значения для установки в качестве именованных аргументов, напримерw.wm_attributes(alpha=0.5). (Автор: Serhiy Storchaka в gh-43457.)wm_attributes()теперь может возвращать атрибуты в видеdict, используя новый необязательный именованный параметр return_python_dict. (Автор: Serhiy Storchaka в gh-43457.)Text.count()теперь может возвращать простоеint, когда используется новый необязательный именованный параметр return_ints. В противном случае единственное число возвращается как кортеж из одного элемента илиNone. (Автор: Serhiy Storchaka в gh-97928.)Добавлена поддержка типа элемента “vsapi” в методе
element_create()tkinter.ttk.Style. (Автор: Serhiy Storchaka в gh-68166.)Добавлен метод
after_info()для виджетов Tkinter. (Автор: Cheryl Sabella в gh-77020.)Добавлен новый метод
copy_replace()вPhotoImageдля копирования области из одного изображения в другое, возможно с масштабированием пикселей, субдискретизацией или тем и другим. (Автор: Serhiy Storchaka в gh-118225.)Добавлен параметр from_coords в методы
PhotoImagecopy(),zoom()иsubsample(). Добавлены параметры zoom и subsample в методPhotoImagecopy(). (Автор: Serhiy Storchaka в gh-118225.)Добавлены методы
PhotoImageread()для чтения изображения из файла иdata()для получения данных изображения. Добавлены параметры background и grayscale в методwrite(). (Автор: Serhiy Storchaka в gh-118271.)
traceback¶
Добавлен атрибут
exc_type_strвTracebackException, который содержит строковое представление exc_type. Объявлен устаревшим атрибутexc_type, который содержит сам объект типа. Добавлен параметр save_exc_type (по умолчаниюTrue) для указания, следует ли сохранятьexc_type. (Автор: Irit Katriel в gh-112332.)Добавлен новый именованный параметр show_group в
TracebackException.format_exception_only()для (рекурсивного) форматирования вложенных исключений экземпляраBaseExceptionGroup. (Автор: Irit Katriel в gh-105292.)
types¶
SimpleNamespaceтеперь может принимать один позиционный аргумент для инициализации аргументов пространства имён. Этот аргумент должен быть либо отображением (mapping), либо итерируемым объектом пар ключ-значение. (Автор: Serhiy Storchaka в gh-108191.)
typing¶
PEP 705: Добавлен
ReadOnly– специальная типовая конструкция для пометки элементаTypedDictкак только для чтения для статических анализаторов типов.PEP 742: Добавлен
TypeIs– типовая конструкция, которая позволяет указать статическому анализатору, как сужать тип.Добавлен
NoDefault– объект-маркер, используемый для представления значений по умолчанию некоторых параметров в модулеtyping. (Автор: Jelle Zijlstra в gh-116126.)Добавлен
get_protocol_members()для получения множества членов, определяющихtyping.Protocol. (Автор: Jelle Zijlstra в gh-104873.)Добавлен
is_protocol()для проверки, является ли классProtocol. (Автор: Jelle Zijlstra в gh-104873.)ClassVarтеперь можно вкладывать вFinalи наоборот. (Автор: Mehdi Drissi в gh-89547.)
unicodedata¶
База данных Unicode обновлена до версии 15.1.0. (Автор: James Gerity в gh-109559.)
venv¶
Добавлена поддержка создания файлов игнорирования для систем управления версиями (SCM) в каталоге виртуального окружения. По умолчанию поддерживается Git. Реализована как добровольное включение через API (который можно расширить для поддержки других SCM, таких как
EnvBuilderиcreate()) и добровольное отключение через CLI с помощью--without-scm-ignore-files. (Автор: Brett Cannon в gh-108125.)
warnings¶
PEP 702: Новый декоратор
warnings.deprecated()предоставляет способ сообщать об устаревании статическому анализатору типов и предупреждать об использовании устаревших классов и функций.DeprecationWarningтакже может быть возбуждено при использовании декорированной функции или класса во время выполнения. (Автор: Jelle Zijlstra в gh-104003.)
xml¶
Добавлена возможность управлять отложенным переразбором Expat >=2.6.0 (CVE 2023-52425) путём добавления пяти новых методов:
xml.sax.expatreader.ExpatParser.flush()
(Автор: Sebastian Pipping в gh-115623.)
Добавлен метод
close()для итератора, возвращаемогоiterparse(), для явной очистки. (Автор: Serhiy Storchaka в gh-69893.)
zipimport¶
Оптимизации¶Optimizations
Время импорта нескольких модулей стандартной библиотеки значительно сокращено. Например, время импорта модуля
typingуменьшено примерно на треть за счёт удаления зависимостей отreиcontextlib. Среди других модулей, ускоривших импорт:email.utils,enum,functools,importlib.metadataиthreading. (Авторы: Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas и другие в gh-109653.)textwrap.indent()теперь работает примерно на 30% быстрее для больших входных данных. (Автор: Inada Naoki в gh-107369.)Модуль
subprocessтеперь использует функциюposix_spawn()в большем числе ситуаций, в том числе когда close_fds равноTrue(значение по умолчанию) на многих современных платформах. Это должно дать заметный прирост производительности при запуске процессов на FreeBSD и Solaris. Подробнее см. в разделе подпроцесс ниже. (Автор: Jakub Kulik в gh-113117.)
Удалённые модули и API¶Removed Modules And APIs
PEP 594: Удаление «мёртвых батареек» из стандартной библиотеки¶PEP 594: Remove “dead batteries” from the standard library
PEP 594 предложил удалить 19 модулей из стандартной библиотеки, которые в просторечии называют «мёртвыми батарейками» из-за их исторического, устаревшего или небезопасного статуса. Все перечисленные ниже модули были объявлены устаревшими в Python 3.11 и теперь удалены:
aifcstandard-aifc: Используйте перераспространяемую библиотеку
aifcиз PyPI.
audioopaudioop-lts: Используйте библиотеку
audioop-ltsиз PyPI.
chunkstandard-chunk: Используйте перераспространяемую библиотеку
chunkиз PyPI.
cgiиcgitbcgi.FieldStorageобычно можно заменить наurllib.parse.parse_qsl()для запросовGETиHEAD, а модульemail.messageили библиотеку multipart – для запросовPOSTиPUT.cgi.parse()можно заменить вызовомurllib.parse.parse_qs()непосредственно для нужной строки запроса, если только ввод не являетсяmultipart/form-data, который следует заменять, как описано ниже дляcgi.parse_multipart().cgi.parse_header()можно заменить функциональностью пакетаemail, который реализует те же RFC MIME. Например, с помощьюemail.message.EmailMessage:from email.message import EmailMessage msg = EmailMessage() msg['content-type'] = 'application/json; charset="utf8"' main, params = msg.get_content_type(), msg['content-type'].params
cgi.parse_multipart()можно заменить функциональностью из пакетаemail, реализующего те же MIME RFC, или библиотекой multipart. Например, классыemail.message.EmailMessageиemail.message.Message.standard-cgi: и standard-cgitb: Используйте перераспространяемые библиотеки
cgiиcgitbиз PyPI.
cryptи закрытое расширение_crypt. Модульhashlibможет стать подходящей заменой, если требуется простое хеширование значения. В противном случае доступны различные сторонние библиотеки на PyPI:bcrypt: Современное хеширование паролей для вашего ПО и серверов.
argon2-cffi: Безопасный алгоритм хеширования паролей Argon2.
legacycrypt: Обёртка
ctypesдля вызова библиотеки POSIX crypt и связанной функциональности.crypt_r: Fork of the
cryptmodule, wrapper to the crypt_r(3) library call and associated functionality.standard-crypt и deprecated-crypt-alternative: Используйте перераспространение библиотеки
cryptи повторную реализацию библиотеки_cryptиз PyPI.
imghdr: Библиотеки filetype, puremagic или python-magic следует использовать в качестве замены. Например, функциюpuremagic.what()можно использовать для замены функцииimghdr.what()для всех форматов файлов, поддерживаемыхimghdr.standard-imghdr: Используйте перераспространяемую библиотеку
imghdrиз PyPI.
mailcap: Вместо этого используйте модульmimetypes.standard-mailcap: Используйте перераспространяемую библиотеку
mailcapиз PyPI.
msilibnisnntplib: Вместо этого используйте библиотеку pynntp из PyPI.standard-nntplib: Используйте перераспространяемую библиотеку
nntplibиз PyPI.
ossaudiodev: Для воспроизведения аудио используйте библиотеку pygame из PyPI.pipes: Используйте модульsubprocessвместо этого. Используйтеshlex.quote()для замены недокументированной функцииpipes.quote.standard-pipes: Используйте перераспространяемую библиотеку
pipesиз PyPI.
sndhdr: Библиотеки filetype, puremagic или python-magic следует использовать в качестве замены.standard-sndhdr: Используйте перераспространяемую библиотеку
sndhdrиз PyPI.
spwd: Вместо этого используйте библиотеку python-pam из PyPI.sunaustandard-sunau: Используйте перераспространяемую библиотеку
sunauиз PyPI.
telnetlib, Вместо этого используйте библиотеки telnetlib3 или Exscript из PyPI.standard-telnetlib: Используйте перераспространяемую библиотеку
telnetlibиз PyPI.
uu: Вместо этого используйте модульbase64в качестве современной альтернативы.standard-uu: Используйте перераспространяемую библиотеку
uuиз PyPI.
xdrlibstandard-xdrlib: Используйте перераспространяемую библиотеку
xdrlibиз PyPI.
(Предложено Виктором Стиннером и Закари Уэром в gh-104773 и gh-104780.)
2to3¶
Удалите программу 2to3 и модуль
lib2to3, ранее объявленные устаревшими в Python 3.11. (Предложено Виктором Стиннером в gh-104780.)
builtins¶
Удалена поддержка цепочечных дескрипторов
classmethod(добавленных в gh-63272). Их больше нельзя использовать для обёртывания других дескрипторов, таких какproperty. Основная архитектура этой возможности была ошибочной и привела к нескольким проблемам. Чтобы «пропустить»classmethod, рассмотрите возможность использования атрибута__wrapped__, добавленного в Python 3.10. (Предложено Рэймондом Хеттингером в gh-89519.)Возбуждать
RuntimeErrorпри вызовеframe.clear()на приостановленном фрейме (как это всегда было для выполняющегося фрейма). (Предложено Ирит Катриэль в gh-79932.)
configparser¶
Удалён недокументированный класс
LegacyInterpolation, устаревший в строке документации с Python 3.2 и во время выполнения с Python 3.11. (Автор: Hugo van Kemenade в gh-104886.)
importlib.metadata¶
Удалён устаревший доступ по индексу (
__getitem__()) для объектов EntryPoint. (Автор: Jason R. Coombs в gh-113175.)
locale¶
Удалена функция
locale.resetlocale(), устаревшая в Python 3.11. Вместо неё используйтеlocale.setlocale(locale.LC_ALL, ""). (Автор: Victor Stinner в gh-104783.)
opcode¶
Перенесён
opcode.ENABLE_SPECIALIZATIONв_opcode.ENABLE_SPECIALIZATION. Это поле было добавлено в 3.12, никогда не документировалось и не предназначено для внешнего использования. (Автор: Irit Katriel в gh-105481.)Удалены
opcode.is_pseudo(),opcode.MIN_PSEUDO_OPCODEиopcode.MAX_PSEUDO_OPCODE, которые были добавлены в Python 3.12, но не были документированы, не были доступны черезdisи не предназначались для внешнего использования. (Автор: Irit Katriel в gh-105481.)
optparse¶
Этот модуль больше не считается условно устаревшим. Хотя
argparseостаётся предпочтительным для новых проектов, не использующих сторонние библиотеки обработки аргументов командной строки, в работеargparseесть аспекты, из-за которых модуль нижнего уровняoptparseможет служить лучшей основой для написания библиотек обработки аргументов и для реализации приложений командной строки, которые более строго, чемargparse, соблюдают различные соглашения Unix по обработке командной строки, берущие начало в поведении C-функцииgetopt(). (Авторы: Alyssa Coghlan и Serhiy Storchaka в gh-126180.)
pathlib¶
re¶
Удалены недокументированные, устаревшие и неработающие функция
re.template()и флагre.TEMPLATE/re.T. (Авторы: Serhiy Storchaka и Nikita Sobolev в gh-105687.)
tkinter.tix¶
Удалён модуль
tkinter.tix, устаревший в Python 3.6. Сторонняя библиотека Tix, которую оборачивал этот модуль, больше не поддерживается. (Автор: Zachary Ware в gh-75552.)
turtle¶
Удалён метод
RawTurtle.settiltangle(), помеченный как устаревший в документации с Python 3.1 и во время выполнения с Python 3.11. (Автор: Hugo van Kemenade в gh-104876.)
typing¶
Удалены пространства имён
typing.ioиtyping.re, устаревшие с Python 3.8. Элементы из этих пространств имён можно импортировать напрямую из модуляtyping. (Автор: Sebastian Rittau в gh-92871.)Удалён способ создания типов
TypedDictс помощью именованных аргументов, устаревший в Python 3.11. (Автор: Tomas Roun в gh-104786.)
unittest¶
Удалены следующие функции
unittest, устаревшие в Python 3.11:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()
Вместо них используйте методы
TestLoader:(Автор: Hugo van Kemenade в gh-104835.)
Удалён непроверенный и недокументированный метод
TestProgram.usageExit(), устаревший в Python 3.11. (Автор: Hugo van Kemenade в gh-104992.)
urllib¶
Удалены параметры cafile, capath и cadefault функции
urllib.request.urlopen(), устаревшие в Python 3.6. Вместо них используйте параметр context с экземпляромSSLContext. Функцияssl.SSLContext.load_cert_chain()может использоваться для загрузки конкретных сертификатов, или можно позволитьssl.create_default_context()выбрать доверенные сертификаты центра сертификации (CA) операционной системы. (Автор: Victor Stinner в gh-105382.)
webbrowser¶
Удалён непроверенный и недокументированный класс
MacOSX, устаревший в Python 3.11. Вместо него используйте классMacOSXOSAScript(представленный в Python 3.2). (Автор: Hugo van Kemenade в gh-104804.)Удалён устаревший атрибут
MacOSXOSAScript._name. Вместо него используйте атрибутMacOSXOSAScript.name. (Автор: Nikita Sobolev в gh-105546.)
Новые устаревания¶New Deprecations
-
Устарела недокументированная функция
SetPointerType(), будет удалена в Python 3.15. (Автор: Victor Stinner в gh-105733.)Мягкое устаревание функции
ARRAY()в пользу умноженияtype * length. (Автор: Victor Stinner в gh-105733.)
dis:-
Устарела передача нецелых чисел в аргументы функций и методов, которые учитывают формы множественного числа в модуле
gettext, даже если перевод не найден. (Автор: Serhiy Storchaka в gh-88434.)
glob:Устарели недокументированные функции
glob0()иglob1(). Вместо них используйтеglob()и передавайте объект, подобный пути, указывающий корневой каталог, в параметр root_dir вместо. (Автор: Barney Gale в gh-117337.)
-
Устарел
CGIHTTPRequestHandler, будет удалён в Python 3.15. CGI HTTP-серверы на основе процессов уже очень давно не пользуются популярностью. Этот код был устаревшим, неподдерживаемым и редко использовался. Он имеет высокий потенциал как для ошибок безопасности, так и для функциональных ошибок. (Автор: Gregory P. Smith в gh-109096.)Устарел флаг
--cgiв интерфейсе командной строки python -m http.server, будет удалён в Python 3.15. (Автор: Gregory P. Smith в gh-109096.)
-
Мягкое устаревание аргументов пути к файлу для
guess_type(), используйте вместо негоguess_file_type(). (Автор: Serhiy Storchaka в gh-66543.)
re:Устарела передача необязательных аргументов maxsplit, count или flags в качестве позиционных аргументов в функции на уровне модуля
split(),sub()иsubn(). Эти параметры станут только ключевыми в будущей версии Python. (Автор: Serhiy Storchaka в gh-56166.)
-
Устарел
PurePath.is_reserved(), будет удалён в Python 3.15. Используйтеos.path.isreserved()для обнаружения зарезервированных путей в Windows. (Автор: Barney Gale в gh-88569.)
-
Устарел
java_ver(), будет удалён в Python 3.15. Эта функция полезна только для поддержки Jython, имеет запутанный API и в значительной степени не тестировалась. (Автор: Nikita Sobolev в gh-116349.)
-
Устарела недокументированная функция
ispackage(). (Автор: Zackery Spytz в gh-64020.)
-
Устарела передача более одного позиционного аргумента в функцию
connect()и конструкторConnection. Остальные параметры станут только ключевыми в Python 3.15. (Автор: Erlend E. Aasland в gh-107948.)Устарела передача имени, количества аргументов и вызываемого объекта в качестве ключевых аргументов для
Connection.create_function()иConnection.create_aggregate()Эти параметры станут только позиционными в Python 3.15. (Автор: Erlend E. Aasland в gh-108278.)Устарела передача вызываемого колбэка по ключу для методов
set_authorizer(),set_progress_handler()иset_trace_callback()Connection. Вызываемые колбэки станут только позиционными в Python 3.15. (Автор: Erlend E. Aasland в gh-108278.)
sys:Устарела функция
_enablelegacywindowsfsencoding(), будет удалена в Python 3.16. Вместо неё используйте переменную окруженияPYTHONLEGACYWINDOWSFSENCODING. (Автор: Inada Naoki в gh-73427.)
-
Устарел недокументированный и неиспользуемый атрибут
TarFile.tarfile, будет удалён в Python 3.16. (Автор: в gh-115256.)
-
Устарел атрибут
TracebackException.exc_type. Вместо него используйтеTracebackException.exc_type_str. (Автор: Irit Katriel в gh-112332.)
-
Устарел недокументированный синтаксис ключевых аргументов для создания классов
NamedTuple(например,Point = NamedTuple("Point", x=int, y=int)), будет удалён в Python 3.15. Вместо этого используйте синтаксис на основе класса или функциональный синтаксис. (Автор: Alex Waygood в gh-105566.)Устарел пропуск параметра fields при создании класса
NamedTupleилиtyping.TypedDict, а также устарела передачаNoneв параметр fields обоих типов. Python 3.15 потребует допустимую последовательность для параметра fields. Чтобы создать класс NamedTuple с нулевым количеством полей, используйтеclass NT(NamedTuple): passилиNT = NamedTuple("NT", ()). Чтобы создать класс TypedDict с нулевым количеством полей, используйтеclass TD(TypedDict): passилиTD = TypedDict("TD", {}). (Автор: Alex Waygood в gh-105566 и gh-105570.)Устарела функция-декоратор
typing.no_type_check_decorator(), будет удалена в Python 3.15. После восьми лет в модулеtypingона так и не была поддержана ни одним крупным средством проверки типов. (Автор: Alex Waygood в gh-106309.)Устарел
typing.AnyStr. В Python 3.16 он будет удалён изtyping.__all__, и во время выполнения будет выдаватьсяDeprecationWarningпри его импорте или обращении к нему. Полностью он будет удалён в Python 3.18. Вместо него используйте новый синтаксис параметров типа. (Автор: Michael The в gh-107116.)
wave:Устарели методы
getmark(),setmark(), иgetmarkers()классовWave_readиWave_write, будут удалены в Python 3.15. (Автор: Victor Stinner в gh-105096.)
Ожидается удаление в 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.)-
Классы наблюдателя дочерних процессов
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.)
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:pkgutil.find_loader()иpkgutil.get_loader()теперь вызываютDeprecationWarning; используйтеimportlib.util.find_spec()вместо этого. (Автор: Nikita Sobolev, gh-97850.)pty:master_open(): используйтеpty.openpty().slave_open(): используйтеpty.openpty().
-
versionиversion_info.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.
-
load_module()устарел начиная с Python 3.10. Вместо него используйтеexec_module(). (Внёс вклад Jiahao Li в gh-125746.)
Запланировано к удалению в Python 3.16¶Pending removal in Python 3.16
Система импорта:
Установка
__loader__в модуле при отсутствии__spec__.loaderустарела. В Python 3.16__loader__перестанет устанавливаться или учитываться системой импорта или стандартной библиотекой.
-
Код формата
'u'(wchar_t) устарел в документации начиная с Python 3.3 и во время выполнения начиная с Python 3.13. Используйте код формата'w'(Py_UCS4) для символов Unicode.
-
asyncio.iscoroutinefunction()устарело и будет удалено в Python 3.16; используйтеinspect.iscoroutinefunction()вместо этого. (Предложено Jiahao Li и Kumar Aditya в gh-122875.)Система политик
asyncioустарела и будет удалена в Python 3.16. В частности, следующие классы и функции устарели:Для использования нужной реализации цикла событий следует применять
asyncio.run()илиasyncio.Runnerс параметром loop_factory.Например, чтобы использовать
asyncio.SelectorEventLoopв Windows:import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Предложено Kumar Aditya в gh-127949.)
-
Поразрядная инверсия для булевых типов,
~Trueили~Falseустарела начиная с Python 3.12, поскольку даёт неожиданные и неинтуитивные результаты (-2и-1). Используйтеnot xдля логического отрицания булевого значения. В редких случаях, когда требуется поразрядная инверсия базового целого числа, явно преобразуйте вint(~int(x)).
-
Вызов реализации
functools.reduce()на Python с function или sequence в качестве именованных аргументов устарел начиная с Python 3.14.
-
Поддержка пользовательских обработчиков логирования с аргументом strm устарела и запланирована к удалению в Python 3.16. Вместо этого определяйте обработчики с аргументом stream. (Предложено Mariusz Felisiak в gh-115032.)
-
Допустимые расширения начинаются с точки ‘.’ или пусты для
mimetypes.MimeTypes.add_type(). Расширения без точки устарели и будут вызыватьValueErrorв Python 3.16. (Предложено Hugo van Kemenade в gh-75223.)
-
Исключение
ExecErrorустарело начиная с Python 3.14. Оно не используется ни одной функцией вshutilначиная с Python 3.4 и теперь является псевдонимомRuntimeError.
-
Метод
Class.get_methodsустарел начиная с Python 3.14.
sys:Функция
_enablelegacywindowsfsencoding()устарела начиная с Python 3.13. Используйте переменную окруженияPYTHONLEGACYWINDOWSFSENCODING.
-
Функция
sysconfig.expand_makefile_vars()устарела начиная с Python 3.14. Используйте аргументvarsизsysconfig.get_paths().
-
Недокументированный и неиспользуемый атрибут
TarFile.tarfileустарел начиная с Python 3.13.
Запланировано к удалению в Python 3.17¶Pending removal in Python 3.17
-
collections.abc.ByteStringзапланирован к удалению в Python 3.17.Используйте
isinstance(obj, collections.abc.Buffer)для проверки, реализует лиobjпротокол буфера во время выполнения. Для использования в аннотациях типов используйтеBufferили объединение, которое явно указывает типы, поддерживаемые вашим кодом (например,bytes | bytearray | memoryview).ByteStringизначально задумывался как абстрактный класс, который должен был служить супертипом как дляbytes, так и дляbytearray. Однако, поскольку у ABC никогда не было методов, знание того, что объект является экземпляромByteString, никогда не давало полезной информации об объекте. Другие распространённые типы буферов, такие какmemoryview, также никогда не рассматривались как подтипыByteString(ни во время выполнения, ни статическими проверками типов).См. PEP 688 для получения подробностей. (Автор: Shantanu Jain в gh-91896.)
-
До Python 3.14 старые объединения реализовывались с помощью приватного класса
typing._UnionGenericAlias. Этот класс больше не нужен для реализации, но он сохранён для обратной совместимости, его удаление запланировано на Python 3.17. Пользователям следует использовать документированные вспомогательные средства интроспекции, такие какtyping.get_origin()иtyping.get_args(), вместо того чтобы полагаться на детали приватной реализации.typing.ByteString, устаревший с Python 3.9, запланирован к удалению в Python 3.17.Используйте
isinstance(obj, collections.abc.Buffer)для проверки, реализует лиobjпротокол буфера во время выполнения. Для использования в аннотациях типов используйтеBufferили объединение, которое явно указывает типы, поддерживаемые вашим кодом (например,bytes | bytearray | memoryview).ByteStringизначально задумывался как абстрактный класс, который должен был служить супертипом как дляbytes, так и дляbytearray. Однако, поскольку у ABC никогда не было методов, знание того, что объект является экземпляромByteString, никогда не давало полезной информации об объекте. Другие распространённые типы буферов, такие какmemoryview, также никогда не рассматривались как подтипыByteString(ни во время выполнения, ни статическими проверками типов).См. PEP 688 для получения подробностей. (Автор: Shantanu Jain в gh-91896.)
Запланировано удаление в Python 3.18¶Pending removal in Python 3.18
Запланировано к удалению в Python 3.19¶Pending removal in Python 3.19
Будет удалено в будущих версиях¶Pending removal in future versions
Следующие API будут удалены в будущем, хотя на данный момент нет запланированной даты их удаления.
-
Вложение групп аргументов и вложение взаимоисключающих групп устарело.
Передача недокументированного именованного аргумента prefix_chars в
add_argument_group()теперь устарела.Конвертер типов
argparse.FileTypeустарел.
-
Генераторы: сигнатура
throw(type, exc, tb)иathrow(type, exc, tb)устарела: используйтеthrow(exc)иathrow(exc)вместо неё, сигнатуру с одним аргументом.В настоящее время Python принимает числовые литералы, за которыми сразу следуют ключевые слова, например
0in x,1or x,0if 1else 2. Это допускает запутанные и неоднозначные выражения вроде[0x1for x in y](которое может быть интерпретировано как[0x1 for x in y]или[0x1f or x in y]). Выдаётся предупреждение синтаксиса, если за числовым литералом сразу следует одно из ключевых словand,else,for,if,in,isиor. В будущем выпуске это будет изменено на синтаксическую ошибку. (gh-87999)Поддержка методов
__index__()и__int__(), возвращающих не-int тип: эти методы должны будут возвращать экземпляр строгого подклассаint.Поддержка метода
__float__(), возвращающего строгий подклассfloat: эти методы должны будут возвращать экземплярfloat.Поддержка метода
__complex__(), возвращающего строгий подклассcomplex: эти методы должны будут возвращать экземплярcomplex.Передача комплексного числа в качестве аргумента real или imag в конструкторе
complex()теперь устарела; его следует передавать только как единственный позиционный аргумент. (Автор: Сергей Сторчака в gh-109218.)
calendar: константыcalendar.Januaryиcalendar.Februaryустарели и заменены наcalendar.JANUARYиcalendar.FEBRUARY. (Автор: Prince Roshan в gh-103636.)codecs: используйтеopen()вместоcodecs.open(). (gh-133038)codeobject.co_lnotab: используйте методcodeobject.co_lines()вместо этого.-
utcnow(): используйтеdatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): используйтеdatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: значение множественного числа должно быть целым числом.-
cache_from_source(): параметр debug_override устарел: используйте параметр optimization вместо него.
-
EntryPoints: интерфейс кортежа.Неявное
Noneдля возвращаемых значений.
logging: методwarn()устарел начиная с Python 3.3, используйтеwarning()вместо него.mailbox: использование StringIO в режиме ввода и текстовом режиме устарело, используйте BytesIO и двоичный режим.os: вызовos.register_at_fork()в многопоточном процессе.pydoc.ErrorDuringImport: кортежное значение для параметра exc_info устарело, используйте экземпляр исключения.re: теперь применяются более строгие правила для числовых ссылок на группы и имён групп в регулярных выражениях. В качестве числовой ссылки теперь принимается только последовательность цифр ASCII. Имя группы в байтовых шаблонах и строках замены теперь может содержать только буквы ASCII, цифры и знак подчёркивания. (Автор: Сергей Сторчака в gh-91760.)Модули
sre_compile,sre_constantsиsre_parse.shutil: параметр onerror методаrmtree()устарел в Python 3.12; используйте параметр onexc вместо него.ssl: опции и протоколы:ssl.SSLContextбез аргумента протокол устарело.ssl.SSLContext:set_npn_protocols()иselected_npn_protocol()устарели: используйте ALPN вместо них.ssl.OP_NO_SSL*: опцииssl.OP_NO_TLS*: опцииssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threading: методыthreading.Condition.notifyAll(): используйтеnotify_all().threading.Event.isSet(): используйтеis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): используйте атрибутthreading.Thread.daemon.threading.Thread.getName(),threading.Thread.setName(): используйте атрибутthreading.Thread.name.threading.currentThread(): используйтеthreading.current_thread().threading.activeCount(): используйтеthreading.active_count().
Внутренний класс
typing._UnionGenericAliasбольше не используется для реализацииtyping.Union. Для сохранения совместимости с пользователями, использующими этот закрытый класс, будет предоставлена прослойка совместимости как минимум до Python 3.17. (Автор: Jelle Zijlstra, gh-105499.)unittest.IsolatedAsyncioTestCase: возврат значения, не являющегосяNone, из тестового примера устарел.urllib.parseустаревшие функции: используйтеurlparse()вместо них.splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()не должна выполнять частичную запись.xml.etree.ElementTree: проверка истинностного значенияElementустарела. В будущем выпуске она всегда будет возвращатьTrue. Вместо этого используйте явные проверкиlen(elem)илиelem is not None.sys._clear_type_cache()устарело: используйтеsys._clear_internal_caches()вместо него.
Изменения байт-кода CPython¶CPython Bytecode Changes
Аргумент oparg инструкции
YIELD_VALUEтеперь равен1, если yield является частью yield-from или await, и0в противном случае. Аргумент oparg инструкцииRESUMEбыл изменён: добавлен бит, указывающий, равна ли глубина except 1, что необходимо для оптимизации закрытия генераторов. (Автор: Irit Katriel, gh-111354.)
Изменения C API¶C API Changes
Новые возможности¶New Features
Добавлен C API PyMonitoring для генерации событий мониторинга PEP 669:
PyMonitoring_FireBranchEvent
(Автор: Irit Katriel, gh-111997).
Добавлена
PyMutex– легковесная мьютекс-блокировка, занимающая один байт, а также новые функцииPyMutex_Lock()иPyMutex_Unlock().PyMutex_Lock()освободит GIL (если он удерживается в данный момент), если операции необходимо заблокироваться. (Автор: Sam Gross, gh-108724.)Добавлен C API PyTime для предоставления доступа к системным часам:
(Авторы: Victor Stinner и Petr Viktorin, gh-110850.)
Добавлена функция
PyDict_ContainsString()с тем же поведением, что иPyDict_Contains(), но key задаётся как строка байтов в кодировке UTF-8 типа const char*, а не PyObject*. (Автор: Victor Stinner, gh-108314.)Добавлены функции
PyDict_GetItemRef()иPyDict_GetItemStringRef(), которые ведут себя аналогичноPyDict_GetItemWithError(), но возвращают сильную ссылку вместо заимствованной ссылки. Кроме того, эти функции возвращают-1при ошибке, что устраняет необходимость проверятьPyErr_Occurred(). (Автор: Victor Stinner, gh-106004.)Добавлена функция
PyDict_SetDefaultRef(), которая ведёт себя аналогичноPyDict_SetDefault(), но возвращает сильную ссылку вместо заимствованной ссылки. Эта функция возвращает-1при ошибке,0при вставке и1, если ключ уже присутствовал в словаре. (Автор: Sam Gross, gh-112066.)Добавлены функции
PyDict_Pop()иPyDict_PopString()для удаления ключа из словаря с возможностью возврата удалённого значения. Это похоже наdict.pop(), но без значения по умолчанию, иKeyErrorне вызывается для отсутствующих ключей. (Авторы: Stefan Behnel и Victor Stinner, gh-111262.)Добавлены функции
PyMapping_GetOptionalItem()иPyMapping_GetOptionalItemString()как альтернативыPyObject_GetItem()иPyMapping_GetItemString()соответственно. Новые функции не вызываютKeyError, если запрошенный ключ отсутствует в отображении. Эти варианты удобнее и быстрее, если отсутствие ключа не должно считаться ошибкой. (Автор: Serhiy Storchaka, gh-106307.)Добавлены функции
PyObject_GetOptionalAttr()иPyObject_GetOptionalAttrString()как альтернативыPyObject_GetAttr()иPyObject_GetAttrString()соответственно. Новые функции не вызываютAttributeError, если запрошенный атрибут не найден у объекта. Эти варианты удобнее и быстрее, если отсутствие атрибута не должно считаться ошибкой. (Автор: Serhiy Storchaka, gh-106521.)Добавлена функция
PyErr_FormatUnraisable()как расширениеPyErr_WriteUnraisable(), позволяющее настраивать сообщение предупреждения. (Автор: Serhiy Storchaka, gh-108082.)Добавлены новые функции, которые возвращают сильную ссылку вместо заимствованной ссылки для локальных переменных фрейма, глобальных и встроенных объектов, в рамках PEP 667:
(Авторы: Марк Шеннон и Тянь Гао в gh-74929.)
Добавлены функции
Py_GetConstant()иPy_GetConstantBorrowed()для получения сильных или заёмных ссылок на константы. Например,Py_GetConstant(Py_CONSTANT_ZERO)возвращает сильную ссылку на константу ноль. (Автор: Виктор Стиннер в gh-115754.)Добавлена функция
PyImport_AddModuleRef()как заменаPyImport_AddModule(), возвращающая сильную ссылку вместо заёмной ссылки. (Автор: Виктор Стиннер в gh-105922.)Добавлена функция
Py_IsFinalizing()для проверки, завершается ли основной интерпретатор Python. (Автор: Виктор Стиннер в gh-108014.)Добавлена функция
PyList_GetItemRef()как заменаPyList_GetItem(), возвращающая сильную ссылку вместо заёмной ссылки. (Автор: Сэм Гросс в gh-114329.)Добавлены функции
PyList_Extend()иPyList_Clear(), соответствующие методам Pythonlist.extend()иlist.clear(). (Автор: Виктор Стиннер в gh-111138.)Добавлена функция
PyLong_AsInt(). Она ведёт себя аналогичноPyLong_AsLong(), но сохраняет результат в C int вместо C long. (Автор: Виктор Стиннер в gh-108014.)Добавлены функции
PyLong_AsNativeBytes(),PyLong_FromNativeBytes()иPyLong_FromUnsignedNativeBytes()для упрощения преобразования между нативными целочисленными типами и объектами Pythonint. (Автор: Стив Дауэр в gh-111140.)Добавлена функция
PyModule_Add(), похожая наPyModule_AddObjectRef()иPyModule_AddObject(), но всегда крадущая ссылку на значение. (Автор: Сергей Сторчака в gh-86493.)Добавлена функция
PyObject_GenericHash(), реализующая хеш-функцию по умолчанию для объекта Python. (Автор: Сергей Сторчака в gh-113024.)Добавлена функция
Py_HashPointer()для хеширования сырого указателя. (Автор: Виктор Стиннер в gh-111545.)Добавлены функции
PyObject_VisitManagedDict()иPyObject_ClearManagedDict(). Они должны вызываться функциями traverse и clear типа, использующего флагPy_TPFLAGS_MANAGED_DICT. Проект pythoncapi-compat можно использовать для применения этих функций с Python 3.11 и 3.12. (Автор: Виктор Стиннер в gh-107073.)Добавлены функции
PyRefTracer_SetTracer()иPyRefTracer_GetTracer(), позволяющие отслеживать создание и уничтожение объектов так же, как это делает модульtracemalloc. (Автор: Пабло Галиндо в gh-93502.)Добавлена функция
PySys_AuditTuple()как альтернативаPySys_Audit(), принимающая аргументы события как объект Pythontuple. (Автор: Виктор Стиннер в gh-85283.)Добавлена функция
PyThreadState_GetUnchecked()как альтернативаPyThreadState_Get(), которая не завершает процесс фатальной ошибкой, если онаNULL. Вызывающий код отвечает за проверку, является ли результатNULL. (Автор: Виктор Стиннер в gh-108867.)Добавлена функция
PyType_GetFullyQualifiedName()для получения полного квалифицированного имени типа. Имя модуля добавляется, еслиtype.__module__является строкой и не равна ни'builtins', ни'__main__'. (Автор: Виктор Стиннер в gh-111696.)Добавлена функция
PyType_GetModuleName()для получения имени модуля типа. Это эквивалентно получению атрибутаtype.__module__. (Авторы: Эрик Сноу и Виктор Стиннер в gh-111696.)Добавлены функции
PyUnicode_EqualToUTF8AndSize()иPyUnicode_EqualToUTF8()для сравнения объекта Unicode с const char* строкой в кодировке UTF-8 и1, если они равны, или0в противном случае. Эти функции не вызывают исключений. (Автор: Сергей Сторчака в gh-110289.)Добавлена функция
PyWeakref_GetRef()как альтернативаPyWeakref_GetObject(), возвращающая сильную ссылку илиNULL, если объект больше не существует. (Автор: Виктор Стиннер в gh-105927.)Добавлены исправленные варианты функций, которые молча игнорируют ошибки:
PyObject_HasAttrStringWithError()заменяетPyObject_HasAttrString().PyMapping_HasKeyStringWithError()заменяетPyMapping_HasKeyString().
Новые функции возвращают
-1в случае ошибок, стандартные1для истинного значения и0для ложного.(Автор: Сергей Сторчака в gh-108511.)
Изменённые C API¶Changed C APIs
Параметр keywords функций
PyArg_ParseTupleAndKeywords()иPyArg_VaParseTupleAndKeywords()теперь имеет тип char *const* в C и const char *const* в C++ вместо char**. В C++ это делает эти функции совместимыми с аргументами типа const char *const*, const char** или char *const* без явного приведения типа. В C функции поддерживают только аргументы типа char *const*. Это можно переопределить с помощью макросаPY_CXX_CONST. (Автор: Сергей Сторчака в gh-65210.)PyArg_ParseTupleAndKeywords()теперь поддерживает не-ASCII имена параметров-ключевых слов. (Автор: Сергей Сторчака в gh-110815.)Функция
PyCode_GetFirstFree()теперь является нестабильным API и переименована вPyUnstable_Code_GetFirstFree(). (Автор: Богдан Романюк в gh-115781.)Функции
PyDict_GetItem(),PyDict_GetItemString(),PyMapping_HasKey(),PyMapping_HasKeyString(),PyObject_HasAttr(),PyObject_HasAttrString()иPySys_GetObject(), каждая из которых очищала все ошибки, возникшие при их вызове, теперь сообщают об этих ошибках с помощьюsys.unraisablehook(). Их можно заменить другими функциями, как рекомендовано в документации. (Автор: Сергей Сторчака в gh-106672.)Добавлена поддержка форматов
%T,%#T,%Nи%#NвPyUnicode_FromFormat():%T: Возвращает полное имя типа объекта%#T: То же, что выше, но с двоеточием в качестве разделителя%N: Возвращает полное имя типа%#N: То же, что выше, но с двоеточием в качестве разделителя
Больше не нужно определять макрос
PY_SSIZE_T_CLEANперед включениемPython.hпри использовании форматов#в форматных кодах. API, принимающие форматы кодов, всегда используютPy_ssize_tдля форматов#. (Вклад Inada Naoki в gh-104922.)Если Python собран в режиме отладки или
with assertions,PyTuple_SET_ITEM()иPyList_SET_ITEM()теперь проверяют аргумент индекса с помощью утверждения. (Вклад Victor Stinner в gh-106168.)
Изменения ограниченного C API¶Limited C API Changes
Следующие функции теперь включены в ограниченный C API:
Python, собранный с
--with-trace-refs(трассировка ссылок), теперь поддерживает ограниченный API. (Вклад Victor Stinner в gh-108634.)
Удалённые C API¶Removed C APIs
Удалены несколько функций, макросов, переменных и т.д. с именами, начинающимися с
_Pyили_PY(считаются приватными). Если ваш проект затронут одним из этих удалений и вы считаете, что удалённый API должен оставаться доступным, пожалуйста, откройте новую задачу, чтобы запросить публичный C API, и добавьтеcc: @vstinnerв задачу для уведомления Victor Stinner. (Вклад Victor Stinner в gh-106320.)Удалены старые буферные протоколы, объявленные устаревшими в Python 3.0. Вместо них используйте Протокол буфера.
PyObject_CheckReadBuffer(): ИспользуйтеPyObject_CheckBuffer(), чтобы проверить, поддерживает ли объект буферный протокол. Обратите внимание, чтоPyObject_CheckBuffer()не гарантирует, чтоPyObject_GetBuffer()выполнится успешно. Чтобы проверить, действительно ли объект читаем, см. следующий примерPyObject_GetBuffer().PyObject_AsCharBuffer(),PyObject_AsReadBuffer(): Вместо них используйтеPyObject_GetBuffer()иPyBuffer_Release():Py_buffer view; if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) { return NULL; } // `view.buf` и `view.len` используются для чтения из буфера. // Возможно, потребуется привести buf к типу `(const char*)view.buf`. PyBuffer_Release(&view);
PyObject_AsWriteBuffer(): Вместо него используйтеPyObject_GetBuffer()иPyBuffer_Release():Py_buffer view; if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) { return NULL; } // `view.buf` и `view.len` используются для записи в буфер. PyBuffer_Release(&view);
(Вклад Inada Naoki в gh-85275.)
Удалены различные функции, объявленные устаревшими в Python 3.9:
PyEval_CallObject(),PyEval_CallObjectWithKeywords(): Вместо них используйтеPyObject_CallNoArgs()илиPyObject_Call().Предупреждение
В
PyObject_Call()позиционные аргументы должны быть типаtupleи не должны быть типаNULL, а именованные аргументы должны быть типаdictилиNULL, тогда как удалённые функции проверяли типы аргументов и принималиNULLв качестве позиционных и именованных аргументов. Чтобы заменитьPyEval_CallObjectWithKeywords(func, NULL, kwargs)наPyObject_Call(), передайте пустой кортеж в качестве позиционных аргументов с помощьюPyTuple_New(0).PyEval_CallFunction(): Вместо этого используйтеPyObject_CallFunction().PyEval_CallMethod(): Вместо этого используйтеPyObject_CallMethod().PyCFunction_Call(): Вместо этого используйтеPyObject_Call().
(Вклад Victor Stinner в gh-105107.)
Удалены следующие устаревшие функции для настройки инициализации Python, объявленные устаревшими в Python 3.11:
PySys_AddWarnOptionUnicode(): Вместо этого используйтеPyConfig.warnoptions.PySys_AddWarnOption(): Вместо этого используйтеPyConfig.warnoptions.PySys_AddXOption(): Вместо этого используйтеPyConfig.xoptions.PySys_HasWarnOptions(): Вместо этого используйтеPyConfig.xoptions.PySys_SetPath(): Вместо этого задайтеPyConfig.module_search_paths.Py_SetPath(): Вместо этого задайтеPyConfig.module_search_paths.Py_SetStandardStreamEncoding(): Вместо этого задайтеPyConfig.stdio_encoding, и, возможно, такжеPyConfig.legacy_windows_stdio(в Windows)._Py_SetProgramFullPath(): Вместо этого задайтеPyConfig.executable.
Вместо этого используйте новый API
PyConfigиз Python Initialization Configuration (PEP 587), добавленный в Python 3.8. (Вклад Victor Stinner в gh-105145.)Удалены функции
PyEval_AcquireLock()иPyEval_ReleaseLock(), объявленные устаревшими в Python 3.2. Они не обновляли состояние текущего потока. Их можно заменить на:низкоуровневые
PyEval_AcquireThread()иPyEval_RestoreThread();
(Вклад Victor Stinner в gh-105182.)
Удалена функция
PyEval_ThreadsInitialized(), объявленная устаревшей в Python 3.9. Начиная с Python 3.7,Py_Initialize()всегда создаёт GIL: вызовPyEval_InitThreads()ничего не делает, аPyEval_ThreadsInitialized()всегда возвращает ненулевое значение. (Вклад Victor Stinner в gh-105182.)Удалён псевдоним
_PyInterpreterState_Get()дляPyInterpreterState_Get(), который сохранялся для обратной совместимости с Python 3.8. Проект pythoncapi-compat можно использовать, чтобы получитьPyInterpreterState_Get()на Python 3.8 и старше. (Автор: Victor Stinner в gh-106320.)Удалена приватная функция
_PyObject_FastCall(): используйтеPyObject_Vectorcall(), которая доступна начиная с Python 3.8 (PEP 590). (Автор: Victor Stinner в gh-106023.)Удалён заголовочный файл
cpython/pytime.h, который содержал только приватные функции. (Автор: Victor Stinner в gh-106316.)Удалена недокументированная константа
PY_TIMEOUT_MAXиз ограниченного C API. (Автор: Victor Stinner в gh-110014.)Удалены старые макросы trashcan
Py_TRASHCAN_SAFE_BEGINиPy_TRASHCAN_SAFE_END. Оба замените новыми макросамиPy_TRASHCAN_BEGINиPy_TRASHCAN_END. (Автор: Irit Katriel в gh-105111.)
Устаревшие C API¶Deprecated C APIs
Устарели старые функции инициализации Python:
PySys_ResetWarnOptions(): Вместо этого очиститеsys.warnoptionsиwarnings.filters.Py_GetExecPrefix(): Вместо этого используйтеsys.exec_prefix.Py_GetPath(): Вместо этого используйтеsys.path.Py_GetPrefix(): Вместо этого используйтеsys.prefix.Py_GetProgramFullPath(): Вместо этого используйтеsys.executable.Py_GetProgramName(): Вместо этого используйтеsys.executable.Py_GetPythonHome(): Вместо этого используйтеPyConfig.homeили переменную окруженияPYTHONHOME.
(Автор: Victor Stinner в gh-105145.)
Мягкое устаревание функций
PyEval_GetBuiltins(),PyEval_GetGlobals()иPyEval_GetLocals(), которые возвращают заимствованную ссылку. (Мягкое устаревание в рамках PEP 667.)Устарела функция
PyImport_ImportModuleNoBlock(), которая является просто псевдонимомPyImport_ImportModule()начиная с Python 3.3. (Автор: Victor Stinner в gh-105396.)Мягкое устаревание функции
PyModule_AddObject(). Её следует заменить наPyModule_Add()илиPyModule_AddObjectRef(). (Автор: Serhiy Storchaka в gh-86493.)Устарели старые типы
Py_UNICODEиPY_UNICODE_TYPEи макросPy_UNICODE_WIDE. Вместо них напрямую используйте типwchar_t. Начиная с Python 3.3,Py_UNICODEиPY_UNICODE_TYPEявляются просто псевдонимамиwchar_t. (Автор: Victor Stinner в gh-105156.)Устарели функции
PyWeakref_GetObject()иPyWeakref_GET_OBJECT(), которые возвращают заимствованную ссылку. Замените их на новую функциюPyWeakref_GetRef(), которая возвращает сильную ссылку. Проект pythoncapi-compat можно использовать, чтобы получитьPyWeakref_GetRef()на Python 3.12 и старше. (Автор: Victor Stinner в gh-105927.)
Ожидается удаление в Python 3.14¶Pending removal in Python 3.14
Поле
ma_version_tagвPyDictObjectдля модулей расширения (PEP 699; gh-101193).Создание
immutable typesс изменяемыми базовыми классами (gh-95388).
Ожидается удаление в Python 3.15¶Pending removal in Python 3.15
PyImport_ImportModuleNoBlock(): Вместо этого используйтеPyImport_ImportModule().PyWeakref_GetObject()иPyWeakref_GET_OBJECT(): Вместо этого используйтеPyWeakref_GetRef(). Проект pythoncapi-compat можно использовать, чтобы получитьPyWeakref_GetRef()на Python 3.12 и старше.Тип
Py_UNICODEи макросPy_UNICODE_WIDE: Вместо них используйтеwchar_t.PyUnicode_AsDecodedObject(): Вместо этого используйтеPyCodec_Decode().PyUnicode_AsDecodedUnicode(): Вместо этого используйтеPyCodec_Decode(); Обратите внимание, что некоторые кодеки (например, «base64») могут возвращать тип, отличный отstr, например,bytes.PyUnicode_AsEncodedObject(): Вместо этого используйтеPyCodec_Encode().PyUnicode_AsEncodedUnicode(): Вместо этого используйтеPyCodec_Encode(); Обратите внимание, что некоторые кодеки (например, «base64») могут возвращать тип, отличный отbytes, например,str.Функции инициализации Python, устаревшие в Python 3.13:
Py_GetPath(): Вместо этого используйтеPyConfig_Get("module_search_paths")(sys.path).Py_GetPrefix(): Вместо этого используйтеPyConfig_Get("base_prefix")(sys.base_prefix). ИспользуйтеPyConfig_Get("prefix")(sys.prefix), если необходимо обрабатывать виртуальные окружения.Py_GetExecPrefix(): Вместо этого используйтеPyConfig_Get("base_exec_prefix")(sys.base_exec_prefix). ИспользуйтеPyConfig_Get("exec_prefix")(sys.exec_prefix), если необходимо обрабатывать виртуальные окружения.Py_GetProgramFullPath(): Вместо этого используйтеPyConfig_Get("executable")(sys.executable).Py_GetProgramName(): Вместо этого используйтеPyConfig_Get("executable")(sys.executable).Py_GetPythonHome(): ИспользуйтеPyConfig_Get("home")или переменную окруженияPYTHONHOME.
Проект pythoncapi-compat можно использовать, чтобы получить
PyConfig_Get()на Python 3.13 и старше.Функции для настройки инициализации Python, устаревшие в Python 3.11:
PySys_SetArgvEx(): Вместо этого задайтеPyConfig.argv.PySys_SetArgv(): Вместо этого задайтеPyConfig.argv.Py_SetProgramName(): Вместо этого задайтеPyConfig.program_name.Py_SetPythonHome(): Вместо этого задайтеPyConfig.home.PySys_ResetWarnOptions(): Вместо этого очиститеsys.warnoptionsиwarnings.filters.
API
Py_InitializeFromConfig()следует использовать сPyConfigвместо этого.Глобальные переменные конфигурации:
Py_DebugFlag: ИспользуйтеPyConfig.parser_debugилиPyConfig_Get("parser_debug")вместо этого.Py_VerboseFlag: ИспользуйтеPyConfig.verboseилиPyConfig_Get("verbose")вместо этого.Py_QuietFlag: ИспользуйтеPyConfig.quietилиPyConfig_Get("quiet")вместо этого.Py_InteractiveFlag: ИспользуйтеPyConfig.interactiveилиPyConfig_Get("interactive")вместо этого.Py_InspectFlag: ИспользуйтеPyConfig.inspectилиPyConfig_Get("inspect")вместо этого.Py_OptimizeFlag: ИспользуйтеPyConfig.optimization_levelилиPyConfig_Get("optimization_level")вместо этого.Py_NoSiteFlag: ИспользуйтеPyConfig.site_importилиPyConfig_Get("site_import")вместо этого.Py_BytesWarningFlag: ИспользуйтеPyConfig.bytes_warningилиPyConfig_Get("bytes_warning")вместо этого.Py_FrozenFlag: ИспользуйтеPyConfig.pathconfig_warningsилиPyConfig_Get("pathconfig_warnings")вместо этого.Py_IgnoreEnvironmentFlag: ИспользуйтеPyConfig.use_environmentилиPyConfig_Get("use_environment")вместо этого.Py_DontWriteBytecodeFlag: ИспользуйтеPyConfig.write_bytecodeилиPyConfig_Get("write_bytecode")вместо этого.Py_NoUserSiteDirectory: ИспользуйтеPyConfig.user_site_directoryилиPyConfig_Get("user_site_directory")вместо этого.Py_UnbufferedStdioFlag: ИспользуйтеPyConfig.buffered_stdioилиPyConfig_Get("buffered_stdio")вместо этого.Py_HashRandomizationFlag: ИспользуйтеPyConfig.use_hash_seedиPyConfig.hash_seedилиPyConfig_Get("hash_seed")вместо этого.Py_IsolatedFlag: ИспользуйтеPyConfig.isolatedилиPyConfig_Get("isolated")вместо этого.Py_LegacyWindowsFSEncodingFlag: ИспользуйтеPyPreConfig.legacy_windows_fs_encodingилиPyConfig_Get("legacy_windows_fs_encoding")вместо этого.Py_LegacyWindowsStdioFlag: ИспользуйтеPyConfig.legacy_windows_stdioилиPyConfig_Get("legacy_windows_stdio")вместо этого.Py_FileSystemDefaultEncoding,Py_HasFileSystemDefaultEncoding: ИспользуйтеPyConfig.filesystem_encodingилиPyConfig_Get("filesystem_encoding")вместо этого.Py_FileSystemDefaultEncodeErrors: ИспользуйтеPyConfig.filesystem_errorsилиPyConfig_Get("filesystem_errors")вместо этого.Py_UTF8Mode: ИспользуйтеPyPreConfig.utf8_modeилиPyConfig_Get("utf8_mode")вместо этого. (см.Py_PreInitialize())
API
Py_InitializeFromConfig()следует использовать сPyConfigдля установки этих параметров. ИлиPyConfig_Get()можно использовать для получения этих параметров во время выполнения.
Запланировано к удалению в Python 3.16¶Pending removal in Python 3.16
Встроенная копия
libmpdec.
Запланировано удаление в Python 3.18¶Pending removal in Python 3.18
Следующие закрытые функции устарели и планируются к удалению в Python 3.18:
_PyBytes_Join(): используйтеPyBytes_Join()._PyDict_GetItemStringWithError(): используйтеPyDict_GetItemStringRef()._PyDict_Pop(): используйтеPyDict_Pop()._PyLong_Sign(): используйтеPyLong_GetSign()._PyLong_FromDigits()и_PyLong_New(): используйтеPyLongWriter_Create()._PyThreadState_UncheckedGet(): используйтеPyThreadState_GetUnchecked()._PyUnicode_AsString(): используйтеPyUnicode_AsUTF8()._PyUnicodeWriter_Init(): заменить_PyUnicodeWriter_Init(&writer)наwriter = PyUnicodeWriter_Create(0)._PyUnicodeWriter_Finish(): заменить_PyUnicodeWriter_Finish(&writer)наPyUnicodeWriter_Finish(writer)._PyUnicodeWriter_Dealloc(): заменить_PyUnicodeWriter_Dealloc(&writer)наPyUnicodeWriter_Discard(writer)._PyUnicodeWriter_WriteChar(): заменить_PyUnicodeWriter_WriteChar(&writer, ch)наPyUnicodeWriter_WriteChar(writer, ch)._PyUnicodeWriter_WriteStr(): заменить_PyUnicodeWriter_WriteStr(&writer, str)наPyUnicodeWriter_WriteStr(writer, str)._PyUnicodeWriter_WriteSubstring(): заменить_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)наPyUnicodeWriter_WriteSubstring(writer, str, start, end)._PyUnicodeWriter_WriteASCIIString(): заменить_PyUnicodeWriter_WriteASCIIString(&writer, str)наPyUnicodeWriter_WriteASCII(writer, str)._PyUnicodeWriter_WriteLatin1String(): заменить_PyUnicodeWriter_WriteLatin1String(&writer, str)наPyUnicodeWriter_WriteUTF8(writer, str)._PyUnicodeWriter_Prepare(): (нет замены)._PyUnicodeWriter_PrepareKind(): (нет замены)._Py_HashPointer(): используйтеPy_HashPointer()._Py_fopen_obj(): используйтеPy_fopen().
Проект pythoncapi-compat можно использовать для получения этих новых открытых функций в Python 3.13 и старше. (Предложено Виктором Стиннером в gh-128863.)
Будет удалено в будущих версиях¶Pending removal in future versions
Следующие API устарели и будут удалены, хотя на данный момент дата их удаления не назначена.
Py_TPFLAGS_HAVE_FINALIZE: Не требуется начиная с Python 3.8.PyErr_Fetch(): Вместо этого используйтеPyErr_GetRaisedException().PyErr_NormalizeException(): Вместо этого используйтеPyErr_GetRaisedException().PyErr_Restore(): Вместо этого используйтеPyErr_SetRaisedException().PyModule_GetFilename(): Вместо этого используйтеPyModule_GetFilenameObject().PyOS_AfterFork(): Вместо этого используйтеPyOS_AfterFork_Child().PySlice_GetIndicesEx(): Вместо этого используйтеPySlice_Unpack()иPySlice_AdjustIndices().PyUnicode_READY(): Не требуется начиная с Python 3.12PyErr_Display(): Вместо этого используйтеPyErr_DisplayException()._PyErr_ChainExceptions(): Вместо этого используйте_PyErr_ChainExceptions1().Элемент
PyBytesObject.ob_shash: вместо этого вызывайтеPyObject_Hash().API локального хранилища потока (TLS):
PyThread_create_key(): Вместо этого используйтеPyThread_tss_alloc().PyThread_delete_key(): Вместо этого используйтеPyThread_tss_free().PyThread_set_key_value(): Вместо этого используйтеPyThread_tss_set().PyThread_get_key_value(): Вместо этого используйтеPyThread_tss_get().PyThread_delete_key_value(): Вместо этого используйтеPyThread_tss_delete().PyThread_ReInitTLS(): Не требуется с Python 3.7.
Изменения сборки¶Build Changes
arm64-apple-iosиarm64-apple-ios-simulatorтеперь являются платформами третьего уровня PEP 11. (PEP 730 написан, реализация предоставлена Russell Keith-Magee в gh-114099.)aarch64-linux-androidиx86_64-linux-androidтеперь являются платформами третьего уровня PEP 11. (PEP 738 написан, реализация предоставлена Malcolm Smith в gh-116622.)wasm32-wasiтеперь является платформой второго уровня PEP 11. (Автор: Brett Cannon в gh-115192.)wasm32-emscriptenбольше не является поддерживаемой платформой PEP 11. (Автор: Brett Cannon в gh-115192.)Для сборки CPython теперь требуется компилятор с поддержкой атомарной библиотеки C11, встроенных атомарных функций GCC или встроенных функций MSVC для атомарных операций (interlocked intrinsics).
Для перегенерации скрипта
configureтеперь требуются Autoconf 2.71 и aclocal 1.16.5. (Авторы: Christian Heimes в gh-89886 и Victor Stinner в gh-112090.)Для сборки модуля расширения
sqlite3требуется SQLite 3.15.2 или новее. (Автор: Erlend Aasland в gh-105875.)CPython теперь по умолчанию включает библиотеку mimalloc. Она распространяется под лицензией MIT; см. лицензию mimalloc. Включённая mimalloc содержит пользовательские изменения – подробности gh-113141. (Автор: Dino Viehland в gh-109914.)
Опция
configure--with-system-libmpdecтеперь по умолчанию равнаyes. Включённая копияlibmpdecбудет удалена в Python 3.16.Python, собранный с
configure--with-trace-refs(трассировка ссылок), теперь ABI-совместим со сборкой Python для выпуска и отладочной сборкой. (Автор: Victor Stinner в gh-108634.)На системах POSIX имена файлов pkg-config (
.pc) теперь содержат флаги ABI. Например, сборка со свободной потокостью (free-threaded) генерируетpython-3.13t.pc, а отладочная сборка генерируетpython-3.13d.pc.Расширения C
errno,fcntl,grp,md5,pwd,resource,termios,winsound,_ctypes_test,_multiprocessing.posixshmem,_scproxy,_stat,_statistics,_testconsole,_testimportmultipleи_uuidтеперь собираются с ограниченным C API. (Автор: Victor Stinner в gh-85283.)
Перенос на Python 3.13¶Porting to Python 3.13
В этом разделе перечислены описанные ранее изменения и другие исправления, которые могут потребовать доработки кода.
Изменения в Python API¶Changes in the Python API
PEP 667 вводит несколько изменений в семантику
locals()иf_locals:Вызов
locals()в оптимизированной области видимости теперь создаёт независимый снимок при каждом вызове и поэтому больше не обновляет неявно ранее возвращённые ссылки. Чтобы получить прежнее поведение CPython, теперь требуются явные вызовы для обновления первоначально возвращённого словаря результатами последующих вызововlocals(). Функциям выполнения кода, которые неявно обращаются кlocals()(таким какexecиeval), необходимо передавать явное пространство имён для получения их результатов в оптимизированной области видимости. (Изменено в рамках PEP 667.)Вызов
locals()из включения на уровне модуля или класса (в том числе черезexecилиeval) снова ведёт себя так, как если бы включение выполнялось как независимая вложенная функция (т.е. локальные переменные из содержащей области видимости не включаются). В Python 3.12 это поведение изменилось: локальные переменные стали включаться при реализации PEP 709. (Изменено в рамках PEP 667.)Обращение к
FrameType.f_localsв оптимизированной области видимости теперь возвращает прокси со сквозной записью, а не снимок, который обновляется в неопределённые моменты. Если нужен снимок, его нужно создать явно с помощьюdictили метода.copy()прокси. (Изменено в рамках PEP 667.)
functools.partialтеперь выдаётFutureWarningпри использовании в качестве метода. Поведение изменится в будущих версиях Python. Оберните его вstaticmethod(), чтобы сохранить прежнее поведение. (Автор: Serhiy Storchaka в gh-121027.)Теперь
getpass.getuser()возбуждаетOSErrorпри любой ошибке получения имени пользователя вместоImportErrorна платформах, отличных от Unix, илиKeyErrorна платформах Unix, где пустая база паролей.Значение атрибута
modeобъектаgzip.GzipFileтеперь является строкой ('rb'или'wb') вместо целого числа (1или2). Значение атрибутаmodeчитаемого файлоподобного объекта, возвращаемогоzipfile.ZipFile.open(), теперь'rb'вместо'r'. (Автор: Serhiy Storchaka в gh-115961.)mailbox.Maildirтеперь игнорирует файлы, начинающиеся с точки (.). (Автор: Zackery Spytz в gh-65559.)pathlib.Path.glob()иrglob()теперь возвращают как файлы, так и каталоги, если задан шаблон, оканчивающийся на «**», а не только каталоги. Добавьте завершающий слеш, чтобы сохранить прежнее поведение и сопоставлять только каталоги.Модуль
threadingтеперь ожидает, что модуль_threadсодержит функцию_is_main_interpreter(). Эта функция не принимает аргументов и возвращаетTrue, если текущий интерпретатор является главным.Любая библиотека или приложение, предоставляющее пользовательский модуль
_thread, должны предоставлять_is_main_interpreter(), как и другие «приватные» атрибуты модуля. (gh-112826.)
Изменения в C API¶Changes in the C API
Python.hбольше не включает стандартный заголовок<ieeefp.h>. Ранее он подключался для функцииfinite(), которая теперь предоставляется заголовком<math.h>. При необходимости его теперь нужно подключать явно. Также удалён макросHAVE_IEEEFP_H. (Автор: Victor Stinner в gh-108765.)Python.hбольше не включает следующие стандартные заголовочные файлы:<time.h>,<sys/select.h>и<sys/time.h>. При необходимости их теперь нужно подключать явно. Например,<time.h>предоставляет функцииclock()иgmtime(),<sys/select.h>– функциюselect(), а<sys/time.h>– функцииfutimes(),gettimeofday()иsetitimer(). (Автор: Victor Stinner в gh-108765.)В Windows
Python.hбольше не включает стандартный заголовочный файл<stddef.h>. При необходимости его теперь нужно подключать явно. Например, он предоставляет функциюoffsetof()и типыsize_tиptrdiff_t. Явное подключение<stddef.h>уже требовалось на всех остальных платформах, макросHAVE_STDDEF_Hопределён только в Windows. (Автор: Victor Stinner в gh-108765.)Если определён макрос
Py_LIMITED_API, то макросыPy_BUILD_CORE,Py_BUILD_CORE_BUILTINиPy_BUILD_CORE_MODULEтеперь отменяются с помощью<Python.h>. (Автор: Victor Stinner в gh-85283.)Старые макросы корзины
Py_TRASHCAN_SAFE_BEGINиPy_TRASHCAN_SAFE_ENDудалены. Их следует заменить на новые макросыPy_TRASHCAN_BEGINиPy_TRASHCAN_END.Функция
tp_dealloc, использующая старые макросы, например:static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
следует перенести на новые макросы следующим образом:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
Обратите внимание, что
Py_TRASHCAN_BEGINимеет второй аргумент, которым должна быть функция освобождения, в которой он находится. Новые макросы были добавлены в Python 3.8, а старые устарели в Python 3.11. (Автор: Irit Katriel в gh-105111.)
PEP 667 вводит несколько изменений в функции, связанные с фреймами:
Эффект от изменения словаря, возвращаемого
PyEval_GetLocals()в оптимизированной области видимости, изменился. Новые записи словаря, добавленные таким образом, теперь будут только видны последующим вызовамPyEval_GetLocals()в этом фрейме, посколькуPyFrame_GetLocals(),locals()иFrameType.f_localsбольше не обращаются к одному и тому же базовому кэшированному словарю. Изменения, внесённые в записи для реальных имён переменных и имён, добавленных через интерфейсы прокси со сквозной записью, будут перезаписаны при последующих вызовахPyEval_GetLocals()в этом фрейме. Рекомендуемое обновление кода зависит от того, как использовалась функция, поэтому для подробностей обратитесь к уведомлению об устаревании этой функции.Вызов
PyFrame_GetLocals()в оптимизированной области видимости теперь возвращает прокси со сквозной записью, а не снимок, который обновляется в неопределённые моменты. Если нужен снимок, его нужно создать явно (например, с помощьюPyDict_Copy()) или вызвав новый APIPyEval_GetFrameLocals().PyFrame_FastToLocals()иPyFrame_FastToLocalsWithError()больше не имеют никакого эффекта. Вызов этих функций был избыточен начиная с Python 3.11, когда был впервые введёнPyFrame_GetLocals().PyFrame_LocalsToFast()больше не имеет никакого эффекта. Вызов этой функции избыточен теперь, когдаPyFrame_GetLocals()возвращает прокси со сквозной записью для оптимизированных областей видимости.
Python 3.13 удалил множество закрытых функций. Некоторые из них можно заменить следующими альтернативами:
_PyDict_Pop():PyDict_Pop()илиPyDict_PopString();_PyDict_GetItemWithError():PyDict_GetItemRef();_PyErr_WriteUnraisableMsg():PyErr_FormatUnraisable();_PyEval_SetTrace():PyEval_SetTrace()илиPyEval_SetTraceAllThreads();_PyList_Extend():PyList_Extend();_PyLong_AsInt():PyLong_AsInt();_PyMem_RawStrdup():strdup();_PyMem_Strdup():strdup();_PyObject_ClearManagedDict():PyObject_ClearManagedDict();_PyObject_VisitManagedDict():PyObject_VisitManagedDict();_PyThreadState_UncheckedGet():PyThreadState_GetUnchecked();_PyTime_AsSecondsDouble():PyTime_AsSecondsDouble();_PyTime_GetMonotonicClock():PyTime_Monotonic()илиPyTime_MonotonicRaw();_PyTime_GetPerfCounter():PyTime_PerfCounter()илиPyTime_PerfCounterRaw();_PyTime_GetSystemClock():PyTime_Time()илиPyTime_TimeRaw();_PyTime_MAX:PyTime_MAX;_PyTime_MIN:PyTime_MIN;_PyTime_t:PyTime_t;_Py_HashPointer():Py_HashPointer();_Py_IsFinalizing():Py_IsFinalizing().
Проект pythoncapi-compat можно использовать для получения большинства этих новых функций в Python 3.12 и старше.
Изменения в тестах регрессии¶Regression Test Changes
Python, собранный с
configure--with-pydebug, теперь поддерживает опцию командной строки-X presite=package.module. Если она указана, задаёт модуль, который должен импортироваться в начале жизненного цикла интерпретатора, до выполненияsite.py. (Автор: Łukasz Langa в gh-110769.)