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

Что нового в Python 3.11What’s New In Python 3.11

Редактор:

Pablo Galindo Salgado

В этой статье описаны новые возможности Python 3.11 по сравнению с версией 3.10. Python 3.11 был выпущен 24 октября 2022 года. Подробности см. в журнале изменений.

Краткий обзор – основные изменения выпускаSummary – Release highlights

  • Python 3.11 работает на 10–60% быстрее Python 3.10. В среднем по стандартному набору тестов ускорение составило 1,25 раза. Подробнее см. Faster CPython.

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

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

Новые модули стандартной библиотеки:

  • PEP 680: tomllib – Поддержка разбора TOML в стандартной библиотеке

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

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

Важные устаревания, удаления и ограничения:

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

PEP 657: Детализированное указание на ошибки в трассировкахPEP 657: Fine-grained error locations in tracebacks

При выводе трассировки интерпретатор теперь указывает на точное выражение, которое вызвало ошибку, а не просто на строку. Например:

Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'

В предыдущих версиях интерпретатор указывал только на строку, из-за чего было непонятно, какой объект был None. Эти улучшенные сообщения об ошибках также могут быть полезны при работе с глубоко вложенными объектами dict и множественными вызовами функций:

Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

А также сложные арифметические выражения:

Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero

Кроме того, информация, используемая улучшенной функцией трассировки, становится доступной через общий API, который можно использовать для сопоставления байт-кода инструкций с расположением в исходном коде. Эту информацию можно получить с помощью:

См. PEP 657 для получения более подробной информации. (Авторы: Pablo Galindo, Batuhan Taskaya и Ammar Askar в bpo-43950.)

Примечание

Эта функция требует хранения позиций столбцов в объектах кода, что может привести к небольшому увеличению использования памяти интерпретатора и места на диске для скомпилированных файлов Python. Чтобы избежать хранения дополнительной информации и отключить печать дополнительной информации трассировки, используйте опцию командной строки -X no_debug_ranges или переменную окружения PYTHONNODEBUGRANGES.

PEP 654: Группы исключений и except*PEP 654: Exception Groups and except*

PEP 654 вводит языковые возможности, которые позволяют программе возбуждать и обрабатывать несколько не связанных исключений одновременно. Встроенные типы ExceptionGroup и BaseExceptionGroup позволяют группировать исключения и возбуждать их вместе, а новый синтаксис except* обобщает except для сопоставления подгрупп групп исключений.

См. PEP 654 для получения более подробной информации.

(Автор: Irit Katriel в bpo-45292. PEP написан Irit Katriel, Yury Selivanov и Guido van Rossum.)

PEP 678: Исключения можно обогащать примечаниямиPEP 678: Exceptions can be enriched with notes

Метод add_note() добавлен в BaseException. Его можно использовать для обогащения исключений контекстной информацией, которая недоступна в момент возбуждения исключения. Добавленные примечания отображаются в стандартной трассировке.

См. PEP 678 для получения более подробной информации.

(Автор: Irit Katriel в bpo-45607. PEP написан Zac Hatfield-Dodds.)

Улучшения py.exe лаунчера WindowsWindows py.exe launcher improvements

Копия менеджера установки Python, включенная в Python 3.11, была значительно обновлена. Теперь он поддерживает синтаксис company/tag, как определено в PEP 514, с использованием аргумента -V:<company>/<tag> вместо ограниченного -<major>.<minor>. Это позволяет запускать дистрибутивы, отличные от PythonCore, того, который размещен на python.org.

При использовании селекторов -V: можно опустить либо компанию, либо тег, но будут сканироваться все установки. Например, -V:OtherPython/ выберет «лучший» тег, зарегистрированный для OtherPython, в то время как -V:3.11 или -V:/3.11 выберут «лучший» дистрибутив с тегом 3.11.

При использовании устаревших аргументов -<major>, -<major>.<minor>, -<major>-<bitness> или -<major>.<minor>-<bitness> все существующее поведение должно сохраняться из прошлых версий, и будут выбраны только выпуски с PythonCore. Однако суффикс -64 теперь означает «не 32-битный» (не обязательно x86-64), поскольку существует несколько поддерживаемых 64-битных платформ. 32-битные среды выполнения определяются путем проверки тега среды выполнения на наличие суффикса -32. Все выпуски Python начиная с 3.5 включали это в свои 32-битные сборки.

Прочие изменения языка Other Language Changes

  • Добавлен параметр командной строки -P и переменная окружения PYTHONSAFEPATH, которые отключают автоматическое добавление в начало sys.path каталога скрипта при его выполнении или текущего каталога при использовании -c и -m. Это гарантирует, что import будут подхватываться только модули из стандартной библиотеки и установленные модули, и предотвращает непреднамеренное или злонамеренное затенение модулей модулями из локального (обычно доступного для записи пользователем) каталога. (Предложено Victor Stinner в gh-57684.)

  • В миниязык спецификации формата добавлена опция "z", которая преобразует отрицательный ноль в положительный после округления до точности формата. Подробнее см. PEP 682. (Предложено John Belmonte в gh-90153.)

  • Объекты bytes больше не принимаются в sys.path. Поддержка была нарушена где-то между Python 3.2 и 3.6, и никто этого не заметил до выхода Python 3.10.0. Кроме того, восстановление поддержки было бы проблематичным из-за взаимодействия между -b и sys.path_importer_cache при смешивании ключей str и bytes. (Предложено Thomas Grainger в gh-91181.)

Прочие изменения реализации CPython Other CPython Implementation Changes

  • Специальные методы __complex__() для complex и __bytes__() для bytes реализованы для поддержки протоколов typing.SupportsComplex и typing.SupportsBytes. (Предложено Mark Dickinson и Donghee Na в bpo-24234.)

  • siphash13 добавлен как новый внутренний алгоритм хеширования. Он обладает аналогичными свойствами безопасности, что и siphash24, но немного быстрее для длинных входных данных. str, bytes и некоторые другие типы теперь используют его как алгоритм по умолчанию для hash(). PEP 552 хешированные .pyc-файлы теперь также используют siphash13. (Предложено Inada Naoki в bpo-29410.)

  • Когда активное исключение повторно возбуждается оператором raise без параметров, трассировка, прикреплённая к этому исключению, теперь всегда sys.exc_info()[1].__traceback__. Это означает, что изменения, внесённые в трассировку в текущем предложении except, отражаются в повторно возбуждённом исключении. (Предложено Irit Katriel в bpo-45711.)

  • Представление обработанных исключений в состоянии интерпретатора (также известное как exc_info или _PyErr_StackItem) теперь содержит только поле exc_value; exc_type и exc_traceback удалены, поскольку они могут быть получены из exc_value. (Предложено Irit Katriel в bpo-45711.)

  • Для установщика Windows добавлена новая опция командной строки, AppendPath. Она ведёт себя аналогично PrependPath, но добавляет каталоги установки и скриптов в конец, а не в начало. (Предложено Bastian Neuburger в bpo-44934.)

  • Поле PyConfig.module_search_paths_set теперь должно быть установлено в 1, чтобы инициализация использовала PyConfig.module_search_paths для инициализации sys.path. В противном случае инициализация пересчитает путь и заменит любые значения, добавленные в module_search_paths.

  • Вывод опции --help теперь умещается в 50 строк/80 столбцов. Информация о переменных окружения Python и опциях -X теперь доступна с помощью соответствующих флагов --help-env и --help-xoptions, а также новой --help-all. (Предложено Éric Araujo в bpo-46142.)

  • Преобразование между int и str по основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызывает ValueError, если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для CVE 2020-10735. Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или API sys. См. документацию ограничения длины строкового представления целых чисел. Лимит по умолчанию – 4300 цифр в строковом представлении.

Новые модули New Modules

  • tomllib: Для разбора TOML. Подробнее см. PEP 680. (Предложено Taneli Hukkinen в bpo-40059.)

  • wsgiref.types: WSGI-специфичные типы для статической проверки типов. (Автор: Sebastian Rittau, bpo-42012.)

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

asyncio

  • Добавлен класс TaskGroup, асинхронный контекстный менеджер, который содержит группу задач и ожидает завершения всех при выходе. Для нового кода рекомендуется использовать его вместо непосредственного использования create_task() и gather(). (Автор: Yury Selivanov и другие, gh-90908.)

  • Добавлен timeout() – асинхронный контекстный менеджер для установки тайм-аута на асинхронные операции. Для нового кода рекомендуется использовать его вместо непосредственного использования wait_for(). (Автор: Andrew Svetlov, gh-90927.)

  • Добавлен класс Runner, предоставляющий доступ к механизмам, используемым run(). (Автор: Andrew Svetlov, gh-91218.)

  • В библиотеку asyncio добавлен класс Barrier к примитивам синхронизации, а также связанное с ним исключение BrokenBarrierError. (Авторы: Yves Duprat и Andrew Svetlov, gh-87518.)

  • Добавлен именованный аргумент all_errors в функцию asyncio.loop.create_connection(), чтобы несколько ошибок соединения можно было возбудить как одно ExceptionGroup.

  • Добавлен метод asyncio.StreamWriter.start_tls() для обновления существующих потоковых соединений до TLS. (Автор: Ian Good, bpo-34975.)

  • В цикл событий добавлены функции для работы с сырыми датаграммными сокетами: sock_sendto(), sock_recvfrom() и sock_recvfrom_into(). Их реализации находятся в SelectorEventLoop и ProactorEventLoop. (Автор: Alex Grönholm, bpo-46805.)

  • Добавлены методы cancelling() и uncancel() в Task. Они предназначены в первую очередь для внутреннего использования, в частности, TaskGroup.

