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

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


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

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

  • __static_attributes__ хранит имена атрибутов, к которым обращаются через self.X в любой функции внутри тела класса.

  • __firstlineno__ записывает номер первой строки определения класса.

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

  • Добавлено новое исключение PythonFinalizationError, которое возникает, когда операция блокируется во время финализации.

  • Модуль argparse теперь поддерживает объявление устаревшими параметров командной строки, позиционных аргументов и подкоманд.

  • Новые функции base64.z85encode() и base64.z85decode() поддерживают кодирование и декодирование данных Z85.

  • В модуле copy теперь есть функция copy.replace(), которая поддерживает многие встроенные типы и любой класс, определяющий метод __replace__().

  • Новый модуль dbm.sqlite3 теперь является backend’ом по умолчанию для dbm.

  • В модуле os появился набор новых функций для работы с файловыми дескрипторами уведомлений таймеров Linux.

  • Модуль random теперь имеет интерфейс командной строки.

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

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

  • Слот Py_mod_gil теперь используется, чтобы указать, что модуль расширения поддерживает работу с отключённым GIL.

  • Добавлен C API PyTime, предоставляющий доступ к системным часам.

  • PyMutex – это новый легковесный мьютекс, занимающий один байт.

  • Появился новый набор функций для генерации событий мониторинга PEP 669 в C API.

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

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

Важные удаления:

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

См. также

PEP 744

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

См. также

PEP 730, PEP 738

Прочие изменения языка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
    

    (Предоставлено Jelle Zijlstra в gh-109118 и gh-118160.)

  • 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

Улучшенные модули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.

    (Автор: Jelle Zijlstra, gh-105858, gh-117486 и gh-118851.)

  • 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

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

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

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

  • EnumDict стал публичным, чтобы лучше поддерживать наследование EnumType.

fractions

glob

  • Добавлена translate(), функция для преобразования пути с shell-маской в регулярное выражение. (Предложено Barney Gale в gh-72904.)

importlib

  • Следующие функции в importlib.resources теперь позволяют получать доступ к каталогу (или дереву) ресурсов, используя несколько позиционных аргументов (аргументы encoding и errors в функциях чтения текста теперь являются только ключевыми):

    Эти функции больше не считаются устаревшими и не планируются к удалению. (Предложено Petr Viktorin в gh-116608.)

  • contents() по-прежнему считается устаревшим в пользу полнофункционального API Traversable. Однако теперь нет планов по его удалению. (Предложено Petr Viktorin в gh-116608.)

io

ipaddress

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

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

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

re

  • Переименован re.error в PatternError для улучшения ясности. re.error сохранён для обратной совместимости.

shutil

  • Поддержка именованных аргументов dir_fd и follow_symlinks в chown(). (Авторы: Berker Peksag и Tahia K в gh-62308)

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

  • Метод виджета tkinter wm_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 в методы PhotoImage copy(), zoom() и subsample(). Добавлены параметры zoom и subsample в метод PhotoImage copy(). (Автор: Serhiy Storchaka в gh-118225.)

  • Добавлены методы PhotoImage read() для чтения изображения из файла и 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

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

zipimport

  • Добавлена поддержка файлов формата ZIP64. Все любят огромные объёмы данных, верно? (Автор: Tim Hatch в gh-94146.)

Оптимизации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.)

Удалённые модули и APIRemoved Modules And APIs

PEP 594: Удаление «мёртвых батареек» из стандартной библиотекиPEP 594: Remove “dead batteries” from the standard library

