Что нового в Python 3.13

Редактор:

Томас Воутерс

В этой статье рассказывается о новых возможностях в Python 3.13 по сравнению с 3.12.

Подробную информацию смотрите в changelog.

См.также

PEP 719 – График выхода Python 3.13

Примечание

Пользователи пререлиза должны знать, что этот документ в настоящее время находится в черновом варианте. Он будет существенно обновляться по мере продвижения Python 3.13 к релизу, поэтому стоит вернуться к нему даже после прочтения предыдущих версий.

Резюме - Основные моменты выпуска

Python 3.13 beta - это предварительный релиз следующей версии языка программирования Python, содержащий множество изменений в языке, реализации и стандартной библиотеке. Самые значительные изменения в реализации включают новый интерактивный интерпретатор, экспериментальную поддержку отказа от блокировки глобального интерпретатора (PEP 703) и компилятора Just-In-Time (PEP 744). Изменения в библиотеке содержат удаление устаревших API и модулей, а также обычные улучшения в удобстве использования и корректности.

Улучшения в работе переводчика:

  • Значительно улучшенные interactive interpreter и improved error messages.

  • Поддержка цвета в новом interactive interpreter, а также в выводах tracebacks и doctest. Это можно отключить с помощью переменных окружения PYTHON_COLORS и NO_COLOR.

  • PEP 744: Была добавлена базовая JIT compiler. В настоящее время он отключен по умолчанию (хотя мы можем включить его позже). Улучшения производительности скромные - мы планируем улучшить это в следующих выпусках.

  • PEP 667: Встроенный модуль locals() теперь имеет defined semantics при мутации возвращаемого отображения. Отладчики Python и аналогичные инструменты теперь могут более надежно обновлять локальные переменные в оптимизированных диапазонах даже во время параллельного выполнения кода.

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

Свободно-поточная обработка:

  • PEP 703: В CPython 3.13 появилась экспериментальная поддержка запуска с отключенным global interpreter lock при сборке с --disable-gil. Более подробную информацию см. в разделе Free-threaded CPython.

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

  • PEP 730: iOS от Apple теперь является официально поддерживаемой платформой. Официальная поддержка Android (PEP 738) также находится в разработке.

Удаленные модули:

  • PEP 594: Оставшиеся 19 «севших батарей» были удалены из стандартной библиотеки: aifc, audioop, cgi, cgitb, chunk, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uu и xdrlib.

  • Также были удалены модули tkinter.tix и lib2to3, а также программа 2to3.

Изменения в расписании релизов:

  • PEP 602 («Годовой цикл выпуска для Python») был обновлен:

    • Python 3.9 - 3.12 имеет полтора года полной поддержки, а затем три с половиной года исправлений безопасности.

    • Python 3.13 и более поздние версии имеют два года полной поддержки, а затем три года исправлений безопасности.

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

Лучший интерактивный переводчик

В Unix-подобных системах, таких как Linux или macOS, а также Windows, Python теперь использует новую оболочку interactive. Когда пользователь запускает REPL с интерактивного терминала, интерактивная оболочка теперь поддерживает следующие новые возможности:

  • Раскрашенные подсказки.

  • Многострочное редактирование с сохранением истории.

  • Интерактивный просмотр справки с помощью F1 с отдельной историей команд.

  • Просмотр истории с помощью F2, который пропускает вывод, а также подсказки >>> и .

  • «Режим вставки» с помощью клавиши F3 облегчает вставку больших блоков кода (нажмите F3 еще раз, чтобы вернуться к обычной подсказке).

  • Возможность вводить специфические для REPL команды, такие как help, exit и quit, без необходимости использовать вызывающие скобки после имени команды.

Если новая интерактивная оболочка не нужна, ее можно отключить с помощью переменной окружения PYTHON_BASIC_REPL.

Новая оболочка требует curses в Unix-подобных системах.

Подробнее об интерактивном режиме см. в разделе Интерактивный режим.