contextlib

  • Добавлен не потокобезопасный контекстный менеджер chdir() для смены текущего рабочего каталога с последующим восстановлением при выходе. Простая обёртка вокруг chdir(). (Автор: Filipe Laíns, bpo-25625)

dataclasses

  • Изменена проверка мутабельности значений по умолчанию для полей: теперь допускаются только хешируемые значения вместо любого объекта, не являющегося экземпляром dict, list или set. (Автор: Eric V. Smith, bpo-44674.)

datetime

enum

  • Переименован EnumMeta в EnumType (EnumMeta оставлен как псевдоним).

  • Добавлен StrEnum, с членами, которые могут (и должны) использоваться как строки.

  • Добавлен ReprEnum, который изменяет только __repr__() членов, возвращая их буквальные значения (а не имена) для __str__() и __format__() (используется в str(), format() и f-строках).

  • Изменено Enum.__format__() (значение по умолчанию для format(), str.format() и f-строк) – теперь оно всегда даёт тот же результат, что и Enum.__str__(): для перечислений, наследующих от ReprEnum, это будет значение члена; для всех остальных перечислений это будет имя перечисления и имя члена (например, Color.RED).

  • Добавлен новый параметр класса boundary для перечислений Flag и перечисление FlagBoundary с его параметрами, чтобы управлять обработкой значений флагов, выходящих за пределы диапазона.

  • Добавлены декоратор перечислений verify() и перечисление EnumCheck с его параметрами для проверки классов перечислений на соответствие нескольким конкретным ограничениям.

  • Добавлены декораторы member() и nonmember(), чтобы гарантировать, что декорируемый объект преобразуется/не преобразуется в член перечисления.

  • Добавлен декоратор property(), который работает как property(), но для перечислений. Используйте его вместо types.DynamicClassAttribute().

  • Добавлен декоратор перечислений global_enum(), который изменяет __repr__() и __str__() так, чтобы отображать значения как члены их модуля, а не класса перечисления. Например, 're.ASCII' для члена ASCII из re.RegexFlag вместо 'RegexFlag.ASCII'.

  • Улучшен Flag: теперь поддерживаются len(), итерация и in/not in по его членам. Например, теперь работает следующий код: len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)

  • Изменены Enum и Flag: теперь члены определяются до вызова __init_subclass__(); dir() теперь включает методы и т.д. из примешанных типов данных.

  • Изменено Flag: теперь только первичные значения (степени двойки) считаются каноническими, в то время как составные значения (3, 6, 10 и т.д.) считаются псевдонимами; инвертированные флаги приводятся к положительному эквиваленту.

fcntl

  • На FreeBSD поддерживаются флаги F_DUP2FD и F_DUP2FD_CLOEXEC: первый эквивалентен использованию dup2, а второй, кроме того, устанавливает флаг FD_CLOEXEC.

fractions

  • Support PEP 515-style initialization of Fraction from string. (Contributed by Sergey B Kirpichev in bpo-44258.)

  • Теперь Fraction реализует метод __int__, благодаря чему проверка isinstance(some_fraction, typing.SupportsInt) успешно проходит. (Автор: Mark Dickinson, bpo-44547.)

functools

  • Теперь functools.singledispatch() поддерживает types.UnionType и typing.Union в качестве аннотаций к аргументу dispatch.:

    >>> from functools import singledispatch
    >>> @singledispatch
    ... def fun(arg, verbose=False):
    ...     if verbose:
    ...         print("Let me just say,", end=" ")
    ...     print(arg)
    ...
    >>> @fun.register
    ... def _(arg: int | float, verbose=False):
    ...     if verbose:
    ...         print("Strength in numbers, eh?", end=" ")
    ...     print(arg)
    ...
    >>> from typing import Union
    >>> @fun.register
    ... def _(arg: Union[list, set], verbose=False):
    ...     if verbose:
    ...         print("Enumerate this:")
    ...     for i, elem in enumerate(arg):
    ...         print(i, elem)
    ...
    

    (Автор: Yurii Karabas, bpo-46014.)

gzip

  • Функция gzip.compress() теперь работает быстрее при использовании аргумента mtime=0, так как она полностью делегирует сжатие единственной операции zlib.compress(). У этого изменения есть один побочный эффект: заголовок gzip-файла содержит байт «OS». Ранее модуль gzip всегда устанавливал в нём значение 255, означающее «неизвестно». Теперь при использовании compress() с mtime=0 это значение может быть другим, в зависимости от библиотеки zlib на C, с которой слинкован Python. (Подробнее о побочном эффекте см. gh-112346.)

hashlib

  • hashlib.blake2b() и hashlib.blake2s() теперь предпочитают libb2 собственной копии Python. (Автор: Christian Heimes, bpo-47095.)

  • Внутренний модуль _sha3 с алгоритмами SHA3 и SHAKE теперь использует tiny_sha3 вместо Keccak Code Package для уменьшения объёма кода и двоичного размера. Модуль hashlib предпочитает оптимизированные реализации SHA3 и SHAKE из OpenSSL. Изменение затрагивает только установки без поддержки OpenSSL. (Автор: Christian Heimes, bpo-47098.)

  • Добавлена hashlib.file_digest() – вспомогательная функция для эффективного хеширования файлов или файлоподобных объектов. (Автор: Christian Heimes, gh-89313.)

IDLE and idlelib

  • Применять подсветку синтаксиса для файлов .pyi. (Авторы: Alex Waygood и Terry Jan Reedy, bpo-45447.)

  • Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, gh-95191.)

inspect

locale

  • Добавлена locale.getencoding() для получения текущей кодировки локали. Она аналогична locale.getpreferredencoding(False), но игнорирует режим UTF-8 в Python.

logging

  • Добавлена getLevelNamesMapping() для возврата отображения имён уровней логирования (например, 'CRITICAL') в значения соответствующих уровней логирования (например, 50 по умолчанию). (Автор: Andrei Kulakovin, gh-88024.)

  • Добавлен метод createSocket() в SysLogHandler для соответствия SocketHandler.createSocket(). Он вызывается автоматически при инициализации обработчика и при отправке события, если нет активного сокета. (Автор: Kirill Pinchuk, gh-88457.)

math

  • Добавлена math.exp2(): возвращает 2, возведённое в степень x. (Автор: Gideon Mitchell, bpo-45917.)

  • Добавлена math.cbrt(): возвращает кубический корень из x. (Автор: Ajith Ramachandran, bpo-44357.)

  • Поведение двух особых случаев math.pow() было изменено для соответствия спецификации IEEE 754. Операции math.pow(0.0, -math.inf) и math.pow(-0.0, -math.inf) теперь возвращают inf. Ранее они вызывали ValueError. (Автор: Mark Dickinson, bpo-44339.)

  • Значение math.nan теперь всегда доступно. (Автор: Victor Stinner, bpo-46917.)

operator

  • Добавлена новая функция operator.call, так что operator.call(obj, *args, **kwargs) == obj(*args, **kwargs). (Предложено Antony Lee в bpo-44019.)

os

  • В Windows os.urandom() теперь использует BCryptGenRandom() вместо CryptGenRandom(), который устарел. (Предложено Donghee Na в bpo-44611.)

pathlib

  • glob() и rglob() возвращают только каталоги, если pattern заканчивается разделителем компонентов пути: sep или altsep. (Предложено Eisuke Kawasima в bpo-22276 и bpo-33392.)

re

  • Атомарные группы ((?>...)) и possessive-квантификаторы (*+, ++, ?+, {m,n}+) теперь поддерживаются в регулярных выражениях. (Предложено Jeffrey C. Jacobs и Serhiy Storchaka в bpo-433030.)

shutil

  • Добавлен необязательный параметр dir_fd в shutil.rmtree(). (Предложено Serhiy Storchaka в bpo-46245.)

socket

  • Добавлена поддержка CAN-сокетов для NetBSD. (Предложено Thomas Klausner в bpo-30512.)

  • create_connection() имеет опцию, позволяющую в случае неудачи подключения возбуждать ExceptionGroup, содержащее все ошибки, вместо того чтобы возбуждать только последнюю. (Предложено Irit Katriel в bpo-29980.)