PEP 594 предложил удалить 19 модулей из стандартной библиотеки, которые в просторечии называют «мёртвыми батарейками» из-за их исторического, устаревшего или небезопасного статуса. Все перечисленные ниже модули были объявлены устаревшими в Python 3.11 и теперь удалены:

  • aifc

    • standard-aifc: Используйте перераспространяемую библиотеку aifc из PyPI.

  • audioop

    • audioop-lts: Используйте библиотеку audioop-lts из PyPI.

  • chunk

    • standard-chunk: Используйте перераспространяемую библиотеку chunk из PyPI.

  • cgi и cgitb

    • cgi.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 crypt module, 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.

  • msilib

  • nis

  • nntplib: Вместо этого используйте библиотеку 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.

  • sunau

    • standard-sunau: Используйте перераспространяемую библиотеку sunau из PyPI.

  • telnetlib, Вместо этого используйте библиотеки telnetlib3 или Exscript из PyPI.

    • standard-telnetlib: Используйте перераспространяемую библиотеку telnetlib из PyPI.

  • uu: Вместо этого используйте модуль base64 в качестве современной альтернативы.

    • standard-uu: Используйте перераспространяемую библиотеку uu из PyPI.

  • xdrlib

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

  • Удалена возможность использовать объекты Path в качестве контекстных менеджеров. Эта возможность была объявлена устаревшей и не имела эффекта с Python 3.9. (Автор: Barney Gale в gh-83863.)

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

  • Пользовательские функции:

    • Устарело присваивание атрибуту __code__ функции, если тип нового объекта кода не совпадает с типом функции. Различные типы: обычная функция, генератор, асинхронный генератор и корутина. (Автор: Irit Katriel в gh-81137.)

  • array:

    • Устарел код формата 'u' (wchar_t) во время выполнения. Этот код формата был объявлен устаревшим в документации начиная с Python 3.3 и будет удалён в Python 3.16. Вместо него используйте код формата 'w' (Py_UCS4) для символов Unicode. (Автор: Hugo van Kemenade в gh-80480.)

  • ctypes:

    • Устарела недокументированная функция SetPointerType(), будет удалена в Python 3.15. (Автор: Victor Stinner в gh-105733.)

    • Мягкое устаревание функции ARRAY() в пользу умножения type * length. (Автор: Victor Stinner в gh-105733.)

  • decimal:

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

  • dis:

    • Устарел разделитель HAVE_ARGUMENT. Вместо этого проверяйте принадлежность с помощью hasarg. (Автор: Irit Katriel в gh-109319.)

  • gettext:

    • Устарела передача нецелых чисел в аргументы функций и методов, которые учитывают формы множественного числа в модуле gettext, даже если перевод не найден. (Автор: Serhiy Storchaka в gh-88434.)

  • glob:

    • Устарели недокументированные функции glob0() и glob1(). Вместо них используйте glob() и передавайте объект, подобный пути, указывающий корневой каталог, в параметр root_dir вместо. (Автор: Barney Gale в gh-117337.)

  • http.server:

    • Устарел CGIHTTPRequestHandler, будет удалён в Python 3.15. CGI HTTP-серверы на основе процессов уже очень давно не пользуются популярностью. Этот код был устаревшим, неподдерживаемым и редко использовался. Он имеет высокий потенциал как для ошибок безопасности, так и для функциональных ошибок. (Автор: Gregory P. Smith в gh-109096.)

    • Устарел флаг --cgi в интерфейсе командной строки python -m http.server, будет удалён в Python 3.15. (Автор: Gregory P. Smith в gh-109096.)

  • mimetypes:

  • re:

    • Устарела передача необязательных аргументов maxsplit, count или flags в качестве позиционных аргументов в функции на уровне модуля split(), sub() и subn(). Эти параметры станут только ключевыми в будущей версии Python. (Автор: Serhiy Storchaka в gh-56166.)

  • pathlib:

    • Устарел PurePath.is_reserved(), будет удалён в Python 3.15. Используйте os.path.isreserved() для обнаружения зарезервированных путей в Windows. (Автор: Barney Gale в gh-88569.)

  • platform:

    • Устарел java_ver(), будет удалён в Python 3.15. Эта функция полезна только для поддержки Jython, имеет запутанный API и в значительной степени не тестировалась. (Автор: Nikita Sobolev в gh-116349.)

  • pydoc:

    • Устарела недокументированная функция ispackage(). (Автор: Zackery Spytz в gh-64020.)

  • sqlite3:

    • Устарела передача более одного позиционного аргумента в функцию 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:

  • tarfile:

    • Устарел недокументированный и неиспользуемый атрибут TarFile.tarfile, будет удалён в Python 3.16. (Автор: в gh-115256.)

  • traceback:

  • typing:

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