(Внесен Пабло Галиндо Сальгадо, Лукашем Ланга и Лисандросом Николау в gh-111201 на основе кода из проекта PyPy. В поддержку Windows внесли вклад Дино Вьеланд и Энтони Шоу).

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

  • Интерпретатор теперь по умолчанию окрашивает сообщения об ошибках при отображении трассировки. Этой возможностью можно управлять с помощью новой переменной окружения PYTHON_COLORS, а также канонических переменных окружения NO_COLOR и FORCE_COLOR. См. также Управление цветом. (Внесено Пабло Галиндо Сальгадо в gh-112730).

  • Частой ошибкой является написание скрипта с тем же именем, что и модуль стандартной библиотеки. Когда это приводит к ошибкам, мы теперь выводим более полезное сообщение об ошибке:

    $ python random.py
    Traceback (most recent call last):
      File "/home/random.py", line 1, in <module>
        import random; print(random.randint(5))
        ^^^^^^^^^^^^^
      File "/home/random.py", line 1, in <module>
        import random; print(random.randint(5))
                            ^^^^^^^^^^^^^^
    AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/random.py' since it has the same name as the standard library module named 'random' and the import system gives it precedence)
    

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

    $ python numpy.py
    Traceback (most recent call last):
      File "/home/numpy.py", line 1, in <module>
        import numpy as np; np.array([1,2,3])
        ^^^^^^^^^^^^^^^^^^
      File "/home/numpy.py", line 1, in <module>
        import numpy as np; np.array([1,2,3])
                            ^^^^^^^^
    AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/numpy.py' if it has the same name as a third-party module you intended to import)
    

    (Предоставлено Shantanu Jain в gh-95754).

  • Когда в функцию передается неверный аргумент ключевого слова, в сообщении об ошибке теперь потенциально предлагается правильный аргумент ключевого слова. (Вклад внесли Пабло Галиндо Сальгадо и Шантану Джайн в gh-107944).

    >>> "better error messages!".split(max_split=1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
        "better error messages!".split(max_split=1)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
    TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
    
  • Классы имеют новый атрибут __static_attributes__, заполняемый компилятором, с кортежем имен атрибутов этого класса, доступ к которым осуществляется через self.X из любой функции в его теле. (Внесено Ирит Катриэль в gh-115775).

Определена семантика мутации для locals().

Исторически сложилось так, что ожидаемый результат изменения возвращаемого значения locals() оставался на усмотрение отдельных реализаций Python.

Благодаря PEP 667, Python 3.13 стандартизирует историческое поведение CPython для большинства областей выполнения кода, но изменяет optimized scopes (функции, генераторы, короутины, осмысления и генераторы выражений), чтобы явно возвращать независимые снимки локальных переменных, назначенных в данный момент, включая нелокальные переменные с локальными ссылками, захваченные в закрытиях.

Это изменение семантики locals() в оптимизированных диапазонах также влияет на поведение по умолчанию функций выполнения кода, которые неявно обращаются к locals(), если не указано явное пространство имен (например, exec() и eval()). В предыдущих версиях возможность доступа к изменениям путем вызова locals() после вызова функции выполнения кода зависела от реализации. В частности, в CPython такой код обычно работал как надо, но иногда мог не работать в оптимизированных областях из-за того, что другой код (включая отладчики и средства отслеживания выполнения кода) потенциально мог сбросить общий снимок в этой области. Теперь код всегда будет работать с независимым снимком локальных переменных в оптимизированных областях, и, следовательно, изменения никогда не будут видны при последующих вызовах locals(). Чтобы получить доступ к изменениям, сделанным в этих случаях, теперь необходимо передать соответствующей функции явную ссылку на пространство имен. В качестве альтернативы, возможно, имеет смысл обновить затронутый код, чтобы он использовал API более высокого уровня, который возвращает результирующее пространство имен выполнения кода (например, runpy.run_path() при выполнении файлов Python с диска).

Чтобы отладчики и подобные инструменты могли надежно обновлять локальные переменные в областях, затронутых этим изменением, FrameType.f_locals теперь возвращает прокси для записи в локальные и нелокальные переменные фрейма в этих областях, а не возвращает непоследовательно обновленный общий экземпляр dict с неопределенной семантикой во время выполнения.

Более подробную информацию, включая связанные с этим изменения в API на языке C и устаревания, см. в разделе PEP 667. Ниже также приведены примечания по переносу для затронутых Python APIs и C APIs.

(Вклад в PEP и реализацию внесли Марк Шеннон и Тиан Гао в gh-74929. Обновления документации предоставлены Гвидо ван Россумом и Алиссой Коглан).

Инкрементная сборка мусора

  • Цикл сборщика мусора теперь инкрементный. Это означает, что максимальное время паузы сокращается на порядок или более для больших куч.

Поддержка мобильных платформ

  • iOS теперь является PEP 11 поддерживаемой платформой. arm64-apple-ios (устройства iPhone и iPad, выпущенные после 2013 года) и arm64-apple-ios-simulator (симулятор Xcode iOS, работающий на оборудовании Apple Silicon) теперь являются платформами третьего уровня.

    x86_64-apple-ios-simulator (симулятор Xcode iOS, работающий на старом оборудовании x86_64) не является поддерживаемой платформой третьего уровня, но будет поддерживаться по мере сил.

    Более подробную информацию см. в разделе PEP 730.

    (PEP написан и реализован Расселом Кейт-Мейджи в gh-114099).

Экспериментальный JIT-компилятор

Когда CPython настроен с помощью опции --enable-experimental-jit, добавляется компилятор just-in-time, который может ускорить работу некоторых программ на Python.

Внутренняя архитектура выглядит следующим образом.

  • Мы начнем со специализированного байткода уровня 1. Подробности см. в разделе What’s new in 3.11.

  • Когда байткод уровня 1 становится достаточно горячим, он переводится на новый, чисто внутренний уровень 2 IR, он же микрооперации («uops»).

  • В Tier 2 IR используется та же стековая ВМ, что и в Tier 1, но формат инструкций лучше подходит для трансляции в машинный код.

  • У нас есть несколько этапов оптимизации для Tier 2 IR, которые применяются перед интерпретацией или переводом в машинный код.

  • Существует интерпретатор уровня 2, но он в основном предназначен для отладки ранних этапов конвейера оптимизации. Интерпретатор уровня 2 можно включить, задав в конфигурации Python значение --enable-experimental-jit=interpreter.

  • Когда JIT включен, оптимизированный Tier 2 IR транслируется в машинный код, который затем выполняется.

  • В процессе трансляции машинного кода используется техника, называемая copy-and-patch. У него нет зависимостей во время выполнения, но есть новая зависимость от LLVM во время сборки.

Флаг --enable-experimental-jit имеет следующие необязательные значения:

  • no (по умолчанию) – отключение всего конвейера Tier 2 и JIT.

  • yes (по умолчанию, если флаг присутствует без необязательного значения) – Включить JIT. Чтобы отключить JIT во время выполнения, передайте переменную окружения PYTHON_JIT=0.

  • yes-off – Создайте JIT, но отключите его по умолчанию. Чтобы включить JIT во время выполнения, передайте переменную окружения PYTHON_JIT=1.

  • interpreter – Включить интерпретатор уровня 2, но отключить JIT. Интерпретатор можно отключить, выполнив команду PYTHON_JIT=0.

(В Windows используйте PCbuild/build.bat --experimental-jit, чтобы включить JIT, или --experimental-jit-interpreter, чтобы включить интерпретатор уровня 2).

Более подробную информацию см. в разделе PEP 744.

(JIT от Брандта Бухера, вдохновленный статьей Хаорана Сю и Фредрика Кьолстада. Tier 2 IR от Марка Шеннона и Гвидо ван Россума. Оптимизатор второго уровня - Кен Джин).

Свободнопоточный CPython

CPython будет работать с отключенным global interpreter lock (GIL), если во время сборки использовать опцию --disable-gil. Это экспериментальная функция, поэтому по умолчанию она не используется. Пользователям необходимо либо скомпилировать свой собственный интерпретатор, либо установить одну из экспериментальных сборок, помеченных как свободнопоточные. См. PEP 703 «Как сделать глобальную блокировку интерпретатора необязательной в CPython» для более подробной информации.

Свободно-поточное выполнение позволяет полностью использовать доступную вычислительную мощность, запуская потоки параллельно на доступных ядрах процессора. Хотя не все программы получают от этого автоматическую выгоду, программы, разработанные с учетом многопоточного исполнения, будут работать быстрее на многоядерном оборудовании.

Работа все еще продолжается: ожидайте некоторых ошибок и значительного снижения производительности в однопоточном режиме.

Свободно-поточная сборка по-прежнему поддерживает возможность запуска с включенным GIL во время выполнения с помощью переменной окружения PYTHON_GIL или опции командной строки -X gil.

Чтобы проверить, сконфигурирован ли текущий интерпретатор с --disable-gil, используйте функцию sysconfig.get_config_var("Py_GIL_DISABLED"). Чтобы проверить, действительно ли GIL отключен в запущенном процессе, можно использовать функцию sys._is_gil_enabled().

Модули расширения C-API должны быть собраны специально для свободно-поточной сборки. Расширения, поддерживающие запуск с отключенным GIL, должны использовать слот Py_mod_gil. Расширения, использующие однофазный init, должны использовать PyUnstable_Module_SetGIL(), чтобы указать, поддерживают ли они запуск с отключенным GIL. Импорт расширений C, не использующих эти механизмы, приведет к включению GIL, если только GIL не был явно отключен с помощью переменной окружения PYTHON_GIL или опции -X gil=0.

Для установки пакетов с расширениями C в свободно-поточной сборке требуется pip 24.1b1 или новее.

Другие языковые изменения

  • Разрешите аргументу count в str.replace() быть ключевым словом. (Внесено Хьюго ван Кеменаде в gh-106487).

  • Компилятор теперь удаляет отступы от строк документов. Это уменьшит размер bytecode cache (например, файла .pyc). Например, размер кэш-файла для sqlalchemy.orm.session в SQLAlchemy 2.0 уменьшился примерно на 5%. Это изменение затронет и инструменты, использующие документированные строки, например doctest. (Внесено Инадой Наоки в gh-81283).

  • Встроенный compile() теперь может принимать новый флаг, ast.PyCF_OPTIMIZED_AST, который аналогичен ast.PyCF_ONLY_AST, за исключением того, что возвращаемый AST оптимизируется в зависимости от значения аргумента optimize. (Внесено Ирит Катриэль в gh-108113).

  • multiprocessing, concurrent.futures, compileall: Замените os.cpu_count() на os.process_cpu_count(), чтобы выбрать количество рабочих потоков и процессов по умолчанию. Получите сродство к процессору, если оно поддерживается. (Внесено Виктором Стиннером в gh-109649).

  • os.path.realpath() теперь разрешает имена файлов в стиле MS-DOS, даже если файл недоступен. (Внесено Мунсиком Парком в gh-82367).

  • Исправлена ошибка, при которой объявление global в блоке except отклонялось, если глобал использовался в блоке else. (Внесено Ирит Катриэль в gh-111123).

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

  • Добавлена новая переменная окружения PYTHON_FROZEN_MODULES. Она определяет, будут ли замороженные модули игнорироваться механизмом импорта, что эквивалентно опции командной строки -X frozen_modules. (Внесена Йилей Ян в gh-111374).

  • Добавьте support for the perf profiler работу без указателей кадров с помощью новой переменной окружения PYTHON_PERF_JIT_SUPPORT и опции командной строки -X perf_jit (Внесено Пабло Галиндо в gh-118518).

  • Новая переменная окружения PYTHON_HISTORY может быть использована для изменения местоположения файла .python_history. (Внесено Леви Сабахом, Закери Спитцем и Хьюго ван Кеменаде в gh-73965).

  • Добавьте исключение PythonFinalizationError. Это исключение, производное от RuntimeError, возникает, когда операция блокируется во время выполнения Python finalization.

    Следующие функции теперь вызывают ошибку PythonFinalizationError, а не RuntimeError:

    (Внесено Виктором Стиннером в gh-114570).

  • Добавлены атрибуты name и mode для сжатых и архивированных файлоподобных объектов в модулях bz2, lzma, tarfile и zipfile. (Внесено Сергеем Сторчакой в gh-115961).

  • Позволяет управлять Expat >=2.6.0 reparse deferral (CVE-2023-52425), добавив пять новых методов:

    (Внесено Себастьяном Пиппингом в gh-115623).

  • API ssl.create_default_context() API теперь включает ssl.VERIFY_X509_PARTIAL_CHAIN и ssl.VERIFY_X509_STRICT в свои флаги по умолчанию.

    Примечание

    ssl.VERIFY_X509_STRICT может отклонять сертификаты с предварительным:rfc:5280 или неправильным оформлением, которые в противном случае реализация OpenSSL могла бы принять. Хотя отключать эту функцию не рекомендуется, вы можете сделать это с помощью:

    ctx = ssl.create_default_context()
    ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
    

    (Внесено Уильямом Вудруфом в gh-112389).

  • Теперь configparser.ConfigParser принимает неименованные секции перед именованными, если они настроены на это. (Внесено Педро Соузой Ласердой в gh-66449).

  • annotation scope внутри диапазонов классов теперь может содержать ламбды и понимания. Постижения, расположенные внутри диапазонов классов, не вставляются в родительский диапазон. (Вклад Jelle Zijlstra в gh-109118 и gh-118160).

  • У классов появился новый атрибут __firstlineno__, заполняемый компилятором и содержащий номер первой строки определения класса. (Внесено Сергеем Сторчакой в gh-118465).

  • Операторы from __future__ import ... теперь являются обычными относительными импортами, если перед именем модуля присутствуют точки. (Внесено Иеремией Габриэлем Паскуалем в gh-118216).

Новые модули

  • Нет.

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

argparse

  • Добавьте параметр deprecated в методы add_argument() и add_parser(), который позволяет устаревать опции командной строки, позиционные аргументы и подкоманды. (Внесено Сергеем Сторчакой в gh-83648).

массив

  • Добавьте код типа 'w' (Py_UCS4), который можно использовать для строк Юникода. Его можно использовать вместо кода типа 'u', который устарел. (Внесено Инадой Наоки в gh-80480).

  • Добавьте метод clear(), чтобы реализовать MutableSequence. (Внесено Майком Зиминым в gh-114894).

ast

  • Конструкторы типов узлов в модуле ast теперь более строги к аргументам, которые они принимают, и имеют более интуитивное поведение, когда аргументы опущены.

    Если необязательное поле узла AST не включено в качестве аргумента при создании экземпляра, то теперь это поле будет установлено в значение None. Аналогично, если опущено поле списка, то теперь оно будет установлено в пустой список, а если опущено поле ast.expr_context, то по умолчанию будет установлено значение Load(). (Ранее во всех случаях атрибут отсутствовал во вновь построенном экземпляре узла AST).

    Если другие аргументы опущены, выдается DeprecationWarning. Это вызовет исключение в Python 3.15. Аналогично, передача аргумента ключевого слова, который не сопоставляется с полем в узле AST, теперь устарела и вызовет исключение в Python 3.15.

    Эти изменения не распространяются на пользовательские подклассы ast.AST, если только класс не согласится с новым поведением, установив атрибут ast.AST._field_types.

    (Внесено Jelle Zijlstra в gh-105858, gh-117486 и gh-118851).

  • ast.parse() теперь принимает необязательный аргумент optimize, который передается во встроенную функцию compile(). Это позволяет получить оптимизированный AST. (Внесено Ирит Катриэль в gh-108113).

asyncio

  • asyncio.loop.create_unix_server() теперь будет автоматически удалять Unix-сокет при закрытии сервера. (Внесено Пьером Оссманом в gh-111246).

  • asyncio.DatagramTransport.sendto() теперь будет отправлять дейтаграммы нулевой длины, если вызвать его с пустым объектом bytes. Управление транспортным потоком также теперь учитывает заголовок дейтаграммы при расчете размера буфера. (Внесено Джейми Фаном в gh-115199).

  • Добавьте методы asyncio.Server.close_clients() и asyncio.Server.abort_clients(), позволяющие более принудительно закрывать сервер asyncio. (Внесено Пьером Оссманом в gh-113538).

  • asyncio.as_completed() теперь возвращает объект, который одновременно является asynchronous iterator и обычным iterator из awaitables. Ожидаемые объекты, получаемые при асинхронной итерации, включают в себя исходные объекты задач или будущих, которые были переданы, что облегчает ассоциацию результатов с выполняемыми задачами. (Внесено Джастином Артуром в gh-77714).

  • Когда asyncio.TaskGroup.create_task() вызывается на неактивном asyncio.TaskGroup, данный корутин будет закрыт (что предотвращает появление RuntimeWarning о том, что данный корутин никогда не ожидался). (Внесено Артуром Такка и Джейсоном Чжаном в gh-115957).

  • Улучшено поведение asyncio.TaskGroup, когда внешняя отмена сталкивается с внутренней отменой. Например, когда две группы задач вложены друг в друга и обе одновременно испытывают исключение в дочерней задаче, могло произойти зависание внешней группы задач, поскольку ее внутренняя отмена была поглощена внутренней группой задач.

    В случае, когда группа задач отменяется извне и также должна поднять ExceptionGroup, она теперь будет вызывать метод cancel() родительской задачи. Это гарантирует, что asyncio.CancelledError будет поднят при следующем await, так что отмена не будет потеряна.

    Дополнительным преимуществом этих изменений является то, что группы задач теперь сохраняют счетчик отмен (asyncio.Task.cancelling()).

    Для обработки некоторых угловых случаев asyncio.Task.uncancel() теперь может сбрасывать недокументированный флаг _must_cancel, когда счетчик отмены достигает нуля.

    (Навеяно проблемой, о которой сообщил Артур Такка в gh-116720).

  • Добавьте asyncio.Queue.shutdown() (вместе с asyncio.QueueShutDown) для завершения очереди. (Внесено Лори Опперманом и Ивом Дюпра в gh-104228).

  • Принимает кортеж разделителей в asyncio.StreamReader.readuntil(), останавливаясь, когда встречается один из них. (Внесено Брюсом Мерри в gh-81322).

base64

  • Добавьте функции base64.z85encode() и base64.z85decode(), которые позволяют кодировать и декодировать данные Z85. Дополнительную информацию см. в Z85 specification. (Внесено Матаном Перельманом в gh-75299).

копия

  • Добавьте функцию copy.replace(), которая позволяет создать модифицированную копию объекта, что особенно полезно для неизменяемых объектов. Она поддерживает именованные кортежи, созданные с помощью фабричной функции collections.namedtuple(), экземпляры dataclass, различные datetime объекты, Signature объекты, Parameter объекты, code object и любые пользовательские классы, определяющие метод __replace__(). (Внесено Сергеем Сторчакой в gh-108751).

ctypes

  • Расположение bit fields в Structure и Union было улучшено, чтобы лучше соответствовать платформе по умолчанию (GCC/Clang или MSC). В частности, поля больше не перекрываются. (Внесено Маттиасом Гёргенсом в gh-97702).

  • Атрибут класса ctypes.Structure._layout_ может быть установлен для соответствия ABI не по умолчанию. (Внесено Петром Викторином в gh-97702).

dbm

  • Добавьте методы dbm.gnu.gdbm.clear() и dbm.ndbm.ndbm.clear(), которые удаляют все элементы из базы данных. (Внесено Donghee Na в gh-107122).

  • Добавьте новый бэкэнд dbm.sqlite3 и сделайте его бэкэндом по умолчанию dbm. (Внесено Раймондом Хеттингером и Эрлендом Э. Аасландом в gh-100414).

dis

  • Измените вывод функций модуля dis, чтобы они показывали логические метки для целей перехода и обработчиков исключений, а не смещения. Смещение можно добавить с помощью новой опции командной строки -O или параметра show_offsets. (Внесено Ирит Катриэль в gh-112137).

doctest

e-mail

  • email.utils.getaddresses() и email.utils.parseaddr() теперь возвращают 2-кортежи ('', '') в большем количестве ситуаций, когда встречаются недействительные адреса электронной почты, вместо потенциально неточных значений. Добавьте необязательный параметр strict к этим двум функциям: используйте strict=False, чтобы получить старое поведение, принимающее неправильно оформленные входные данные. getattr(email.utils, 'supports_strict_parsing', False) можно использовать для проверки наличия параметра strict. (Вклад Томаса Дуайера и Виктора Стиннера в gh-102988 для улучшения исправления CVE-2023-27043).

фракции

  • Форматирование объектов типа fractions.Fraction теперь поддерживает правила стандартного мини-языка спецификации формата для заливки, выравнивания, обработки знаков, минимальной ширины и группировки. (Внесено Марком Дикинсоном в gh-111320).

gc

  • Циклический сборщик мусора теперь инкрементный, что меняет значения результатов gc.get_threshold() и gc.set_threshold(), а также gc.get_count() и gc.get_stats().

    • gc.get_threshold() возвращает кортеж из трех элементов для обратной совместимости. Первое значение - порог для молодых коллекций, как и раньше; второе значение определяет скорость, с которой сканируется старая коллекция (по умолчанию 10, а более высокие значения означают, что старая коллекция сканируется медленнее). Третье значение не имеет смысла и всегда равно нулю.

    • gc.set_threshold() игнорирует все элементы после второго.

    • gc.get_count() и gc.get_stats() возвращают тот же формат результатов, что и раньше. Единственное отличие заключается в том, что вместо результатов, относящихся к молодому, стареющему и старому поколениям, результаты относятся к молодому поколению, стареющему и собирающему пространства старому поколению.

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

глобус

  • Добавьте функцию glob.translate(), которая преобразует спецификацию пути с подстановочными знаками в стиле shell в регулярное выражение. (Внесено Барни Гейлом в gh-72904).

importlib

  • Ранее устаревшие функции importlib.resources больше не устаревают:

    Все они теперь позволяют создавать каталог (или дерево) ресурсов, используя несколько позиционных аргументов.

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

    API contents() остается устаревшим в пользу полнофункционального Traversable. API. Однако в настоящее время его удаление не планируется.

    (Внесено Петром Викториным в gh-106532).

io

ipaddress

itertools

  • Добавлена опция strict к itertools.batched(). Это вызывает ошибку ValueError, если конечная партия короче указанного размера партии. (Внесено Раймондом Хеттингером в gh-113202).

маршал

  • Добавьте параметр allow_code в функции модуля. Передача allow_code=False предотвращает сериализацию и де-сериализацию объектов кода, которые несовместимы между версиями Python. (Внесено Сергеем Сторчакой в gh-113626).

математика

  • Добавлена новая функция fma() для слитных операций умножения-аддирования. Эта функция вычисляет x * y + z только за один раунд, что позволяет избежать промежуточной потери точности. Она обертывает функцию fma(), предусмотренную в C99, и следует спецификации операции IEEE 754 «fusedMultiplyAdd» для особых случаев. (Внесено Марком Дикинсоном и Виктором Стиннером в gh-73468).

mimetypes

  • Добавьте функцию guess_file_type(), которая работает с путем к файлу. Передача пути к файлу вместо URL в guess_type() является soft deprecated. (Внесено Сергеем Сторчакой в gh-66543).

mmap

  • У класса mmap.mmap теперь есть метод seekable(), который можно использовать, когда требуется объект, похожий на файл с возможностью поиска. Метод seek() теперь возвращает новую абсолютную позицию. (Вклад Донгхи На и Сильви Либерман в gh-111835).

  • mmap.mmap теперь имеет параметр trackfd в Unix; если он равен False, дескриптор файла, указанный fileno, не будет дублироваться. (Внесено Закери Спитцем и Петром Викторином в gh-78502).

  • mmap.mmap теперь защищен от сбоев в Windows, когда отображаемая память недоступна из-за ошибок файловой системы или нарушений доступа. (Внесено Яннисом Вайгендом в gh-118209).

опкод

  • Переместите opcode.ENABLE_SPECIALIZATION в _opcode.ENABLE_SPECIALIZATION. Это поле было добавлено в 3.12, оно никогда не документировалось и не предназначено для внешнего использования. (Внесено Ирит Катриэль в gh-105481).

  • Удалены opcode.is_pseudo, opcode.MIN_PSEUDO_OPCODE и opcode.MAX_PSEUDO_OPCODE, которые были добавлены в 3.12, никогда не документировались и не раскрывались через dis, и не предназначались для внешнего использования.

os

  • Добавьте функцию os.process_cpu_count() для получения количества логических процессоров, используемых вызывающим потоком текущего процесса. (Внесено Виктором Стиннером в gh-109649).

  • Добавьте низкоуровневый интерфейс для файловых дескрипторов уведомлений таймера в Linux через os.timerfd_create(), os.timerfd_settime(), os.timerfd_settime_ns(), os.timerfd_gettime() и os.timerfd_gettime_ns(), os.TFD_NONBLOCK, os.TFD_CLOEXEC, os.TFD_TIMER_ABSTIME и os.TFD_TIMER_CANCEL_ON_SET (Внесено Масару Цучиямой в gh-108277).

  • Параметры os.cpu_count() и os.process_cpu_count() могут быть переопределены с помощью новой переменной окружения PYTHON_CPU_COUNT или новой опции командной строки -X cpu_count. Эта опция полезна для пользователей, которым нужно ограничить ресурсы процессора контейнерной системы без необходимости модифицировать контейнер (код приложения). (Внесено Donghee Na в gh-109595).

  • Добавьте поддержку os.lchmod() и аргумента follow_symlinks в os.chmod() под Windows. Обратите внимание, что по умолчанию значение follow_symlinks в os.lchmod() равно False в Windows. (Внесено Сергеем Сторчакой в gh-59616).

  • Добавьте поддержку os.fchmod() и файлового дескриптора в os.chmod() под Windows. (Внесено Сергеем Сторчакой в gh-113191).

  • os.posix_spawn() теперь принимает env=None, что заставляет вновь порожденный процесс использовать текущее окружение процесса. (Внесено Якубом Куликом в gh-113119).

  • os.posix_spawn() приобретает атрибут os.POSIX_SPAWN_CLOSEFROM для использования в file_actions= на платформах, поддерживающих posix_spawn_file_actions_addclosefrom_np(). (Внесено Якубом Куликом в gh-113117).

  • os.mkdir() и os.makedirs() в Windows теперь поддерживают передачу значения mode 0o700 для применения контроля доступа к новому каталогу. Это неявно влияет на tempfile.mkdtemp() и является смягчением для CVE-2024-4030. Другие значения mode по-прежнему игнорируются. (Внесено Стивом Дауэром в gh-118486).

os.path

  • Добавьте os.path.isreserved(), чтобы проверить, зарезервирован ли путь в текущей системе. Эта функция доступна только в Windows. (Внесено Барни Гейлом в gh-88569).

  • В Windows os.path.isabs() больше не считает абсолютными пути, начинающиеся ровно с одной (обратной) косой черты. (Внесено Барни Гейлом и Джоном Фостером в gh-44626).

  • Добавьте поддержку аргументов ключевых слов dir_fd и follow_symlinks в shutil.chown(). (Внесено Беркером Пексагом и Тахией К в gh-62308)

pathlib

  • Добавьте pathlib.UnsupportedOperation, который выдается вместо NotImplementedError, когда операция пути не поддерживается. (Внесено Барни Гейлом в gh-89812).

  • Добавьте pathlib.Path.from_uri(), новый конструктор для создания объекта pathlib.Path из URI „file“ (file://). (Внесено Барни Гейлом в gh-107465).

  • Добавьте pathlib.PurePath.full_match() для сопоставления путей с подстановочными знаками в стиле shell, включая рекурсивный подстановочный знак «**». (Внесено Барни Гейлом в gh-73435).

  • Добавьте атрибут класса pathlib.PurePath.parser, который хранит реализацию os.path, используемую для низкоуровневого разбора и соединения путей: либо posixpath, либо ntpath.

  • Добавьте аргумент recurse_symlinks только для ключевых слов в pathlib.Path.glob() и rglob(). (Внесено Барни Гейлом в gh-77609).

  • Добавьте аргумент follow_symlinks только для ключевых слов в is_file(), is_dir(), owner(), group(). (Внесено Барни Гейлом в gh-105793 и Камилом Туреком в gh-107962).

  • Возвращает файлы и каталоги из pathlib.Path.glob() и rglob(), если задан шаблон, заканчивающийся на «**». В предыдущих версиях возвращались только каталоги. (Внесено Барни Гейлом в gh-70303).

pdb

  • Добавьте возможность перемещаться между цепочками исключений во время посмертной отладки в pm(), используя новую команду exceptions [exc_number] для Pdb. (Внесено Маттиасом Буссонье в gh-106676).

  • Выражения/высказывания, префиксом которых является команда pdb, теперь правильно определяются и выполняются. (Внесено Тянем Гао в gh-108464).

  • sys.path[0] больше не будет заменяться каталогом отлаживаемого сценария, если задан sys.flags.safe_path (через опцию командной строки -P или переменную окружения PYTHONSAFEPATH). (Внесено Тианом Гао и Кристианом Вальтером в gh-111762).

  • zipapp поддерживается в качестве цели отладки. (Внесено Тянь Гао в gh-118501).

  • breakpoint() и pdb.set_trace() теперь попадают в отладчик сразу, а не на следующей выполняемой строке кода. Это изменение предотвращает выход отладчика за пределы контекста, когда breakpoint() располагается в конце контекста. (Внесено Тянь Гао в gh-118579).

очередь

случайно

re

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

сайт

  • Файлы .pth теперь сначала декодируются с помощью UTF-8, а затем с помощью locale encoding, если декодирование UTF-8 не удалось. (Внесено Инадой Наоки в gh-117802).

sqlite3

  • Теперь выдается ResourceWarning, если объект sqlite3.Connection не является closed явным. (Внесено Эрлендом Э. Аасланом в gh-105539).

  • Добавьте в sqlite3.Connection.iterdump() параметр filter только с ключевым словом для фильтрации объектов базы данных для дампа. (Внесено Мариушем Фелисиаком в gh-91602).

статистика

  • Добавьте statistics.kde() для оценки плотности ядра. Это позволяет оценить непрерывную функцию плотности вероятности по фиксированному числу дискретных выборок. Также добавлен statistics.kde_random() для выборки из оцененной функции плотности вероятности. (Внесено Раймондом Хеттингером в gh-115863).

подпроцесс

  • Модуль subprocess теперь использует функцию os.posix_spawn() в большем количестве ситуаций. В частности, в случае использования по умолчанию close_fds=True на более новых версиях платформ, включая Linux, FreeBSD и Solaris, где библиотека C предоставляет posix_spawn_file_actions_addclosefrom_np(). В Linux этот код должен работать аналогично нашему существующему vfork() на базе Linux. Частный регулятор subprocess._USE_POSIX_SPAWN может быть установлен на False, если вам нужно заставить subprocess никогда не использовать os.posix_spawn(). Пожалуйста, сообщите о причине и платформе в трекере проблем CPython, если вы установили это значение, чтобы мы могли улучшить нашу логику выбора API для всех. (Внесено Якубом Куликом в gh-113117).

sys

  • Добавьте функцию sys._is_interned(), чтобы проверить, была ли строка интернирована. Наличие этой функции во всех реализациях Python не гарантируется. (Внесено Сергеем Сторчакой в gh-78573).

tempfile

  • В Windows режим по умолчанию 0o700, используемый tempfile.mkdtemp(), теперь ограничивает доступ к новому каталогу из-за изменений в os.mkdir(). Это смягчение для CVE-2024-4030. (Внесено Стивом Дауэром в gh-118486).

время

  • В Windows time.monotonic() теперь использует часы QueryPerformanceCounter() с разрешением лучше, чем 1 us, вместо часов GetTickCount64(), которые имеют разрешение 15,6 мс. (Внесено Виктором Стиннером в gh-88494).

  • В Windows time.time() теперь использует часы GetSystemTimePreciseAsFileTime() с разрешением лучше 1 мкс, а не часы GetSystemTimeAsFileTime(), которые имеют разрешение 15,6 мс. (Внесено Виктором Стиннером в 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). Добавлен новый необязательный параметр return_python_dict, предназначенный только для ключевых слов: вызов w.wm_attributes(return_python_dict=True) возвращает атрибуты в виде dict, а не кортежа. (Внесено Сергеем Сторчакой в gh-43457).

  • Добавьте новый необязательный параметр return_ints в метод Text.count(). Передача return_ints=True заставляет его всегда возвращать одиночный счет в виде целого числа, а не 1 кортежа или None. (Внесено Сергеем Сторчакой в gh-97928).

  • Добавьте поддержку типа элемента «vsapi» в метод element_create() из tkinter.ttk.Style. (Внесено Сергеем Сторчакой в gh-68166).

  • Добавьте метод after_info() для виджетов Tkinter. (Внесено Шерил Сабелла в gh-77020).

  • Добавьте метод PhotoImage copy_replace() для копирования области с одного изображения на другое, возможно, с пиксельным масштабированием и/или поддискретизацией. Добавьте параметр from_coords в методы PhotoImage copy(), zoom() и subsample(). Добавить параметры zoom и subsample в метод PhotoImage copy(). (Внесено Сергеем Сторчакой в gh-118225).

  • Добавьте методы PhotoImage read() для чтения изображения из файла и data() для получения данных изображения. Добавьте параметры background и grayscale в метод PhotoImage write(). (Внесено Сергеем Сторчакой в gh-118271).

traceback

  • Добавьте параметр show_group в traceback.TracebackException.format_exception_only() для рекурсивного форматирования вложенных исключений экземпляра BaseExceptionGroup. (Внесено Ирит Катриэль в gh-105292).

  • Добавьте в TracebackException поле exc_type_str, которое содержит строковое отображение exc_type. Утратить поле exc_type, в котором хранится сам объект типа. Добавьте параметр save_exc_type (по умолчанию True), чтобы указать, следует ли сохранять exc_type. (Внесено Ирит Катриэль в gh-112332).

типы

  • Конструктор SimpleNamespace теперь позволяет указывать начальные значения атрибутов в качестве позиционного аргумента, который должен представлять собой отображение или итерабель пар ключ-значение. (Внесено Сергеем Сторчакой в gh-108191).

набор текста

  • Добавьте typing.get_protocol_members(), чтобы вернуть набор членов, определяющих typing.Protocol. Добавьте typing.is_protocol() для проверки того, является ли класс typing.Protocol. (Внесено Jelle Zijlstra в gh-104873).

  • Добавьте typing.ReadOnly, специальную конструкцию типизации, позволяющую пометить элемент typing.TypedDict как доступный только для чтения для средств проверки типов. Подробнее см. в разделе PEP 705.

  • Добавьте typing.NoDefault, объект sentinel, используемый для представления значений по умолчанию некоторых параметров в модуле typing. (Внесено Джеллом Зейлстра в gh-116126).

unicodedata

  • База данных Unicode была обновлена до версии 15.1.0. (Внесено Джеймсом Джерити в gh-109559).

venv

  • Добавьте поддержку добавления игнорируемых файлов управления контролем исходных текстов (SCM) в каталог виртуальной среды. По умолчанию поддерживается Git. Это реализовано как opt-in через API, который может быть расширен для поддержки других SCM (venv.EnvBuilder и venv.create()), и opt-out через CLI (с помощью --without-scm-ignore-files). (Внесено Бреттом Кэнноном в gh-108125).

предупреждения

  • Новый декоратор warnings.deprecated() предоставляет возможность сообщать об устаревании в static type checkers и предупреждать об использовании устаревших классов и функций. Предупреждение об устаревании может также выдаваться, когда декорированная функция или класс используется во время выполнения. См. PEP 702. (Внесено Jelle Zijlstra в gh-104003).

xml.etree.ElementTree

  • Добавьте метод close() для итератора, возвращаемого iterparse(), для явной очистки. (Внесено Сергеем Сторчакой в gh-69893).

zipimport

  • Появилась поддержка файлов формата ZIP64. Все любят огромный код, верно? (Внесено Тимом Хэтчем в gh-94146).

Оптимизации

  • textwrap.indent() теперь на ~30% быстрее, чем раньше, для больших входных данных. (Внесено Инадой Наоки в gh-107369).

  • Модуль subprocess использует os.posix_spawn() в большем количестве ситуаций, включая стандартный close_fds=True на многих современных платформах. Это должно обеспечить заметный прирост производительности при запуске процессов на FreeBSD и Solaris. Подробности см. в разделе subprocess выше. (Внесено Якубом Куликом в gh-113117).

  • Время импорта нескольких модулей стандартной библиотеки было значительно улучшено. Например, время импорта модуля typing сократилось примерно на треть за счет удаления зависимостей от re и contextlib. Другие модули, время импорта которых ускорилось, включают importlib.metadata, threading, enum, functools и email.utils. (Вклад Алекса Уэйгуда, Шантану Джайна, Адама Тернера, Дэниела Холласа и других в gh-109653).

Удаленные модули и API

PEP 594: севшие батарейки (и другие способы удаления модулей)

  • PEP 594 удалил из стандартной библиотеки 19 модулей, устаревших в Python 3.11:

    • aifc (Внесено Виктором Стиннером в gh-104773).

    • audioop (Внесено Виктором Стиннером в gh-104773).

    • chunk (Внесено Виктором Стиннером в gh-104773).

    • cgi и cgitb.

      • cgi.FieldStorage обычно можно заменить на urllib.parse.parse_qsl() для запросов GET и HEAD, а модуль email.message или multipart PyPI-проект для POST и PUT.

      • cgi.parse() можно заменить вызовом urllib.parse.parse_qs() непосредственно в нужной строке запроса, за исключением ввода multipart/form-data, который можно обработать, как описано для cgi.parse_multipart().

      • cgi.parse_header() можно заменить функциональностью из пакета email, который реализует те же MIME RFC. Например, с помощью 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 (например, email.message.EmailMessage и email.message.Message), которая реализует те же MIME RFC, или из multipart. PyPI-проекта.

      (Внесено Виктором Стиннером в gh-104773).

    • Модуль crypt и его частное расширение _crypt. Модуль hashlib является потенциальной заменой для некоторых случаев использования. В противном случае можно использовать следующие проекты PyPI:

      • bcrypt: Современное хеширование паролей для вашего программного обеспечения и ваших серверов.

      • passlib: Комплексная система хеширования паролей, поддерживающая более 30 схем.

      • argon2-cffi: Безопасный алгоритм хеширования паролей Argon2.

      • legacycrypt: ctypes обертка для вызова библиотеки POSIX crypt и связанной с ней функциональности.

      • crypt_r: Форк модуля crypt, обертка для вызова библиотеки crypt_r(3) и связанной с ней функциональности.

      (Внесено Виктором Стиннером в gh-104773).

    • imghdr: используйте вместо этого проекты filetype, puremagic или python-magic. (Внесено Виктором Стиннером в gh-104773).

    • mailcap. Модуль mimetypes предоставляет альтернативу. (Внесено Виктором Стиннером в gh-104773).

    • msilib (Внесено Закари Уэйром в gh-104773).

    • nis (Внесено Виктором Стиннером в gh-104773).

    • nntplib: проект nntplib Вместо этого можно использовать проект PyPI. (Внесено Виктором Стиннером в gh-104773).

    • ossaudiodev: используйте pygame project для воспроизведения звука. (Внесено Виктором Стиннером в gh-104780).

    • pipes: используйте вместо него модуль subprocess. (Внесено Виктором Стиннером в gh-104773).

    • sndhdr: используйте вместо этого проекты filetype, puremagic или python-magic. (Внесено Виктором Стиннером в gh-104773).

    • spwd: вместо него можно использовать проект python-pam. (Внесено Виктором Стиннером в gh-104773).

    • sunau (Внесено Виктором Стиннером в gh-104773).

    • telnetlib, вместо этого используйте проекты telnetlib3 ` или :pypi:`Exscript. (Внесено Виктором Стиннером в gh-104773).

    • uu: модуль base64 - современная альтернатива. (Внесено Виктором Стиннером в gh-104773).

    • xdrlib (Внесено Виктором Стиннером в gh-104773).

  • Удалите программу 2to3 и модуль lib2to3, устаревшие в Python 3.11. (Внесено Виктором Стиннером в gh-104780).

  • Удалите модуль tkinter.tix, устаревший в Python 3.6. Сторонняя библиотека Tix, в которую был завернут модуль, не поддерживается. (Внесено Закари Уэйром в gh-75552).

configparser

  • Удалите недокументированный класс configparser.LegacyInterpolation, устаревший в строке документации с Python 3.2 и с предупреждением об устаревании с Python 3.11. (Внесено Хьюго ван Кеменаде в gh-104886).

importlib

  • Удалите устаревший доступ к __getitem__() для объектов importlib.metadata.EntryPoint. (Внесено Джейсоном Р. Кумбсом в gh-113175).

локаль

  • Уберите функцию locale.resetlocale(), устаревшую в Python 3.11: вместо нее используйте locale.setlocale(locale.LC_ALL, ""). (Внесено Виктором Стиннером в gh-104783).

ведение журнала

  • logging: Удалите недокументированные и непроверенные методы Logger.warn() и LoggerAdapter.warn() и функцию logging.warn(). Утратившие актуальность с Python 3.3, они были псевдонимами методов logging.Logger.warning(), logging.LoggerAdapter.warning() и функции logging.warning(). (Внесено Виктором Стиннером в gh-105376).

pathlib

  • Удалите поддержку использования объектов pathlib.Path в качестве менеджеров контекста. В Python 3.9 эта функциональность была устаревшей и не поддерживается.

re

  • Удалите недокументированную, никогда не работающую и устаревшую функцию re.template и флаг re.TEMPLATE (и псевдоним re.T). (Внесено Сергеем Сторчакой и Никитой Соболевым в gh-105687).

черепаха

  • Удалите метод turtle.RawTurtle.settiltangle(), устаревший в документации с Python 3.1 и получивший предупреждение об устаревании с Python 3.11. (Внесено Хьюго ван Кеменаде в gh-104876).

набор текста

  • Пространства имен typing.io и typing.re, устаревшие в Python 3.8, теперь удалены. Элементы из этих пространств имен можно импортировать непосредственно из typing. (Внесено Себастьяном Риттау в gh-92871).

  • Удалите поддержку метода keyword-argument для создания типов typing.TypedDict, устаревшего в Python 3.11. (Внесено Томасом Роуном в gh-104786).

unittest

urllib

  • Удалите параметры cafile, capath и cadefault из функции urllib.request.urlopen(), устаревшей в Python 3.6: вместо них передавайте параметр context. Используйте ssl.SSLContext.load_cert_chain() для загрузки определенных сертификатов или позвольте ssl.create_default_context() выбрать доверенные сертификаты ЦС системы за вас. (Внесено Виктором Стиннером в gh-105382).

веб-браузер

  • Удалите непроверенный и недокументированный webbrowser MacOSX, устаревший в Python 3.11. Вместо него используйте класс MacOSXOSAScript (появился в Python 3.2). (Внесено Хьюго ван Кеменаде в gh-104804).

  • Удалите устаревший атрибут webbrowser.MacOSXOSAScript._name. Вместо него используйте атрибут webbrowser.MacOSXOSAScript.name. (Внесено Никитой Соболевым в gh-105546).

Новые амортизационные отчисления

  • Удалены дескрипторы с цепочкой classmethod (введены в gh-63272). Теперь их нельзя использовать для обертывания других дескрипторов, таких как property. Основной дизайн этой функции был ошибочным и вызвал ряд последующих проблем. Чтобы «пропустить» classmethod, используйте атрибут __wrapped__, который был добавлен в Python 3.10. (Внесено Раймондом Хеттингером в gh-89519).

  • array: array код формата 'u', deprecated в документации с Python 3.3, испускает DeprecationWarning с 3.13 и будет удален в Python 3.16. Вместо этого используйте код формата 'w'. (Внесено Хьюго ван Кеменаде в gh-80480).

  • ctypes: Устраните недокументированные функции ctypes.SetPointerType() и ctypes.ARRAY(). Замените ctypes.ARRAY(item_type, size) на item_type * size. (Внесено Виктором Стиннером в gh-105733).

  • decimal: Устраните нестандартный спецификатор формата «N» для decimal.Decimal. Он не был документирован и поддерживался только в реализации на C. (Внесено Сергеем Сторчакой в gh-89902).

  • dis: Разделитель dis.HAVE_ARGUMENT устарел. Вместо этого проверьте принадлежность к hasarg. (Внесено Ирит Катриэль в gh-109319).

  • Каркасные объекты: Вызов frame.clear() на приостановленном кадре вызывает RuntimeError (как это всегда происходило с выполняющимся кадром). (Внесено Ирит Катриэль в gh-79932).

  • Модули getopt и optparse: Теперь они стали soft deprecated: модуль argparse следует использовать для новых проектов. Ранее модуль optparse уже был устаревшим, его удаление не планировалось, и никаких предупреждений не выдавалось: так что на практике изменений нет. (Внесено Виктором Стиннером в gh-106535).

  • gettext: Выдавать предупреждение об устаревании для нецелых чисел в функциях и методах gettext, которые учитывают множественные формы, даже если перевод не найден. (Внесено Сергеем Сторчакой в gh-88434).

  • glob: Недокументированные функции glob.glob0() и glob.glob1() устарели. Вместо них используйте glob.glob() и передавайте каталог в ее аргументе root_dir. (Внесено Барни Гейлом в gh-117337).

  • http.server: http.server.CGIHTTPRequestHandler теперь выдает DeprecationWarning, так как он будет удален в 3.15. Основанные на процессах CGI HTTP-серверы уже очень давно не используются. Этот код был устаревшим, не поддерживался и редко использовался. Он имеет высокий потенциал ошибок как в безопасности, так и в функциональности. Это включает в себя удаление флага --cgi в командной строке python -m http.server в версии 3.15.

  • mimetypes: Передача пути к файлу вместо URL в guess_type() - это soft deprecated. Вместо этого используйте guess_file_type(). (Внесено Сергеем Сторчакой в gh-66543).

  • re: Передача необязательных аргументов maxsplit, count и flags в функции уровня модуля re.split(), re.sub() и re.subn() в качестве позиционных аргументов теперь неактуальна. В будущих версиях Python эти параметры будут иметь вид keyword-only. (Внесено Сергеем Сторчакой в gh-56166).

  • pathlib: pathlib.PurePath.is_reserved() устарел и планируется к удалению в Python 3.15. Используйте os.path.isreserved() для определения зарезервированных путей в Windows.

  • platform: java_ver() устарел и будет удален в версии 3.15. Она была практически не протестирована, имела запутанный API и была полезна только для поддержки Jython. (Внесено Никитой Соболевым в gh-116349).

  • pydoc: Устраните недокументированную функцию pydoc.ispackage(). (Внесено Закери Спитцем в gh-64020).

  • sqlite3: Передача более одного позиционного аргумента в sqlite3.connect() и конструктор sqlite3.Connection является устаревшей. Остальные параметры станут только ключевыми в Python 3.15.

    Откажитесь от передачи имени, количества аргументов и вызываемого объекта в качестве аргументов ключевого слова для следующих sqlite3.Connection API:

    Откажитесь от передачи вызываемого обратного вызова по ключевому слову для следующих sqlite3.Connection API:

    В Python 3.15 затронутые параметры станут только позиционными.

    (Внесено Эрлендом Э. Аасланом в gh-107948 и gh-108278).

  • sys: sys._enablelegacywindowsfsencoding(). Замените ее переменной окружения PYTHONLEGACYWINDOWSFSENCODING. (Внесено Инадой Наоки в gh-73427).

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

  • traceback: Поле exc_type из traceback.TracebackException устарело. Вместо него используйте exc_type_str.

  • typing:

    • Создание класса typing.NamedTuple с использованием ключевых слов-аргументов для обозначения полей (NT = NamedTuple("NT", x=int, y=int)) устарело и будет запрещено в Python 3.15. Вместо этого используйте синтаксис, основанный на классах, или функциональный синтаксис. (Внесено Алексом Уэйгудом в gh-105566).

    • При использовании функционального синтаксиса для создания класса typing.NamedTuple или класса typing.TypedDict отказ от передачи значения параметру „fields“ (NT = NamedTuple("NT") или TD = TypedDict("TD")) является неактуальным. Передача значения None параметру „fields“ (NT = NamedTuple("NT", None) или TD = TypedDict("TD", None)) также является недопустимой. Оба параметра будут запрещены в Python 3.15. Чтобы создать класс NamedTuple с 0 полями, используйте class NT(NamedTuple): pass или NT = NamedTuple("NT", []). Чтобы создать класс TypedDict с 0 полей, используйте class TD(TypedDict): pass или TD = TypedDict("TD", {}). (Внесено Алексом Уэйгудом в gh-105566 и gh-105570).

    • typing.no_type_check_decorator() является устаревшим и планируется к удалению в Python 3.15. После восьми лет существования в модуле typing он до сих пор не поддерживается ни одной крупной программой проверки типов. (Внесено Алексом Уэйгудом в gh-106309).

    • typing.AnyStr является устаревшим. В Python 3.16 он будет удален из typing.__all__, а при импорте или обращении к нему будет выдаваться DeprecationWarning. В Python 3.18 он будет удален полностью. Вместо него используйте новый type parameter syntax. (Внесено Майклом Те в gh-107116).

  • Определяемые пользователем функции: Присвоение атрибуту __code__ функции, когда тип нового объекта кода не совпадает с типом функции, является устаревшим. Различные типы: обычная функция, генератор, асинхронный генератор и coroutine. (Внесено Ирит Катриэль в gh-81137).

  • wave: Утрачиваем методы getmark(), setmark() и getmarkers() классов wave.Wave_read и wave.Wave_write. Они будут удалены в Python 3.15. (Внесено Виктором Стиннером в gh-105096).

Удаление ожиданий в Python 3.14

  • argparse: Параметры type, choices и metavar из argparse.BooleanOptionalAction устарели и будут удалены в 3.14. (Внесено Никитой Соболевым в gh-92248).

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

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Вместо этого используйте ast.Constant. (Внесено Сергеем Сторчакой в gh-90953).

  • collections.abc: Утратившие актуальность collections.abc.ByteString. Предпочтите Sequence или Buffer. Для использования в типизации предпочтите объединение, например bytes | bytearray или collections.abc.Buffer. (Внесено Shantanu Jain в gh-91896).

  • email: Утратил силу параметр isdst в email.utils.localtime() (внесен Аланом Уильямсом в gh-72346).

  • importlib: __package__ и __cached__ перестанут устанавливаться или учитываться системой импорта (gh-97879).

  • importlib.abc устаревшие классы:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

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

    (Предоставлено Джейсоном Р. Кумбсом и Хьюго ван Кеменаде в gh-93963).

  • itertools имела недокументированную, неэффективную, исторически ошибочную и непоследовательную поддержку операций копирования, глубокого копирования и pickle. Они будут удалены в версии 3.14, что значительно сократит объем кода и нагрузку по сопровождению. (Внесено Раймондом Хеттингером в gh-101588).

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

  • pathlib: is_relative_to() и relative_to(): передача дополнительных аргументов устарела.

  • pkgutil: find_loader() и get_loader() теперь повышают DeprecationWarning; используйте вместо этого importlib.util.find_spec(). (Внесено Никитой Соболевым в gh-97850).

  • pty:

  • sqlite3:

    • version и version_info.

    • execute() и executemany(), если используется named placeholders, а параметры - это последовательность, а не dict.

    • адаптер даты и времени, конвертер даты и временной метки: см. документацию sqlite3 для предлагаемых рецептов замены.

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

  • typing: typing.ByteString, устаревший с Python 3.9, теперь при его использовании выдается DeprecationWarning.

  • urllib: urllib.parse.Quoter устарел: он не предназначался для использования в качестве общедоступного API. (Внесено Грегори П. Смитом в gh-88168).

  • xml.etree.ElementTree: Проверка истинности значения Element устарела и вызовет исключение в Python 3.14.

Удаление ожиданий в Python 3.15

  • http.server.CGIHTTPRequestHandler будет удален вместе со связанным с ним флагом --cgi в python -m http.server. Он был устаревшим и редко использовался. Прямой замены не существует. Для взаимодействия веб-сервера с обработчиком запросов любое средство лучше, чем CGI.

  • locale: locale.getdefaultlocale() был устаревшим в Python 3.11 и первоначально планировался к удалению в Python 3.13 (gh-90817), но удаление было отложено до Python 3.15. Вместо этого используйте locale.setlocale(), locale.getencoding() и locale.getlocale(). (Внесено Хьюго ван Кеменаде в gh-111187).

  • pathlib: pathlib.PurePath.is_reserved() устарел и планируется к удалению в Python 3.15. Используйте os.path.isreserved() для определения зарезервированных путей в Windows.

  • platform: java_ver() устарел и будет удален в версии 3.15. Она была практически не протестирована, имела запутанный API и была полезна только для поддержки Jython. (Внесено Никитой Соболевым в gh-116349).

  • threading: Передача любых аргументов в threading.RLock() теперь устарела. Версия на C допускает любое количество аргументов args и kwargs, но они просто игнорируются. Версия Python не допускает никаких аргументов. Все аргументы будут удалены из threading.RLock() в Python 3.15. (Внесено Никитой Соболевым в gh-102029).

  • typing.NamedTuple:

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

    • При использовании функционального синтаксиса для создания класса NamedTuple передача значения в параметр fields (NT = NamedTuple("NT")) запрещена. Передача None параметру fields (NT = NamedTuple("NT", None)) также является устаревшей. Оба параметра будут запрещены в Python 3.15. Чтобы создать класс NamedTuple с 0 полей, используйте class NT(NamedTuple): pass или NT = NamedTuple("NT", []).

  • typing.TypedDict: При использовании функционального синтаксиса для создания класса TypedDict отказ от передачи значения параметру fields (TD = TypedDict("TD")) является устаревшим. Передача значения None параметру fields (TD = TypedDict("TD", None)) также является неактуальной. Оба параметра будут запрещены в Python 3.15. Чтобы создать класс TypedDict с 0 полей, используйте class TD(TypedDict): pass или TD = TypedDict("TD", {}).

  • wave: Утрачиваем методы getmark(), setmark() и getmarkers() классов wave.Wave_read и wave.Wave_write. Они будут удалены в Python 3.15. (Внесено Виктором Стиннером в gh-105096).

Ожидание удаления в Python 3.16

  • array.array 'u' типа (wchar_t): используйте вместо него тип 'w' (Py_UCS4).

Ожидается удаление в будущих версиях

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

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

  • builtins:

    • ~bool, побитовая инверсия на bool.

    • bool(NotImplemented).

    • Генераторы: Сигнатура 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.

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

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

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

  • calendar: Константы calendar.January и calendar.February устарели и заменены на calendar.JANUARY и calendar.FEBRUARY. (Внесено принцем Рошаном в gh-103636).

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

  • datetime:

    • utcnow(): использовать datetime.datetime.now(tz=datetime.UTC).

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

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

  • importlib:

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

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

  • importlib.metadata:

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

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

  • 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

  • sysconfig.is_python_build() Параметр check_home устарел и игнорируется.

  • threading методы:

  • typing.Text (gh-92332).

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

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

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

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

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

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

Изменения байткода CPython

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

Изменения в API на языке C

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

Изменения в конструкции

  • Опция configure --with-system-libmpdec теперь по умолчанию принимает значение yes. Копия libmpdecimal в комплекте будет удалена в Python 3.15.

  • Autoconf 2.71 и aclocal 1.16.4 теперь необходимы для регенерации скрипта configure. (Внесено Кристианом Хаймсом в gh-89886).

  • Для сборки модуля расширения sqlite3 требуется SQLite 3.15.2 или новее. (Внесено Эрлендом Аасланом в gh-105875).

  • Python, собранный с помощью configure --with-trace-refs (трассировка ссылок) теперь совместим по ABI с релизной сборкой Python и debug build. (Внесено Виктором Стиннером в gh-108634).

  • Для сборки CPython теперь требуется компилятор с поддержкой атомарной библиотеки C11, встроенных атомарных функций GCC или взаимосвязанных интринсиков MSVC.

  • Расширения errno, fcntl, grp, md5, pwd, resource, termios, winsound, _ctypes_test, _multiprocessing.posixshmem, _scproxy, _stat, _statistics, _testconsole, _testimportmultiple и _uuid Расширения C теперь строятся с помощью limited C API. (Внесено Виктором Стиннером в gh-85283).

  • wasm32-wasi теперь является платформой PEP 11 второго уровня. (Внесено Бреттом Кэнноном из gh-115192).

  • wasm32-emscripten больше не является платформой, поддерживаемой PEP 11. (Внесено Бреттом Кэнноном в gh-115192).

  • Теперь в Python используется mimalloc library. Он лицензирован под лицензией MIT; см. mimalloc license. В поставляемый mimalloc внесены пользовательские изменения, подробности см. в gh-113141. (Внесено Дино Вьеландом в gh-109914).

  • На POSIX-системах имена файлов pkg-config (.pc) теперь включают флаги ABI. Например, для сборки со свободным потоком генерируется python-3.13t.pc, а для сборки с отладкой - python-3.13d.pc.

Переход на Python 3.13

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

Изменения в API Python

  • Теперь при неудаче с получением имени пользователя вместо ImportError на платформах, отличных от Unix, или KeyError на платформах Unix, где база данных паролей пуста, выдается сообщение OSError, а при неудаче с получением имени пользователя - getpass.getuser().

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

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

  • mailbox.Maildir теперь игнорирует файлы с ведущей точкой. (Внесено Закери Спитцем в gh-65559).

  • pathlib.Path.glob() и rglob() теперь возвращают и файлы, и каталоги, если задан шаблон, заканчивающийся на «**», а не только каталоги. Пользователи могут добавлять косую черту, чтобы искать только каталоги.

  • Значение атрибута mode в gzip.GzipFile было изменено с целого числа (1 или 2) на строку ('rb' или 'wb'). Значение атрибута mode читаемого файлоподобного объекта, возвращаемого zipfile.ZipFile.open(), было изменено с 'r' на 'rb'. (Внесено Сергеем Сторчакой в gh-115961).

  • Вызов locals() в optimized scope теперь производит независимый снимок при каждом вызове, и, следовательно, больше не обновляет неявно ранее возвращенные ссылки. Для получения унаследованного поведения CPython теперь требуются явные вызовы для обновления первоначально возвращенного словаря результатами последующих вызовов locals(). Функции выполнения кода, которые неявно нацелены на locals() (такие как exec и eval), должны быть переданы в явное пространство имен для доступа к их результатам в оптимизированной области видимости. (Изменено в рамках PEP 667).

  • Вызов locals() из понимания в области видимости модуля или класса (в том числе через exec или eval) снова ведет себя так, как если бы понимание выполнялось как независимая вложенная функция (т.е. локальные переменные из содержащей области видимости не включаются). В Python 3.12 это было изменено на включение локальных переменных из содержащей области видимости при реализации PEP 709. (Изменено в рамках PEP 667).

  • Обращение к FrameType.f_locals в optimized scope теперь возвращает прокси в режиме записи, а не снимок, который обновляется в неустановленное время. Если снимок нужен, его нужно создать явно с помощью dict или метода .copy() прокси. (Изменено в рамках PEP 667).

Изменения в API языка C

  • Python.h больше не включает стандартный заголовок <ieeefp.h>. Он был включен для функции finite(), которая теперь обеспечивается заголовком <math.h>. Теперь его следует включать явно, если это необходимо. Удалите также макрос HAVE_IEEEFP_H. (Внесено Виктором Стиннером в 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(). (Внесено Виктором Стиннером в gh-108765).

  • В Windows Python.h больше не включает стандартный заголовочный файл <stddef.h>. При необходимости его теперь следует включать явно. Например, он предоставляет функцию offsetof(), а также типы size_t и ptrdiff_t. Явное включение <stddef.h> уже было необходимо для всех остальных платформ, макрос HAVE_STDDEF_H определен только в Windows. (Внесено Виктором Стиннером в gh-108765).

  • Если макрос Py_LIMITED_API определен, то макросы Py_BUILD_CORE, Py_BUILD_CORE_BUILTIN и Py_BUILD_CORE_MODULE теперь не определены <Python.h>. (Внесено Виктором Стиннером в 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. (Внесено Ирит Катриэль в gh-105111).

  • Функции PyDict_GetItem(), PyDict_GetItemString(), PyMapping_HasKey(), PyMapping_HasKeyString(), PyObject_HasAttr(), PyObject_HasAttrString() и PySys_GetObject(), которые очищали все ошибки, возникшие при их вызове, теперь сообщают о них с помощью sys.unraisablehook(). Вы можете заменить их другими функциями, как рекомендуется в документации. (Внесено Сергеем Сторчакой в gh-106672).

  • PyCode_GetFirstFree() теперь является нестабильным API и был переименован в PyUnstable_Code_GetFirstFree(). (Внесено Богданом Романюком в gh-115781).

  • Эффекты мутации словаря, возвращаемого из PyEval_GetLocals() в optimized scope, изменились. Новые записи dict, добавленные таким образом, теперь будут только видны последующим вызовам PyEval_GetLocals() в этом фрейме, поскольку PyFrame_GetLocals(), locals() и FrameType.f_locals больше не обращаются к одному и тому же базовому кэшированному словарю. Изменения, внесенные в записи для реальных имен переменных и имен, добавленных через прокси-интерфейсы записи, будут перезаписаны при последующих вызовах PyEval_GetLocals() в этом кадре. Рекомендуемое обновление кода зависит от того, как использовалась функция, поэтому за подробностями обратитесь к уведомлению об устаревании функции. (Изменено в рамках PEP 667).

  • Вызов PyFrame_GetLocals() в optimized scope теперь возвращает прокси для записи, а не снимок, который обновляется в неустановленное время. Если снимок необходим, его нужно создать явно (например, с помощью PyDict_Copy()) или вызвав новый PyEval_GetFrameLocals(). API. (Изменено в рамках PEP 667).

  • PyFrame_FastToLocals() и PyFrame_FastToLocalsWithError() больше не имеют никакого эффекта. Вызов этих функций стал излишним со времен Python 3.11, когда впервые появилась PyFrame_GetLocals(). (Изменено в рамках PEP 667).

  • PyFrame_LocalsToFast() больше не имеет никакого эффекта. Вызов этой функции теперь избыточен, поскольку PyFrame_GetLocals() возвращает прокси для optimized scopes (изменено в рамках PEP 667).

Удаленные API на языке C

  • Удаление многих API (функций, макросов, переменных) с именами, имеющими префикс _Py или _PY (считаются частными API). Если ваш проект затронут одним из этих удалений и вы считаете, что удаленный API должен оставаться доступным, пожалуйста, откройте новую проблему для запроса публичного C API и добавьте cc @vstinner к проблеме, чтобы уведомить Виктора Стиннера. (Внесено Виктором Стиннером в gh-106320).

  • Удалите функции, устаревшие в 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().

    (Внесено Виктором Стиннером в gh-105107).

  • Удалите старые буферные протоколы, устаревшие в 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;
      }
      // Use `view.buf` and `view.len` to read from the buffer.
      // You may need to cast buf as `(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;
      }
      // Use `view.buf` and `view.len` to write to the buffer.
      PyBuffer_Release(&view);
      

    (Внесено Инада Наоки в gh-85275).

  • Удалите следующие старые функции для настройки инициализации Python, устаревшие в Python 3.11:

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

  • Удалите функцию PyEval_ThreadsInitialized(), устаревшую в Python 3.9. Начиная с Python 3.7, Py_Initialize() всегда создает GIL: вызов PyEval_InitThreads() ничего не дает, а PyEval_ThreadsInitialized() всегда возвращает ненулевое значение. (Внесено Виктором Стиннером в gh-105182).

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

    (Внесено Виктором Стиннером в gh-105182).

  • Удалите приватную функцию _PyObject_FastCall(): используйте PyObject_Vectorcall(), которая доступна с Python 3.8 (PEP 590). (Внесено Виктором Стиннером в gh-106023).

  • Удалите заголовочный файл cpython/pytime.h: он содержал только приватные функции. (Внесено Виктором Стиннером в gh-106316).

  • Удалите псевдоним _PyInterpreterState_Get() для PyInterpreterState_Get(), который был сохранен для обратной совместимости с Python 3.8. Псевдоним pythoncapi-compat project может быть использован для получения PyInterpreterState_Get() на Python 3.8 и старше. (Внесено Виктором Стиннером в gh-106320).

  • Функция PyModule_AddObject() теперь является soft deprecated: Вместо нее следует использовать функции PyModule_Add() или PyModule_AddObjectRef(). (Внесено Сергеем Сторчакой в gh-86493).

Утраченные API на языке C

Удаление ожиданий в Python 3.14

Удаление ожиданий в Python 3.15

Ожидается удаление в будущих версиях

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

Изменения в регрессионных тестах

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