sqlite3

  • Теперь можно отключить авторизатор, передав None в set_authorizer(). (Предложено Erlend E. Aasland в bpo-44491.)

  • Имя collation create_collation() теперь может содержать любые символы Unicode. Имена collation с недопустимыми символами теперь возбуждают UnicodeEncodeError вместо sqlite3.ProgrammingError. (Предложено Erlend E. Aasland в bpo-44688.)

  • Исключения sqlite3 теперь включают расширенный код ошибки SQLite как sqlite_errorcode и имя ошибки SQLite как sqlite_errorname. (Предложено Aviv Palivoda, Daniel Shahaf и Erlend E. Aasland в bpo-16379 и bpo-24139.)

  • Добавлены setlimit() и getlimit() в sqlite3.Connection для установки и получения лимитов SQLite на уровне соединения. (Предложено Erlend E. Aasland в bpo-45243.)

  • sqlite3 теперь устанавливает sqlite3.threadsafety на основе режима потоков по умолчанию, с которым скомпилирована базовая библиотека SQLite. (Предложено Erlend E. Aasland в bpo-45613.)

  • C-колбэки sqlite3 теперь используют невыбрасываемые исключения, если включены трассировки колбэков. Пользователи теперь могут зарегистрировать unraisable hook handler для улучшения опыта отладки. (Предложено Erlend E. Aasland в bpo-45828.)

  • Выборка при откате больше не возбуждает InterfaceError. Вместо этого мы передаём обработку этих случаев библиотеке SQLite. (Предложено Erlend E. Aasland в bpo-44092.)

  • Добавлены serialize() и deserialize() в sqlite3.Connection для сериализации и десериализации баз данных. (Предложено Erlend E. Aasland в bpo-41930.)

  • Добавлен create_window_function() в sqlite3.Connection для создания агрегатных оконных функций. (Предложено Erlend E. Aasland в bpo-34916.)

  • Добавлен blobopen() в sqlite3.Connection. sqlite3.Blob позволяет выполнять инкрементальные операции ввода-вывода над BLOB-ами. (Предложено Aviv Palivoda и Erlend E. Aasland в bpo-24905.)

string

  • Добавлены get_identifiers() и is_valid() в string.Template, которые соответственно возвращают все допустимые заполнители и наличие недопустимых заполнителей. (Предложено Ben Kehoe в gh-90465.)

sys

  • sys.exc_info() теперь выводит поля type и traceback из value (экземпляра исключения), так что при изменении исключения во время его обработки изменения отражаются в результатах последующих вызовов exc_info(). (Предложено Irit Katriel в bpo-45711.)

  • Добавлен sys.exception(), который возвращает активный экземпляр исключения (эквивалентно sys.exc_info()[1]). (Предложено Irit Katriel в bpo-46328.)

  • Добавлен флаг sys.flags.safe_path. (Предложено Victor Stinner в gh-57684.)

sysconfig

  • Три новые схемы установки (posix_venv, nt_venv и venv) были добавлены и используются, когда Python создаёт новые виртуальные окружения или запускается из виртуального окружения. Первые две схемы (posix_venv и nt_venv) являются зависимыми от ОС: для не-Windows и Windows, а venv по сути является псевдонимом одной из них в зависимости от ОС, на которой работает Python. Это полезно для дистрибьюторов, которые модифицируют sysconfig.get_preferred_scheme(). Сторонний код, создающий новые виртуальные окружения, должен использовать новую схему установки venv для определения путей, как это делает venv. (Предложено Miro Hrončok в bpo-45413.)

tempfile

  • Объекты SpooledTemporaryFile теперь полностью реализуют методы io.BufferedIOBase или io.TextIOBase (в зависимости от режима файла). Это позволяет им корректно работать с API, ожидающими объекты, подобные файлам, например, модулями сжатия. (Автор: Carey Metcalfe в gh-70363.)

threading

  • В Unix, если функция sem_clockwait() доступна в библиотеке C (glibc 2.30 и новее), метод threading.Lock.acquire() теперь использует монотонные часы (time.CLOCK_MONOTONIC) для тайм-аута, вместо использования системных часов (time.CLOCK_REALTIME), чтобы не зависеть от изменений системных часов. (Автор: Victor Stinner в bpo-41710.)

time

  • В Unix, time.sleep() теперь использует функцию clock_nanosleep() или nanosleep(), если она доступна, которая имеет разрешение 1 наносекунда (10-9 секунды), вместо использования select(), которая имеет разрешение 1 микросекунда (10-6 секунды). (Авторы: Benjamin Szőke и Victor Stinner в bpo-21302.)

  • В Windows 8.1 и новее, time.sleep() теперь использует ожидаемый таймер на основе высокоточных таймеров, который имеет разрешение 100 наносекунд (10-7 секунды). Ранее он имел разрешение 1 миллисекунда (10-3 секунды). (Авторы: Benjamin Szőke, Donghee Na, Eryk Sun и Victor Stinner в bpo-21302 и bpo-45429.)

tkinter

  • Добавлен метод info_patchlevel(), который возвращает точную версию библиотеки Tcl в виде именованного кортежа, подобного sys.version_info. (Автор: Serhiy Storchaka в gh-91827.)

traceback

typing

Основные изменения см. в новых возможностях, связанных с аннотациями типов.

  • Добавлены typing.assert_never() и typing.Never. typing.assert_never() полезен для запроса к проверяльщику типов подтверждения, что строка кода недостижима. Во время выполнения он возбуждает AssertionError. (Автор: Jelle Zijlstra в gh-90633.)

  • Добавлен typing.reveal_type(). Это полезно для запроса к проверяльщику типов, какой тип он вывел для данного выражения. Во время выполнения он выводит тип полученного значения. (Автор: Jelle Zijlstra в gh-90572.)

  • Добавлен typing.assert_type(). Это полезно для запроса к проверяльщику типов подтверждения, что выведенный им тип для данного выражения соответствует заданному типу. Во время выполнения он просто возвращает полученное значение. (Автор: Jelle Zijlstra в gh-90638.)

  • Типы typing.TypedDict теперь могут быть обобщёнными. (Автор: Samodya Abeysiriwardane в gh-89026.)

  • Типы NamedTuple теперь могут быть обобщёнными. (Автор: Serhiy Storchaka в bpo-43923.)

  • Разрешено создание подклассов typing.Any. Это полезно для избежания ошибок проверяльщика типов, связанных с высокодинамичными классами, такими как mocks. (Автор: Shantanu Jain в gh-91154.)

  • Декоратор typing.final() теперь устанавливает атрибут __final__ на декорируемом объекте. (Автор: Jelle Zijlstra в gh-90500.)

  • Функция typing.get_overloads() может использоваться для интроспекции перегрузок функции. typing.clear_overloads() можно использовать для очистки всех зарегистрированных перегрузок функции. (Автор: Jelle Zijlstra в gh-89263.)

  • Метод __init__() подклассов Protocol теперь сохраняется. (Автор: Adrian Garcia Badarasco в gh-88970.)

  • Представление типов пустых кортежей (Tuple[()]) упрощено. Это влияет на интроспекцию, например, get_args(Tuple[()]) теперь вычисляется в () вместо ((),). (Автор: Serhiy Storchaka в gh-91137.)

  • Ослаблены требования времени выполнения для аннотаций типов путём удаления проверки на вызываемость в частной функции typing._type_check. (Автор: Gregory Beauregard в gh-90802.)

  • typing.get_type_hints() теперь поддерживает вычисление строк как прямых ссылок в обобщённых псевдонимах PEP 585. (Автор: Niklas Rosenstein в gh-85542.)

  • typing.get_type_hints() больше не добавляет Optional к параметрам с None в качестве значения по умолчанию. (Автор: Nikita Sobolev в gh-90353.)

  • typing.get_type_hints() теперь поддерживает вычисление чистых строковых аннотаций ClassVar. (Автор: Gregory Beauregard в gh-90711.)

  • typing.no_type_check() больше не изменяет внешние классы и функции. Теперь он также корректно помечает методы класса как не подлежащие проверке типов. (Автор: Nikita Sobolev в gh-90729.)

unicodedata

  • База данных Unicode обновлена до версии 14.0.0. (Автор: Benjamin Peterson в bpo-45190).

unittest

venv

  • Когда создаются новые виртуальные окружения Python, venv схема установки sysconfig используется для определения путей внутри окружения. Когда Python работает в виртуальном окружении, эта же схема установки используется по умолчанию. Это означает, что нижестоящие распространители могут изменить схему установки sysconfig по умолчанию, не меняя поведение виртуальных окружений. Сторонний код, который также создаёт новые виртуальные окружения, должен делать то же самое. (Предложено Miro Hrončok в bpo-45413.)

warnings

  • warnings.catch_warnings() теперь принимает аргументы для warnings.simplefilter(), предоставляя более краткий способ локального игнорирования предупреждений или преобразования их в ошибки. (Предложено Zac Hatfield-Dodds в bpo-47074.)

zipfile

  • Добавлена поддержка указания кодировки имён членов для чтения метаданных в заголовках каталога и файлов ZipFile. (Предложено Stephen J. Turnbull и Serhiy Storchaka в bpo-28080.)

  • Добавлен ZipFile.mkdir() для создания новых каталогов внутри ZIP-архивов. (Предложено Sam Ezeh в gh-49083.)

  • Добавлены stem, suffix и suffixes в zipfile.Path. (Предложено Miguel Brito в gh-88261.)

ОптимизацииOptimizations