Ожидается удаление в Python 3.14Pending 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.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

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

  • asyncio:

    • Классы наблюдателя дочерних процессов 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.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

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

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

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

  • multiprocessing: метод запуска по умолчанию изменится на более безопасный на Linux, BSD и других POSIX-платформах (кроме macOS), где в настоящее время по умолчанию используется 'fork' (gh-84559). Добавление предупреждения во время выполнения было сочтено слишком деструктивным, так как большинству кода это не важно. Используйте API get_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:

  • sqlite3:

  • urllib: urllib.parse.Quoter объявлен устаревшим: он не был задуман как публичный API. (Автор: Gregory P. Smith, gh-88168.)

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

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

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

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

  • ctypes:

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

  • http.server:

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

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

  • importlib:

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

  • pathlib:

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

  • platform:

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

  • sysconfig:

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

  • threading:

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

  • types:

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

  • typing:

    • Незадокументированный синтаксис именованных аргументов для создания классов NamedTuple (например, Point = NamedTuple("Point", x=int, y=int)) считается устаревшим начиная с Python 3.13. Вместо этого используйте синтаксис на основе классов или функциональный синтаксис.

    • При использовании функционального синтаксиса TypedDict, отсутствие передачи значения параметру поля (TD = TypedDict("TD")) или передача None (TD = TypedDict("TD", None)) считается устаревшим начиная с Python 3.13. Используйте class TD(TypedDict): pass или TD = TypedDict("TD", {}) для создания TypedDict без полей.

    • Функция-декоратор typing.no_type_check_decorator() считается устаревшей начиная с Python 3.13. За восемь лет в модуле typing она так и не была поддержана ни одним крупным средством проверки типов.

  • wave:

  • zipimport:

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

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

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

  • array:

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

  • asyncio:

  • builtins:

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

  • functools:

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

  • logging:

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

  • mimetypes:

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

  • shutil:

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

  • symtable:

  • sys:

  • sysconfig:

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

  • tarfile:

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

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

  • collections.abc:

    • collections.abc.ByteString запланирован к удалению в Python 3.17.

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

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

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

  • typing:

    • До Python 3.14 старые объединения реализовывались с помощью приватного класса typing._UnionGenericAlias. Этот класс больше не нужен для реализации, но он сохранён для обратной совместимости, его удаление запланировано на Python 3.17. Пользователям следует использовать документированные вспомогательные средства интроспекции, такие как typing.get_origin() и typing.get_args(), вместо того чтобы полагаться на детали приватной реализации.

    • typing.ByteString, устаревший с Python 3.9, запланирован к удалению в Python 3.17.

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

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

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

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

  • decimal:

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

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

  • ctypes:

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

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

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

  • argparse:

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

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

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

  • builtins:

    • Генераторы: сигнатура throw(type, exc, tb) и athrow(type, exc, tb) устарела: используйте throw(exc) и athrow(exc) вместо неё, сигнатуру с одним аргументом.

    • В настоящее время Python принимает числовые литералы, за которыми сразу следуют ключевые слова, например 0in x, 1or x, 0if 1else 2. Это допускает запутанные и неоднозначные выражения вроде [0x1for x in y] (которое может быть интерпретировано как [0x1 for x in y] или [0x1f or x in y]). Выдаётся предупреждение синтаксиса, если за числовым литералом сразу следует одно из ключевых слов and, else, for, if, in, is и or. В будущем выпуске это будет изменено на синтаксическую ошибку. (gh-87999)

    • Поддержка методов __index__() и __int__(), возвращающих не-int тип: эти методы должны будут возвращать экземпляр строгого подкласса int.

    • Поддержка метода __float__(), возвращающего строгий подкласс float: эти методы должны будут возвращать экземпляр float.

    • Поддержка метода __complex__(), возвращающего строгий подкласс complex: эти методы должны будут возвращать экземпляр complex.

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

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

  • codecs: используйте open() вместо codecs.open(). (gh-133038)

  • codeobject.co_lnotab: используйте метод codeobject.co_lines() вместо этого.

  • datetime:

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

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

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

  • importlib:

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

  • importlib.metadata:

    • EntryPoints: интерфейс кортежа.

    • Неявное None для возвращаемых значений.

  • logging: метод warn() устарел начиная с Python 3.3, используйте warning() вместо него.

  • mailbox: использование StringIO в режиме ввода и текстовом режиме устарело, используйте BytesIO и двоичный режим.

  • os: вызов os.register_at_fork() в многопоточном процессе.

  • pydoc.ErrorDuringImport: кортежное значение для параметра exc_info устарело, используйте экземпляр исключения.

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

  • Модули sre_compile, sre_constants и sre_parse.

  • shutil: параметр onerror метода rmtree() устарел в Python 3.12; используйте параметр onexc вместо него.

  • ssl: опции и протоколы:

    • ssl.SSLContext без аргумента протокол устарело.

    • ssl.SSLContext: set_npn_protocols() и selected_npn_protocol() устарели: используйте ALPN вместо них.

    • ssl.OP_NO_SSL*: опции

    • ssl.OP_NO_TLS*: опции

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • threading: методы

  • typing.Text (gh-92332).

  • Внутренний класс typing._UnionGenericAlias больше не используется для реализации typing.Union. Для сохранения совместимости с пользователями, использующими этот закрытый класс, будет предоставлена прослойка совместимости как минимум до Python 3.17. (Автор: Jelle Zijlstra, gh-105499.)

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

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

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

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

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

  • sys._clear_type_cache() устарело: используйте sys._clear_internal_caches() вместо него.