В этом разделе рассматриваются конкретные оптимизации, не связанные с проектом Faster CPython, который описан в отдельном разделе.

  • Компилятор теперь оптимизирует простое printf-форматирование % строковых литералов, содержащих только коды формата %s, %r и %a, и делает его таким же быстрым, как соответствующее выражение f-строки. (Предложено Serhiy Storchaka в bpo-28307.)

  • Целочисленное деление (//) лучше оптимизируется компиляторами. Теперь оно примерно на 20% быстрее на x86-64 при делении int на значение меньше 2**30. (Предложено Gregory P. Smith и Tim Peters в gh-90564.)

  • sum() теперь почти на 30% быстрее для целых чисел меньше 2**30. (Предложено Stefan Behnel в gh-68264.)

  • Изменение размера списков оптимизировано для типичного случая, ускоряя list.append() примерно на 15% и простые списковые включения до 20–30%. (Предложено Dennis Sweeney в gh-91165.)

  • Словари не хранят хеш-значения, если все ключи являются объектами Unicode, что уменьшает размер dict. Например, sys.getsizeof(dict.fromkeys("abcdefg")) уменьшается с 352 байт до 272 байт (на 23% меньше) на 64-битных платформах. (Предложено Inada Naoki в bpo-46845.)

  • Использование asyncio.DatagramProtocol теперь на порядки быстрее при передаче больших файлов через UDP: скорость более чем в 100 раз выше для файла размером ≈60 МиБ. (Предложено msoxzw в gh-91487.)

  • Функции math comb() и perm() теперь примерно в 10 раз быстрее для больших аргументов (с большим ускорением для больших k). (Предложено Serhiy Storchaka в bpo-37295.)

  • Функции statistics mean(), variance() и stdev() теперь обрабатывают итераторы за один проход, а не преобразуют их сначала в list. Это вдвое быстрее и может существенно сэкономить память. (Предложено Raymond Hettinger в gh-90415.)

  • unicodedata.normalize() теперь нормализует строки из чистого ASCII за константное время. (Предложено Donghee Na в bpo-44987.)

Faster CPython

CPython 3.11 в среднем на 25% быстрее CPython 3.10 по результатам тестового набора pyperformance при компиляции с GCC на Ubuntu Linux. В зависимости от нагрузки общее ускорение может составлять 10–60%.

Этот проект фокусируется на двух основных областях Python: Faster Startup и Faster Runtime. Оптимизации, не охваченные этим проектом, перечислены отдельно в разделе Optimizations.

Faster Startup

Frozen imports / Static code objects

Python кеширует байткод в каталоге __pycache__ для ускорения загрузки модулей.

Ранее в Python 3.10 выполнение модуля выглядело так:

Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate

В Python 3.11 основные модули, необходимые для запуска Python, «заморожены». Это означает, что их объекты кода (и байткод) статически выделяются интерпретатором. Это сокращает этапы выполнения модуля до:

Statically allocated code object -> Evaluate

Запуск интерпретатора теперь на 10–15% быстрее в Python 3.11. Это оказывает большое влияние на короткие программы, использующие Python.

(Предложено Eric Snow, Guido van Rossum и Kumar Aditya во многих тикетах.)

Faster Runtime

Cheaper, lazy Python frames

Фреймы Python, содержащие информацию о выполнении, создаются при каждом вызове Python-функции. Ниже приведены новые оптимизации фреймов:

  • Упрощён процесс создания фреймов.

  • Удалось избежать выделения памяти за счёт повторного использования пространства фреймов в C-стеке.

  • Упрощена внутренняя структура фрейма: теперь она содержит только основную информацию. Раньше фреймы содержали дополнительную отладочную информацию и информацию об управлении памятью.

Объекты фреймов старого стиля теперь создаются только по запросу отладчиков или функций самоанализа Python, таких как sys._getframe() и inspect.currentframe(). Для большинства пользовательского кода объекты фреймов не создаются вовсе. Как результат, почти все вызовы функций Python значительно ускорились. Мы измерили прирост производительности на 3–7% в pyperformance.

(Предложено Марком Шенноном в bpo-44590.)

Встраивание вызовов функций PythonInlined Python function calls

Во время вызова функции Python вызывает C-функцию оценки для интерпретации кода этой функции. Это фактически ограничивает чистую рекурсию Python тем, что безопасно для C-стека.

В версии 3.11, когда CPython обнаруживает, что Python-код вызывает другую функцию Python, он создаёт новый фрейм и «перепрыгивает» к новому коду внутри нового фрейма. Это позволяет полностью избежать вызова C-функции интерпретации.

Большинство вызовов функций Python теперь не расходуют память C-стека, что ускоряет их. В простых рекурсивных функциях, таких как fibonacci или factorial, мы наблюдали ускорение в 1,7 раза. Это также означает, что рекурсивные функции могут углубляться значительно сильнее (если пользователь увеличивает предел рекурсии с помощью sys.setrecursionlimit()). Мы измерили улучшение на 1–3% в pyperformance.

(Предложено Пабло Галиндо и Марком Шенноном в bpo-45256.)

PEP 659: Специализирующийся адаптивный интерпретаторPEP 659: Specializing Adaptive Interpreter

PEP 659 – одна из ключевых частей проекта Faster CPython. Общая идея в том, что, хотя Python – динамический язык, в большинстве кода есть участки, где объекты и типы редко меняются. Эта концепция известна как стабильность типов.

Во время выполнения Python пытается найти общие шаблоны и стабильность типов в исполняемом коде. Затем Python заменяет текущую операцию на более специализированную. Эта специализированная операция использует быстрые пути, доступные только для этих сценариев использования/типов, которые в целом превосходят свои универсальные аналоги. Это также вводит ещё одну концепцию, называемую кэширование в коде, когда Python кэширует результаты дорогостоящих операций непосредственно в байткод.

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

Python выполняет специализацию только тогда, когда видит код, который является «горячим» (выполняется несколько раз). Это предотвращает трату времени Python на код, выполняющийся один раз. Python также может деспециализироваться, когда код слишком динамичен или когда использование меняется. Специализация предпринимается периодически, и попытки специализации не слишком дороги, что позволяет специализации адаптироваться к новым условиям.

(PEP написан Марком Шенноном, идеи вдохновлены Стефаном Брунталером. См. PEP 659 для получения дополнительной информации. Реализация Марка Шеннона и Брэндта Бухера, с дополнительной помощью Ирит Катриэль и Денниса Суини.)

Операция

Форма

Специализация

Ускорение операции (до)

Автор(ы)

Бинарные операции

x + x

x - x

x * x

Бинарные сложение, умножение и вычитание для распространённых типов, таких как int, float и str, используют специальные быстрые пути для своих базовых типов.

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

Индексация

a[i]

Индексация типов-контейнеров, таких как list, tuple и dict, напрямую обращается к базовым структурам данных.

Индексация пользовательских __getitem__() также встраивается аналогично встраиванию вызовов функций Python.

10-25%

Irit Katriel, Mark Shannon

Присваивание по индексу

a[i] = z

Аналогично специализации индексации выше.

10-25%

Dennis Sweeney

Вызовы

f(arg)

C(arg)

Вызовы распространённых встроенных (C) функций и типов, таких как len() и str, напрямую вызывают их базовую C-версию. Это позволяет обойти внутреннее соглашение о вызовах.

20%

Mark Shannon, Ken Jin

Загрузка глобальной переменной

print

len

Индекс объекта в пространстве имён globals/builtins кэшируется. Для загрузки globals и builtins не требуется ни одного поиска в пространстве имён.

[1]

Mark Shannon

Загрузка атрибута

o.attr

Аналогично загрузке глобальных переменных. Индекс атрибута внутри пространства имён класса/объекта кэшируется. В большинстве случаев загрузка атрибута не требует поиска в пространстве имён.

[2]

Mark Shannon

Загрузка методов для вызова

o.meth()

Фактический адрес метода кэшируется. Загрузка метода теперь не требует поиска в пространстве имён – даже для классов с длинными цепочками наследования.

10-20%

Ken Jin, Mark Shannon

Сохранение атрибута

o.attr = z

Аналогично оптимизации загрузки атрибута.

2% в pyperformance

Mark Shannon

Распаковка последовательности

*seq

Специализирован для распространённых контейнеров, таких как list и tuple. Избегает внутреннего соглашения о вызовах.

8%

Brandt Bucher

РазноеMisc

  • Объекты теперь требуют меньше памяти благодаря лениво создаваемым пространствам имён объектов. Их словари пространств имён теперь также более свободно разделяют ключи. (Вклад Марка Шеннона в bpo-45340 и bpo-40116.)

  • Реализованы исключения с «нулевой стоимостью», устраняющие затраты на оператор try, когда исключение не возбуждается. (Вклад Марка Шеннона в bpo-40222.)

  • Более компактное представление исключений в интерпретаторе сократило время, необходимое для перехвата исключения, примерно на 10%. (Вклад Ирит Катриэль в bpo-45711.)

  • Движок сопоставления регулярных выражений re был частично переработан и теперь на поддерживаемых платформах использует вычисляемые переходы (или «threaded code»). В результате Python 3.11 выполняет тесты производительности регулярных выражений pyperformance до 10% быстрее, чем Python 3.10. (Вклад Брандта Бухера в gh-91404.)

Часто задаваемые вопросыFAQ

Как следует писать код, чтобы использовать эти ускорения?How should I write my code to utilize these speedups?

Пишите Pythonic-код, следующий общепринятым лучшим практикам; вам не нужно менять свой код. Проект Faster CPython оптимизирует типичные шаблоны кода, которые мы наблюдаем.

Будет ли CPython 3.11 использовать больше памяти?Will CPython 3.11 use more memory?

Возможно, нет; мы не ожидаем, что использование памяти превысит 20% по сравнению с 3.10. Это компенсируется оптимизациями памяти для объектов фреймов и словарей объектов, как упоминалось выше.

Я не вижу ускорений в своей рабочей нагрузке. Почему?I don’t see any speedups in my workload. Why?

Некоторый код не получит заметных преимуществ. Если ваш код тратит большую часть времени на операции ввода-вывода или уже выполняет большую часть вычислений в расширении на C, таком как NumPy, значительного ускорения не будет. Этот проект в настоящее время больше всего выигрывают чисто Python-нагрузки.

Кроме того, показатели pyperformance являются средним геометрическим. Даже среди тестов pyperformance некоторые тесты немного замедлились, в то время как другие ускорились почти в 2 раза!

Есть ли JIT-компилятор?Is there a JIT compiler?

Нет. Мы всё ещё изучаем другие оптимизации.

О проектеAbout

Проект Faster CPython изучает оптимизации для CPython. Основная команда финансируется Microsoft для полной занятости над проектом. Пабло Галиндо Сальгадо также получает финансирование от Bloomberg LP для работы над проектом неполный рабочий день. Наконец, многие участники являются волонтёрами из сообщества.

Изменения байткода CPythonCPython bytecode changes

Байткод теперь содержит встроенные записи кэша в виде недавно добавленных инструкций CACHE. Многие опкоды ожидают, что за ними следует точное количество записей кэша, и инструктируют интерпретатор пропускать их во время выполнения. Заполненные записи кэша могут выглядеть как произвольные инструкции, поэтому следует проявлять особую осторожность при чтении или изменении сырого адаптивного байткода, содержащего ускоренные данные.

Новые опкодыNew opcodes

  • ASYNC_GEN_WRAP, RETURN_GENERATOR и SEND, используемые в генераторах и корутинах.

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

  • JUMP_BACKWARD_NO_INTERRUPT, для использования в определённых циклах, где обработка прерываний нежелательна.

  • MAKE_CELL, для создания Cell Objects.

  • CHECK_EG_MATCH и PREP_RERAISE_STAR, для обработки новых групп исключений и except*, добавленных в PEP 654.

  • PUSH_EXC_INFO, для использования в обработчиках исключений.

  • RESUME, пустая операция (no-op), для внутреннего трассирования, отладки и проверок оптимизации.

Заменённые опкодыReplaced opcodes

Заменённый(ые) опкод(ы)

Новый(ые) опкод(ы)

Примечания

BINARY_*
INPLACE_*

BINARY_OP

Заменены все числовые бинарные/операции на месте одним опкодом

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

Разделяет сдвиг аргументов для методов и обработку именованных аргументов; позволяет лучше специализировать вызовы

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

Инструкции манипуляции стеком

JUMP_IF_NOT_EXC_MATCH

Теперь выполняет проверку, но не переходит

JUMP_ABSOLUTE
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

См. [3]; варианты TRUE, FALSE, NONE и NOT_NONE для каждого направления

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

Настройка блока with

Изменённые/удалённые опкодыChanged/removed opcodes

  • Изменены MATCH_CLASS и MATCH_KEYS: они больше не помещают дополнительное логическое значение для указания успеха/неудачи. Вместо этого при неудаче помещается None вместо кортежа извлечённых значений.

  • Изменены опкоды, работающие с исключениями, чтобы отразить их представление в виде одного элемента в стеке вместо трёх (см. gh-89874).

  • Удалены COPY_DICT_WITHOUT_KEYS, GEN_START, POP_BLOCK, SETUP_FINALLY и YIELD_FROM.

УстарелоDeprecated

В этом разделе перечислены API Python, объявленные устаревшими в Python 3.11.

Устаревшие C API перечислены отдельно.

Язык/Встроенные функцииLanguage/Builtins

  • Цепочка дескрипторов classmethod (введённая в bpo-19072) теперь устарела. Её больше нельзя использовать для оборачивания других дескрипторов, таких как property. Базовая архитектура этой возможности была ошибочной и вызвала ряд проблем в дальнейшем. Для «пропускания» classmethod рекомендуется использовать атрибут __wrapped__, добавленный в Python 3.10. (Автор: Raymond Hettinger, gh-89519.)

  • Восьмеричные управляющие последовательности в строковых и байтовых литералах со значениями больше 0o377 (255 в десятичной системе) теперь вызывают DeprecationWarning. В будущей версии Python они будут порождать SyntaxWarning и в конечном итоге SyntaxError. (Автор: Serhiy Storchaka в gh-81548.)

  • Делегирование int() в __trunc__() теперь устарело. Вызов int(a), когда type(a) реализует __trunc__(), но не __int__() или __index__(), теперь вызывает DeprecationWarning. (Автор: Zackery Spytz в bpo-44977.)

МодулиModules

  • PEP 594 привёл к объявлению устаревшими следующих модулей, которые планируется удалить в Python 3.13:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (Авторы: Brett Cannon в bpo-47061 и Victor Stinner в gh-68966.)

  • Модули asynchat, asyncore и smtpd устарели начиная как минимум с Python 3.6. Их документация и предупреждения об устаревании теперь обновлены, чтобы отметить, что они будут удалены в Python 3.12. (Автор: Hugo van Kemenade в bpo-47022.)

  • Пакет lib2to3 и инструмент 2to3 теперь устарели и могут не поддерживать синтаксис Python 3.10 и новее. Подробнее см. PEP 617, который вводит новый PEG-парсер. (Автор: Victor Stinner в bpo-40360.)

  • Модули без документации sre_compile, sre_constants и sre_parse теперь устарели. (Автор: Serhiy Storchaka в bpo-47152.)

Стандартная библиотекаStandard Library

  • Следующие элементы устарели в configparser начиная с Python 3.2. Теперь предупреждения об устаревании обновлены, чтобы указать, что они будут удалены в Python 3.12:

    • класс configparser.SafeConfigParser

    • свойство configparser.ParsingError.filename

    • метод configparser.RawConfigParser.readfp()

    (Автор: Hugo van Kemenade в bpo-45173.)

  • configparser.LegacyInterpolation устарел в строке документации начиная с Python 3.2 и не указан в документации configparser. Теперь он вызывает DeprecationWarning и будет удалён в Python 3.13. Вместо него используйте configparser.BasicInterpolation или configparser.ExtendedInterpolation. (Автор: Hugo van Kemenade в bpo-46607.)

  • Старый набор функций importlib.resources был объявлен устаревшим в пользу замен, добавленных в Python 3.9, и будет удалён в будущей версии Python из-за отсутствия поддержки ресурсов, находящихся в подкаталогах пакетов:

    • importlib.resources.contents()

    • importlib.resources.is_resource()

    • importlib.resources.open_binary()

    • importlib.resources.open_text()

    • importlib.resources.read_binary()

    • importlib.resources.read_text()

    • importlib.resources.path()

  • Функция locale.getdefaultlocale() устарела и будет удалена в Python 3.15. Используйте функции locale.setlocale(), locale.getpreferredencoding(False) и locale.getlocale(). (Автор: Victor Stinner в gh-90817.)

  • Функция locale.resetlocale() устарела и будет удалена в Python 3.13. Вместо неё используйте locale.setlocale(locale.LC_ALL, ""). (Автор: Victor Stinner в gh-90817.)

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

  • В модуле re функция re.template() и соответствующие флаги re.TEMPLATE и re.T устарели, поскольку они не были документированы и не имели очевидного назначения. Они будут удалены в Python 3.13. (Авторы: Serhiy Storchaka и Miro Hrončok в gh-92728.)

  • turtle.settiltangle() устарел начиная с Python 3.1; теперь он выдаёт предупреждение об устаревании и будет удалён в Python 3.13. Используйте вместо него turtle.tiltangle() (ранее он был ошибочно помечен как устаревший, и его строка документации теперь исправлена). (Автор: Hugo van Kemenade в bpo-45837.)

  • typing.Text, который существует исключительно для обеспечения совместимости между кодом Python 2 и Python 3, теперь устарел. Его удаление пока не планируется, но пользователям рекомендуется использовать str везде, где это возможно. (Автор: Alex Waygood в gh-92332.)

  • Синтаксис с именованными аргументами для создания типов typing.TypedDict теперь устарел. Поддержка будет удалена в Python 3.13. (Автор: Jingchen Ye в gh-90224.)

  • webbrowser.MacOSX устарел и будет удалён в Python 3.13. Он не тестируется, не документирован и не используется самим webbrowser. (Автор: Donghee Na в bpo-42255.)

  • Поведение, при котором из тестовых методов TestCase и IsolatedAsyncioTestCase возвращается значение (отличное от значения по умолчанию None), теперь устарело.

  • Объявлены устаревшими следующие неофициально документированные функции unittest, запланированные к удалению в Python 3.13:

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    Вместо этого используйте методы TestLoader:

    (Автор: Erlend E. Aasland в bpo-5846.)

  • unittest.TestProgram.usageExit() отмечен как устаревший, будет удалён в 3.13. (Автор: Carlos Damázio в gh-67048.)

Предстоящее удаление в Python 3.12Pending Removal in Python 3.12

Следующие Python API были объявлены устаревшими в более ранних версиях Python и будут удалены в Python 3.12.

API языка C, которые планируется удалить, перечислены отдельно.

  • Модуль asynchat

  • Модуль asyncore

  • Весь пакет distutils

  • Модуль imp

  • Пространство имён typing.io

  • Пространство имён typing.re

  • cgi.log()

  • importlib.find_loader()

  • importlib.abc.Loader.module_repr()

  • importlib.abc.MetaPathFinder.find_module()

  • importlib.abc.PathEntryFinder.find_loader()

  • importlib.abc.PathEntryFinder.find_module()

  • importlib.machinery.BuiltinImporter.find_module()

  • importlib.machinery.BuiltinLoader.module_repr()

  • importlib.machinery.FileFinder.find_loader()

  • importlib.machinery.FileFinder.find_module()

  • importlib.machinery.FrozenImporter.find_module()

  • importlib.machinery.FrozenLoader.module_repr()

  • importlib.machinery.PathFinder.find_module()

  • importlib.machinery.WindowsRegistryFinder.find_module()

  • importlib.util.module_for_loader()

  • importlib.util.set_loader_wrapper()

  • importlib.util.set_package_wrapper()

  • pkgutil.ImpImporter

  • pkgutil.ImpLoader

  • pathlib.Path.link_to()

  • sqlite3.enable_shared_cache()

  • sqlite3.OptimizedUnicode()

  • переменная окружения PYTHONTHREADDEBUG

  • Следующие устаревшие псевдонимы в unittest:

    Устаревший псевдоним

    Имя метода

    Устарело в

    failUnless

    assertTrue()

    3.1

    failIf

    assertFalse()

    3.1

    failUnlessEqual

    assertEqual()

    3.1

    failIfEqual

    assertNotEqual()

    3.1

    failUnlessAlmostEqual

    assertAlmostEqual()

    3.1

    failIfAlmostEqual

    assertNotAlmostEqual()

    3.1

    failUnlessRaises

    assertRaises()

    3.1

    assert_

    assertTrue()

    3.2

    assertEquals

    assertEqual()

    3.2

    assertNotEquals

    assertNotEqual()

    3.2

    assertAlmostEquals

    assertAlmostEqual()

    3.2

    assertNotAlmostEquals

    assertNotAlmostEqual()

    3.2

    assertRegexpMatches

    assertRegex()

    3.2

    assertRaisesRegexp

    assertRaisesRegex()

    3.2

    assertNotRegexpMatches

    assertNotRegex()

    3.5

УдаленоRemoved

В этом разделе перечислены API Python, которые были удалены в Python 3.11.

Удалённые C API перечислены отдельно.

  • Удалён @asyncio.coroutine() декоратор, обеспечивающий совместимость устаревших корутин на основе генераторов с кодом async / await. Эта функция считается устаревшей с Python 3.8, и удаление изначально планировалось на Python 3.10. Используйте async def вместо неё. (Автор: Illia Volochii в bpo-43216.)

  • Удалён asyncio.coroutines.CoroWrapper, использовавшийся для обёртывания устаревших корутинных объектов на основе генераторов в режиме отладки. (Автор: Illia Volochii в bpo-43216.)

  • Из-за серьёзных проблем безопасности параметр reuse_address функции asyncio.loop.create_datagram_endpoint(), отключённый в Python 3.9, теперь полностью удалён. Это связано с поведением опции сокета SO_REUSEADDR в UDP. (Автор: Hugo van Kemenade в bpo-45129.)

  • Удалён модуль binhex, считавшийся устаревшим в Python 3.9. Также удалены связанные с ним, также устаревшие, функции binascii:

    • binascii.a2b_hqx()

    • binascii.b2a_hqx()

    • binascii.rlecode_hqx()

    • binascii.rldecode_hqx()

    Функция binascii.crc_hqx() остаётся доступной.

    (Автор: Victor Stinner в bpo-45085.)

  • Удалена команда distutils bdist_msi, устаревшая в Python 3.9. Вместо неё используйте bdist_wheel (wheel-пакеты). (Автор: Hugo van Kemenade в bpo-45124.)

  • Удалены методы __getitem__() у xml.dom.pulldom.DOMEventStream, wsgiref.util.FileWrapper и fileinput.FileInput, объявленные устаревшими с Python 3.9. (Автор: Hugo van Kemenade в bpo-45132.)

  • Удалены устаревшие функции gettext: lgettext(), ldgettext(), lngettext() и ldngettext(). Также удалены функция bind_textdomain_codeset(), методы NullTranslations.output_charset() и NullTranslations.set_output_charset(), а также параметр codeset функций translation() и install(), поскольку они используются только для функций l*gettext(). (Авторы: Donghee Na и Serhiy Storchaka в bpo-44235.)

  • Удалено из модуля inspect:

    • Функция getargspec(), устаревшая с Python 3.0; используйте inspect.signature() или inspect.getfullargspec() вместо неё.

    • Функция formatargspec(), устаревшая с Python 3.5; используйте функцию inspect.signature() или непосредственно объект inspect.Signature.

    • Незадокументированные методы Signature.from_builtin() и Signature.from_function(), устаревшие с Python 3.5; вместо них используйте метод Signature.from_callable().

    (Автор: Hugo van Kemenade в bpo-45320.)

  • Удалён метод __class_getitem__() из pathlib.PurePath, поскольку он не использовался и был добавлен по ошибке в предыдущих версиях. (Автор: Nikita Sobolev в bpo-46483.)

  • Удалён класс MailmanProxy из модуля smtpd, так как он непригоден для использования без внешнего пакета mailman. (Автор: Donghee Na в bpo-35800.)

  • Удалён устаревший метод split() объекта _tkinter.TkappType. (Автор: Erlend E. Aasland в bpo-38371.)

  • Удалена поддержка пакетов пространства имён из обнаружения unittest. Она была введена в Python 3.4, но была неработоспособна начиная с Python 3.7. (Автор: Inada Naoki в bpo-23882.)

  • Удалён недокументированный приватный метод float.__set_format__(), ранее известный как float.__setformat__() в Python 3.7. Его докстринг гласил: «Вероятно, вам не следует использовать эту функцию. Она существует в основном для использования в тестовом наборе Python». (Автор: Victor Stinner в bpo-46852.)

  • Флаг конфигурации --experimental-isolated-subinterpreters (и соответствующий макрос EXPERIMENTAL_ISOLATED_SUBINTERPRETERS) были удалены.

  • Pynche – The Pythonically Natural Color and Hue Editor – был вынесен из Tools/scripts и развивается независимо от дерева исходных кодов Python.

Перенос на Python 3.11Porting to Python 3.11

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

Замечания по переносу для C API приведены отдельно.

  • open(), io.open(), codecs.open() и fileinput.FileInput больше не принимают 'U' («универсальный символ новой строки») в режиме файла. В Python 3 режим «универсального символа новой строки» используется по умолчанию при открытии файла в текстовом режиме, а флаг 'U' устарел начиная с Python 3.3. Параметр параметр newline этих функций управляет работой универсальных символов новой строки. (Автор: Victor Stinner в bpo-37330.)

  • Позиции узлов ast.AST теперь проверяются при передаче в compile() и другие связанные функции. Если обнаружены недопустимые позиции, будет вызвано исключение ValueError. (Автор: Pablo Galindo в gh-93351)

  • Запрещена передача исполнителей, не являющихся concurrent.futures.ThreadPoolExecutor, в asyncio.loop.set_default_executor() после объявления устаревшим в Python 3.8. (Автор: Illia Volochii в bpo-43234.)

  • calendar: классы calendar.LocaleTextCalendar и calendar.LocaleHTMLCalendar теперь используют locale.getlocale() вместо locale.getdefaultlocale(), если локаль не указана. (Автор: Victor Stinner в bpo-46659.)

  • Модуль pdb теперь читает конфигурационный файл .pdbrc с кодировкой 'UTF-8'. (Автор: Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) в bpo-41137.)

  • Параметр популяция функции random.sample() должен быть последовательностью, и автоматическое преобразование set в list больше не поддерживается. Кроме того, если размер выборки превышает размер популяции, вызывается исключение ValueError. (Автор: Raymond Hettinger в bpo-40465.)

  • Необязательный параметр random функции random.shuffle() был удалён. Ранее это была произвольная случайная функция для перемешивания; теперь всегда будет использоваться random.random() (её предыдущее значение по умолчанию).

  • В re Синтаксис регулярных выражений глобальные встроенные флаги (например, (?i)) теперь можно использовать только в начале регулярных выражений. Использование их в других местах объявлено устаревшим начиная с Python 3.6. (Автор: Serhiy Storchaka в bpo-47066.)

  • В модуле re были исправлены несколько давних ошибок, которые в редких случаях могли приводить к неверным результатам в захватываемых группах. Поэтому в этих случаях может измениться захваченный вывод. (Автор: Ma Lin в bpo-35859.)

Изменения в сборкеBuild Changes

  • В CPython теперь есть PEP 11 поддержка третьего уровня для кросс-компиляции на платформы WebAssembly Emscripten (wasm32-unknown-emscripten, т.е. Python в браузере) и WebAssembly System Interface (WASI) (wasm32-unknown-wasi). Эта работа вдохновлена предыдущими проектами, такими как Pyodide. Эти платформы предоставляют ограниченное подмножество POSIX API; возможности и модули стандартной библиотеки Python, связанные с сетью, процессами, потоками, сигналами, mmap, пользователями/группами, недоступны или не работают. (Emscripten: авторы Christian Heimes и Ethan Smith в gh-84461 и WASI: автор Christian Heimes в gh-90473; платформы повышены до уровня в gh-95085)

  • Для сборки CPython теперь требуется:

  • Макрос Py_NO_NAN был удалён. Поскольку CPython теперь требует IEEE 754 с плавающей запятой, значения NaN всегда доступны. (Автор: Victor Stinner в bpo-46656.)

  • Пакет tkinter теперь требует Tcl/Tk версии 8.5.12 или новее. (Автор: Serhiy Storchaka в bpo-46996.)

  • Зависимости сборки, флаги компилятора и флаги компоновщика для большинства модулей расширения стандартной библиотеки теперь определяются с помощью configure. Флаги для libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk и uuid определяются pkg-config (при наличии). Для tkinter теперь требуется команда pkg-config, чтобы определить настройки разработки для заголовков и библиотек Tcl/Tk. (Авторы: Christian Heimes и Erlend Egeberg Aasland в bpo-45847, bpo-45747 и bpo-45763.)

  • libpython больше не компонуется с libcrypt. (Автор: Mike Gilbert в bpo-45433.)

  • CPython теперь может быть собран с опцией ThinLTO путём передачи thin в --with-lto, т.е. --with-lto=thin. (Авторы: Donghee Na и Brett Holman в bpo-44340.)

  • Списки свободных блоков для структур объектов теперь можно отключить. Новая опция configure --without-freelists может использоваться для отключения всех списков свободных блоков, кроме синглтона пустого кортежа. (Автор: Christian Heimes в bpo-45522.)

  • Modules/Setup и Modules/makesetup были улучшены и доработаны. Модули расширения теперь можно собирать через makesetup. Все, кроме некоторых тестовых модулей, могут быть статически скомпонованы в основную программу или библиотеку. (Авторы: Brett Cannon и Christian Heimes в bpo-45548, bpo-45570, bpo-45571 и bpo-43974.)

    Примечание

    Используйте переменные окружения TCLTK_CFLAGS и TCLTK_LIBS для ручного указания расположения заголовков Tcl/Tk и библиотек. Опции configure --with-tcltk-includes и --with-tcltk-libs были удалены.

    В RHEL 7 и CentOS 7 пакеты разработки не предоставляют tcl.pc и tk.pc; используйте TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5". Каталог Misc/rhel7 содержит файлы .pc и инструкции о том, как собрать Python с Tcl/Tk и OpenSSL из RHEL 7 и CentOS 7.

  • CPython теперь будет использовать 30-битные цифры по умолчанию для реализации int Python. Ранее по умолчанию использовались 30-битные цифры на платформах с SIZEOF_VOID_P >= 8, и 15-битные цифры в остальных случаях. По-прежнему возможно явно запросить использование 15-битных цифр через опцию --enable-big-digits скрипта configure или (для Windows) переменную PYLONG_BITS_IN_DIGIT в PC/pyconfig.h, но эта опция может быть удалена в будущем. (Автор: Mark Dickinson в bpo-45569.)

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

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