Изменения байт-кода CPythonCPython Bytecode Changes

  • Аргумент oparg инструкции YIELD_VALUE теперь равен 1, если yield является частью yield-from или await, и 0 в противном случае. Аргумент oparg инструкции RESUME был изменён: добавлен бит, указывающий, равна ли глубина except 1, что необходимо для оптимизации закрытия генераторов. (Автор: Irit Katriel, gh-111354.)

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

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

Изменённые C APIChanged 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: То же, что выше, но с двоеточием в качестве разделителя

    Подробнее см. PEP 737. (Вклад Victor Stinner в gh-111696.)

  • Больше не нужно определять макрос 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 APILimited C API Changes

Удалённые C APIRemoved 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:

    Вместо этого используйте новый API PyConfig из Python Initialization Configuration (PEP 587), добавленный в Python 3.8. (Вклад Victor Stinner в gh-105145.)

  • Удалены функции PyEval_AcquireLock() и PyEval_ReleaseLock(), объявленные устаревшими в Python 3.2. Они не обновляли состояние текущего потока. Их можно заменить на:

    (Вклад 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 APIDeprecated C APIs

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

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

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

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

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

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

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

Изменения сборки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.13Porting to Python 3.13

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

Изменения в Python APIChanges 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 APIChanges 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.)

Изменения в тестах регрессииRegression Test Changes

  • Python, собранный с configure --with-pydebug, теперь поддерживает опцию командной строки -X presite=package.module. Если она указана, задаёт модуль, который должен импортироваться в начале жизненного цикла интерпретатора, до выполнения site.py. (Автор: Łukasz Langa в gh-110769.)