Переход на Python 3.11Porting to Python 3.11

  • Некоторые макросы были преобразованы в статические встроенные функции, чтобы избежать проблем макросов. Изменение должно быть в основном незаметным для пользователей, поскольку функции-заменители приводят свои аргументы к ожидаемым типам, чтобы избежать предупреждений компилятора из-за статических проверок типов. Однако, когда ограниченный C API установлен на >=3.11, эти приведения не выполняются, и вызывающим сторонам потребуется приводить аргументы к ожидаемым типам. Подробнее см. PEP 670. (Авторы: Victor Stinner и Erlend E. Aasland в gh-89653.)

  • PyErr_SetExcInfo() больше не использует аргументы type и traceback, интерпретатор теперь получает эти значения из экземпляра исключения (аргумент value). Функция по-прежнему похищает ссылки всех трёх аргументов. (Автор: Irit Katriel в bpo-45711.)

  • PyErr_GetExcInfo() теперь получает поля type и traceback результата из экземпляра исключения (поле value). (Автор: Irit Katriel в bpo-45711.)

  • _frozen имеет новое поле is_package, указывающее, является ли замороженный модуль пакетом. Ранее отрицательное значение в поле size было индикатором. Теперь для size используются только неотрицательные значения. (Автор: Kumar Aditya в bpo-46608.)

  • _PyFrameEvalFunction() теперь принимает _PyInterpreterFrame* в качестве второго параметра вместо PyFrameObject*. Подробнее об использовании этого типа указателя на функцию см. в PEP 523.

  • PyCode_New() и PyCode_NewWithPosOnlyArgs() теперь принимают дополнительный аргумент exception_table. По возможности следует избегать использования этих функций. Чтобы получить пользовательский объект кода: создайте объект кода с помощью компилятора, затем получите изменённую версию методом replace.

  • PyCodeObject больше не имеет полей co_code, co_varnames, co_cellvars и co_freevars. Вместо этого используйте PyCode_GetCode(), PyCode_GetVarnames(), PyCode_GetCellvars() и PyCode_GetFreevars() соответственно для доступа к ним через C API. (Авторы: Brandt Bucher в bpo-46841 и Ken Jin в gh-92154 и gh-94936.)

  • Старые макросы trashcan (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 в той же кодовой базе можно определить следующие макросы и использовать их по всему коду (источник: эти макросы скопированы из кодовой базы mypy):

    #if PY_VERSION_HEX >= 0x03080000
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
    #else
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
    #endif
    
  • Функция PyType_Ready() теперь вызывает ошибку, если тип определён с установленным флагом Py_TPFLAGS_HAVE_GC, но не имеет функции обхода (PyTypeObject.tp_traverse). (Автор: Victor Stinner в bpo-44263.)

  • Heap-типы с флагом Py_TPFLAGS_IMMUTABLETYPE теперь могут наследовать протокол vectorcall PEP 590. Ранее это было возможно только для статических типов. (Автор: Erlend E. Aasland в bpo-43908)

  • Поскольку Py_TYPE() изменена на встроенную статическую функцию, Py_TYPE(obj) = new_type необходимо заменить на Py_SET_TYPE(obj, new_type): см. функцию Py_SET_TYPE() (доступна начиная с Python 3.9). Для обратной совместимости можно использовать этот макрос:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
    static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
    { ob->ob_type = type; }
    #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
    #endif
    

    (Автор: Victor Stinner в bpo-39573.)

  • Поскольку Py_SIZE() изменена на встроенную статическую функцию, Py_SIZE(obj) = new_size необходимо заменить на Py_SET_SIZE(obj, new_size): см. функцию Py_SET_SIZE() (доступна начиная с Python 3.9). Для обратной совместимости можно использовать этот макрос:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
    static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
    { ob->ob_size = size; }
    #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
    #endif
    

    (Автор: Victor Stinner в bpo-39573.)

  • <Python.h> больше не включает заголовочные файлы <stdlib.h>, <stdio.h>, <errno.h> и <string.h>, когда макрос Py_LIMITED_API установлен в 0x030b0000 (Python 3.11) или выше. Расширения C должны явно включать эти заголовочные файлы после #include <Python.h>. (Автор: Victor Stinner в bpo-45434.)

  • Файлы неограниченного API cellobject.h, classobject.h, code.h, context.h, funcobject.h, genobject.h и longintrepr.h были перемещены в каталог Include/cpython. Кроме того, заголовочный файл eval.h был удалён. Эти файлы не должны включаться напрямую, так как они уже включены в Python.h: Include Files. Если они включались напрямую, рассмотрите возможность включения Python.h вместо этого. (Автор: Victor Stinner в bpo-35134.)

  • Макрос PyUnicode_CHECK_INTERNED() был исключён из ограниченного C API. Он никогда не был там пригоден к использованию, потому что использовал внутренние структуры, недоступные в ограниченном C API. (Автор: Victor Stinner в bpo-46007.)

  • Следующие функции и тип для работы с фреймами теперь доступны напрямую через #include <Python.h>, больше не нужно добавлять #include <frameobject.h>:

    (Автор: Victor Stinner в gh-93937.)

  • Элементы структуры PyFrameObject были удалены из публичного C API.

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

    В Python 3.11 структура кадра была реорганизована для оптимизации производительности. Некоторые поля были полностью удалены, так как они были деталями старой реализации.

    Поля PyFrameObject:

    • f_back: используйте PyFrame_GetBack().

    • f_blockstack: удалено.

    • f_builtins: используйте PyFrame_GetBuiltins().

    • f_code: используйте PyFrame_GetCode().

    • f_gen: используйте PyFrame_GetGenerator().

    • f_globals: используйте PyFrame_GetGlobals().

    • f_iblock: удалено.

    • f_lasti: используйте PyFrame_GetLasti(). Код, использующий f_lasti с PyCode_Addr2Line(), должен использовать PyFrame_GetLineNumber() вместо этого; это может быть быстрее.

    • f_lineno: используйте PyFrame_GetLineNumber()

    • f_locals: используйте PyFrame_GetLocals().

    • f_stackdepth: удалено.

    • f_state: нет публичного API (переименовано в f_frame.f_state).

    • f_trace: нет публичного API.

    • f_trace_lines: используйте PyObject_GetAttrString((PyObject*)frame, "f_trace_lines").

    • f_trace_opcodes: используйте PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes").

    • f_localsplus: нет публичного API (переименовано в f_frame.localsplus).

    • f_valuestack: удалено.

    Объект кадра Python теперь создаётся лениво. Побочный эффект: к элементу f_back нельзя обращаться напрямую, так как его значение теперь также вычисляется лениво. Вместо этого необходимо вызывать функцию PyFrame_GetBack().

    Отладчики, которые обращались к f_locals напрямую, должны вызывать PyFrame_GetLocals() вместо этого. Им больше не нужно вызывать PyFrame_FastToLocalsWithError() или PyFrame_LocalsToFast(), более того, не следует вызывать эти функции. Необходимое обновление кадра теперь управляется виртуальной машиной.

    Код, определяющий PyFrame_GetCode() в Python 3.8 и старше:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
    {
        Py_INCREF(frame->f_code);
        return frame->f_code;
    }
    #endif
    

    Код, определяющий PyFrame_GetBack() в Python 3.8 и старше:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
    {
        Py_XINCREF(frame->f_back);
        return frame->f_back;
    }
    #endif
    

    Или используйте проект pythoncapi_compat, чтобы получить эти две функции в старых версиях Python.

  • Изменения элементов структуры PyThreadState:

    Код, определяющий PyThreadState_GetFrame() в Python 3.8 и старше:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
    {
        Py_XINCREF(tstate->frame);
        return tstate->frame;
    }
    #endif
    

    Код, определяющий PyThreadState_EnterTracing() и PyThreadState_LeaveTracing() в Python 3.10 и старше:

    #if PY_VERSION_HEX < 0x030B00A2
    static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
    {
        tstate->tracing++;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = 0;
    #else
        tstate->use_tracing = 0;
    #endif
    }
    
    static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
    {
        int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
        tstate->tracing--;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = use_tracing;
    #else
        tstate->use_tracing = use_tracing;
    #endif
    }
    #endif
    

    Или используйте проект pythoncapi-compat, чтобы получить эти функции в старых версиях Python.

  • Распространителям рекомендуется собирать Python с оптимизированной библиотекой Blake2 libb2.

  • Теперь для инициализации с использованием PyConfig.module_search_paths для инициализации sys.path поле PyConfig.module_search_paths_set должно быть установлено в 1. В противном случае инициализация пересчитает путь и заменит любые значения, добавленные в module_search_paths.

  • PyConfig_Read() больше не вычисляет начальный путь поиска и не будет заполнять значения в PyConfig.module_search_paths. Чтобы вычислить пути по умолчанию и затем изменить их, завершите инициализацию и используйте PySys_GetObject() для получения sys.path в виде объекта списка Python и измените его напрямую.

УстарелоDeprecated

  • Объявить устаревшими следующие функции для настройки инициализации Python:

    • PySys_AddWarnOptionUnicode()

    • PySys_AddWarnOption()

    • PySys_AddXOption()

    • PySys_HasWarnOptions()

    • PySys_SetArgvEx()

    • PySys_SetArgv()

    • PySys_SetPath()

    • Py_SetPath()

    • Py_SetProgramName()

    • Py_SetPythonHome()

    • Py_SetStandardStreamEncoding()

    • _Py_SetProgramFullPath()

    Используйте новый API PyConfig из конфигурации инициализации Python вместо этого (PEP 587). (Автор: Victor Stinner в gh-88279.)

  • Устарел элемент ob_shash из PyBytesObject. Вместо него используйте PyObject_Hash(). (Автор: Inada Naoki в bpo-46864.)

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

Следующие C API были объявлены устаревшими в предыдущих версиях Python и будут удалены в Python 3.12.

  • PyUnicode_AS_DATA()

  • PyUnicode_AS_UNICODE()

  • PyUnicode_AsUnicodeAndSize()

  • PyUnicode_AsUnicode()

  • PyUnicode_FromUnicode()

  • PyUnicode_GET_DATA_SIZE()

  • PyUnicode_GET_SIZE()

  • PyUnicode_GetSize()

  • PyUnicode_IS_COMPACT()

  • PyUnicode_IS_READY()

  • PyUnicode_READY()

  • PyUnicode_WSTR_LENGTH()

  • _PyUnicode_AsUnicode()

  • PyUnicode_WCHAR_KIND

  • PyUnicodeObject

  • PyUnicode_InternImmortal()

УдаленоRemoved

  • PyFrame_BlockSetup() и PyFrame_BlockPop() были удалены. (Автор: Mark Shannon в bpo-40222.)

  • Удалите следующие математические макросы, использующие переменную errno:

    • Py_ADJUST_ERANGE1()

    • Py_ADJUST_ERANGE2()

    • Py_OVERFLOWED()

    • Py_SET_ERANGE_IF_OVERFLOW()

    • Py_SET_ERRNO_ON_MATH_ERROR()

    (Автор: Victor Stinner в bpo-45412.)

  • Удалите макросы Py_UNICODE_COPY() и Py_UNICODE_FILL(), устаревшие начиная с Python 3.3. Вместо них используйте PyUnicode_CopyCharacters() или memcpy() (строку wchar_t*) и функции PyUnicode_Fill(). (Автор: Victor Stinner в bpo-41123.)

  • Удалите заголовочный файл pystrhex.h. Он содержит только внутренние функции. Расширения C должны включать только главный заголовочный файл <Python.h>. (Автор: Victor Stinner в bpo-45434.)

  • Удалите макрос Py_FORCE_DOUBLE(). Он использовался макросом Py_IS_INFINITY(). (Автор: Victor Stinner в bpo-45440.)

  • Следующие элементы больше не доступны, когда определён Py_LIMITED_API:

    Они не являются частью ограниченного API.

    (Автор: Victor Stinner в bpo-45474.)

  • Исключите PyWeakref_GET_OBJECT() из ограниченного C API. Он никогда не работал, поскольку структура PyWeakReference является непрозрачной в ограниченном C API. (Автор: Victor Stinner в bpo-35134.)

  • Удалите макрос PyHeapType_GET_MEMBERS(). Он был по ошибке включён в публичный C API, этот макрос должен использоваться только внутри Python. Вместо него используйте элемент PyTypeObject.tp_members. (Автор: Victor Stinner в bpo-40170.)

  • Удалите макрос HAVE_PY_SET_53BIT_PRECISION (перенесён во внутренний C API). (Автор: Victor Stinner в bpo-45412.)

  • Удалите API кодировщиков Py_UNICODE, так как они устарели начиная с Python 3.3, редко используются и неэффективны по сравнению с рекомендуемыми альтернативами.

    Удалённые функции:

    • PyUnicode_Encode()

    • PyUnicode_EncodeASCII()

    • PyUnicode_EncodeLatin1()

    • PyUnicode_EncodeUTF7()

    • PyUnicode_EncodeUTF8()

    • PyUnicode_EncodeUTF16()

    • PyUnicode_EncodeUTF32()

    • PyUnicode_EncodeUnicodeEscape()

    • PyUnicode_EncodeRawUnicodeEscape()

    • PyUnicode_EncodeCharmap()

    • PyUnicode_TranslateCharmap()

    • PyUnicode_EncodeDecimal()

    • PyUnicode_TransformDecimalToASCII()

    Подробнее см. PEP 624 и руководство по миграции. (Автор: Inada Naoki в bpo-44029.)

Заметные изменения в 3.11.4Notable changes in 3.11.4

tarfile

  • Методы извлечения в tarfile и shutil.unpack_archive() получили новый аргумент filter, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. Extraction filters. В Python 3.12 использование без аргумента filter вызовет DeprecationWarning. В Python 3.14 значение по умолчанию будет изменено на 'data'. (Автор: Petr Viktorin в PEP 706.)

Заметные изменения в 3.11.5Notable changes in 3.11.5

OpenSSL

  • Сборки для Windows и установщики для macOS с python.org теперь используют OpenSSL 3.0.