Что нового в Python 3.11

Редактор:

Пабло Галиндо Сальгадо

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

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

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

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

Новые встроенные функции:

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

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

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

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

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

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

PEP 657: Тонкое определение местоположения ошибок в трассировках

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

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

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

Более подробную информацию см. в PEP 657. (Внесено Пабло Галиндо, Батуханом Таская и Аммаром Аскаром в bpo-43950).

Примечание

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

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

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

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

(Внесено Ирит Катриэль в bpo-45292. PEP написан Ирит Катриэль, Юрием Селивановым и Гвидо ван Россумом).

PEP 678: Исключения могут быть дополнены примечаниями

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

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

(Внесено Ирит Катриэль в bpo-45607. PEP написан Заком Хэтфилд-Доддсом).

Улучшения пусковой установки Windows py.exe

Копия Python Launcher для Windows, поставляемая с 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.

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

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

  • Выражения распаковки со звездочками теперь можно использовать в операторах for. (Более подробную информацию см. в разделе bpo-46725).

  • Асинхронные comprehensions теперь разрешены внутри постижений в asynchronous functions. Внешние постижения неявно становятся асинхронными в этом случае. (Внесено Сергеем Сторчакой в bpo-33346).

  • Теперь вместо AttributeError в утверждениях with и contextlib.ExitStack.enter_context() для объектов, не поддерживающих протокол context manager, и в утверждениях async with и contextlib.AsyncExitStack.enter_async_context() для объектов, не поддерживающих протокол asynchronous context manager, выводится TypeError. (Внесено Сергеем Сторчакой в bpo-12022 и bpo-44471).

  • Добавлен object.__getstate__(), который обеспечивает реализацию метода __getstate__() по умолчанию. copying и pickleing экземпляров подклассов встроенных типов bytearray, set, frozenset, collections.OrderedDict, collections.deque, weakref.WeakSet и datetime.tzinfo теперь копируют и отбирают атрибуты экземпляра, реализованные как slots. Это изменение имеет непреднамеренный побочный эффект: оно сбивает с толку небольшое меньшинство существующих проектов Python, не ожидающих существования object.__getstate__(). См. последующие комментарии к gh-70766 для обсуждения того, какие обходные пути могут понадобиться такому коду. (Внесено Сергеем Сторчакой в bpo-26579).

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

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

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

Другие изменения в реализации CPython

  • Специальные методы __complex__() для complex и __bytes__() для bytes реализованы для поддержки протоколов typing.SupportsComplex и typing.SupportsBytes. (Внесено Марком Дикинсоном и Донгхи На в bpo-24234).

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

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

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

  • Новый command line option, AppendPath, был добавлен для программы установки Windows. Он ведет себя аналогично PrependPath, но вместо префиксации добавляет каталоги install и scripts. (Внесено Бастианом Нойбургером в bpo-44934).

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

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

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

Новые модули

  • tomllib: Для разбора TOML. Подробнее см. в PEP 680. (Внесено Танели Хуккинен в bpo-40059).

  • wsgiref.types: WSGI-специфические типы для статической проверки типов. (Внесено Себастьяном Риттау в bpo-42012).

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

asyncio

  • Добавлен класс TaskGroup, содержащий группу задач asynchronous context manager, которая будет ждать их всех при выходе. Для нового кода это рекомендуется вместо прямого использования create_task() и gather(). (Внесено Юрием Селивановым и другими в gh-90908).

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

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

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

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

  • Добавлен метод asyncio.StreamWriter.start_tls() для обновления существующих потоковых соединений до TLS. (Внесено Яном Гудом в bpo-34975).

  • В цикл событий добавлены функции сокетов сырых дейтаграмм: sock_sendto(), sock_recvfrom() и sock_recvfrom_into(). Они имеют реализации в SelectorEventLoop и ProactorEventLoop. (Внесено Алексом Грёнхольмом в bpo-46805).

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

contextlib

  • Добавлен непараллельно безопасный менеджер контекста chdir() для изменения текущего рабочего каталога и его восстановления при выходе. Простая обёртка для chdir(). (Внесено Филипе Лайнсом в bpo-25625)

классы данных

  • Измените проверку на изменяемость по умолчанию поля, разрешив использовать только те значения по умолчанию, которые равны hashable, вместо любого объекта, не являющегося экземпляром dict, list или set. (Внесено Эриком В. Смитом в bpo-44674).

datetime

enum

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

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

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

  • Изменено значение Enum.__format__() (по умолчанию для перечислений format(), str.format() и f-string), чтобы оно всегда давало тот же результат, что и 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.

фракции

  • Поддержка PEP 515-стиля инициализации Fraction из строки. (Внесено Сергеем Кирпичевым в bpo-44258).

  • Fraction теперь реализует метод __int__, так что проверка isinstance(some_fraction, typing.SupportsInt) пройдена. (Внесено Марком Дикинсоном в 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)
    ...
    

    (Предоставлено Юрием Карабасом в bpo-46014).

hashlib

  • hashlib.blake2b() и hashlib.blake2s() теперь предпочитают libb2, а не продажную копию Python. (Внесено Кристианом Хаймсом в bpo-47095).

  • Внутренний модуль _sha3 с алгоритмами SHA3 и SHAKE теперь использует tiny_sha3 вместо Keccak Code Package для уменьшения размера кода и двоичных файлов. Модуль hashlib предпочитает оптимизированные реализации SHA3 и SHAKE от OpenSSL. Это изменение затрагивает только установки без поддержки OpenSSL. (Внесено Кристианом Хаймсом в bpo-47098).

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

IDLE и idlelib

  • Применяйте подсветку синтаксиса к файлам .pyi. (Внесено Алексом Уэйгудом и Терри Джен Риди в bpo-45447).

  • Включение подсказок при сохранении Shell с входами и выходами. (Внесено Терри Яном Риди в gh-95191).

осмотреть

  • Добавьте getmembers_static(), чтобы возвращать все члены без динамического поиска по протоколу дескриптора. (Внесено Вейпенгом Хонгом в bpo-30533).

  • Добавьте ismethodwrapper() для проверки, является ли тип объекта MethodWrapperType. (Внесено Хаканом Челиком в bpo-29418).

  • Измените функции, связанные с фреймами, в модуле inspect, чтобы они возвращали новые экземпляры классов FrameInfo и Traceback (обратно совместимые с предыдущими named tuple-подобными интерфейсами), которые включают расширенную информацию о позиции PEP 657 (номер конечной строки, столбец и конечный столбец). К затронутым функциям относятся:

    (Предоставлено Пабло Галиндо в gh-88116).

локаль

  • Добавьте locale.getencoding(), чтобы получить текущую кодировку локали. Это аналогично locale.getpreferredencoding(False), но игнорирует Python UTF-8 Mode.

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

  • Добавлена функция getLevelNamesMapping() для возврата отображения имен уровней логирования (например, 'CRITICAL') на значения соответствующих им Уровни ведения журнала (например, 50, по умолчанию). (Внесено Андреем Кулаковиным в gh-88024).

  • В SysLogHandler добавлен метод createSocket(), чтобы соответствовать SocketHandler.createSocket(). Он вызывается автоматически при инициализации обработчика и при выдаче события, если нет активного сокета. (Внесено Кириллом Пинчуком в gh-88457).

математика

  • Добавьте math.exp2(): верните 2, возведенное в степень x. (Внесено Гидеоном Митчеллом в bpo-45917).

  • Добавьте math.cbrt(): верните кубический корень из x. (Внесено Аджитом Рамачандраном в bpo-44357).

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

  • Значение math.nan теперь всегда доступно. (Внесено Виктором Стиннером в bpo-46917).

оператор

  • Была добавлена новая функция operator.call, такая, что operator.call(obj, *args, **kwargs) == obj(*args, **kwargs). (Внесено Антони Ли в bpo-44019).

os

  • В Windows для os.urandom() теперь используется BCryptGenRandom(), а не CryptGenRandom(), который устарел. (Внесено Донгхи На в bpo-44611).

pathlib

  • glob() и rglob() возвращают только каталоги, если шаблон заканчивается разделителем компонентов имени пути: sep или altsep. (Внесено Эйсуке Кавасимой в bpo-22276 и bpo-33392).

re

  • Атомарная группировка ((?>...)) и притяжательные квантификаторы (*+, ++, ?+, {m,n}+) теперь поддерживаются в регулярных выражениях. (Внесено Джеффри К. Джейкобсом и Сергеем Сторчакой в bpo-433030).

ШУТИЛ

  • Добавьте необязательный параметр dir_fd в shutil.rmtree(). (Внесено Сергеем Сторчакой в bpo-46245).

сокет

  • Добавьте поддержку CAN Socket для NetBSD. (Внесено Томасом Клауснером в bpo-30512).

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

sqlite3

  • Теперь вы можете отключить авторизатор, передав None в set_authorizer(). (Внесено Эрлендом Э. Аасланом в bpo-44491).

  • Имя колляции create_collation() теперь может содержать любой символ Unicode. Имена колляции с недопустимыми символами теперь поднимают UnicodeEncodeError вместо sqlite3.ProgrammingError. (Внесено Эрлендом Э. Аасланом в bpo-44688).

  • Исключения sqlite3 теперь включают расширенный код ошибки SQLite как sqlite_errorcode и имя ошибки SQLite как sqlite_errorname. (Вклад Авива Паливоды, Даниэля Шахафа и Эрленда Э. Аасланда в bpo-16379 и bpo-24139).

  • Добавьте setlimit() и getlimit() в sqlite3.Connection для установки и получения ограничений SQLite на основе соединения. (Внесено Эрлендом Э. Аасланом в bpo-45243).

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

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

  • Выборка через откат больше не приводит к появлению InterfaceError. Вместо этого мы предоставляем библиотеке SQLite самой решать эти проблемы. (Внесено Эрлендом Э. Аасланом в bpo-44092).

  • Добавьте serialize() и deserialize() в sqlite3.Connection для сериализации и десериализации баз данных. (Внесено Эрлендом Э. Аасланом в bpo-41930).

  • Добавьте create_window_function() к sqlite3.Connection для создания агрегатных оконных функций. (Внесено Эрлендом Э. Аасланом в bpo-34916).

  • Добавьте blobopen() к sqlite3.Connection. sqlite3.Blob позволяет выполнять инкрементные операции ввода-вывода для блобов. (Внесено Авивом Паливодой и Эрлендом Э. Аасланд в bpo-24905).

строка

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

sys

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

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

  • Добавьте флаг sys.flags.safe_path. (Внесено Виктором Стиннером в gh-57684).

sysconfig

  • Были добавлены три новых installation schemes (posix_venv, nt_venv и venv), которые используются, когда Python создает новые виртуальные среды или когда он запускается из виртуальной среды. Первые две схемы (posix_venv и nt_venv) специфичны для ОС не-Windows и Windows, а venv, по сути, является псевдонимом одной из них в зависимости от ОС, на которой работает Python. Это полезно для последующих распространителей, которые модифицируют sysconfig.get_preferred_scheme(). Сторонний код, создающий новые виртуальные среды, должен использовать новую схему установки venv для определения путей, как и venv. (Внесено Миро Хрончоком в bpo-45413).

tempfile

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

нарезка резьбы

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

время

  • На Unix функция time.sleep() теперь использует функцию clock_nanosleep() или nanosleep(), если она доступна, которая имеет разрешение 1 наносекунда (10-9 секунд), а не select(), которая имеет разрешение 1 микросекунда (10-6 секунд). (Внесено Бенджамином Сзоке и Виктором Стиннером в bpo-21302).

  • В Windows 8.1 и более новых версиях time.sleep() теперь использует таймер ожидания, основанный на high-resolution timers, который имеет разрешение 100 наносекунд (10-7 секунд). Ранее разрешение составляло 1 миллисекунду (10-3 секунд). (При участии Бенджамина Сёке, Донгхи На, Эрика Суна и Виктора Стиннера в bpo-21302 и bpo-45429).

tkinter

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

traceback

набор текста

Основные изменения см. в разделе Новые возможности, связанные с подсказками типа.

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

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

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

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

  • Типы NamedTuple теперь могут быть общими. (Внесено Сергеем Сторчакой в 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 теперь сохраняется. (Внесено Адрианом Гарсией Бадараско в gh-88970).

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

  • Ослабьте требования времени выполнения для аннотаций типов, убрав проверку на вызываемость в частной функции typing._type_check. (Внесено Грегори Борегаром в gh-90802).

  • typing.get_type_hints() теперь поддерживает оценку строк как прямых ссылок в PEP 585 generic aliases. (Внесено Никласом Розенштейном в gh-85542).

  • typing.get_type_hints() больше не добавляет Optional к параметрам с None по умолчанию. (Внесено Никитой Соболевым в gh-90353).

  • typing.get_type_hints() теперь поддерживает оценку голых строковых аннотаций ClassVar. (Внесено Грегори Борегаром в gh-90711).

  • typing.no_type_check() больше не модифицирует внешние классы и функции. Также теперь он корректно помечает класс-методы как не подлежащие проверке типа (Внесено Никитой Соболевым в gh-90729).

unicodedata

  • База данных Unicode была обновлена до версии 14.0.0. (Внесено Бенджамином Петерсоном в bpo-45190).

unittest

venv

  • Когда создаются новые виртуальные среды Python, для определения путей внутри среды используется параметр venv sysconfig installation scheme. Когда Python запускается в виртуальной среде, та же схема установки используется по умолчанию. Это означает, что нижестоящие разработчики могут изменить схему установки sysconfig по умолчанию без изменения поведения виртуальных окружений. Код сторонних разработчиков, который также создает новые виртуальные среды, должен поступать аналогичным образом. (Внесено Миро Хрончоком в bpo-45413).

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

  • warnings.catch_warnings() теперь принимает аргументы для warnings.simplefilter(), предоставляя более лаконичный способ локально игнорировать предупреждения или преобразовывать их в ошибки. (Внесено Заком Хэтфилдом-Доддсом в bpo-47074).

zip-файл

  • Добавлена поддержка указания кодировки имени члена для чтения метаданных в каталоге ZipFile и заголовков файлов. (Внесено Стивеном Дж. Тернбуллом и Сергеем Сторчакой в bpo-28080).

  • Добавлена функция ZipFile.mkdir() для создания новых каталогов внутри ZIP-архивов. (Внесено Сэмом Эзехом в gh-49083).

  • Добавьте stem, suffix и suffixes в zipfile.Path. (Внесено Мигелем Брито в gh-88261).

Оптимизации

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

  • Теперь компилятор оптимизирует простые printf-style % formatting на строковых литералах, содержащих только коды формата %s, %r и %a, и делает их такими же быстрыми, как и соответствующее выражение f-string. (Внесено Сергеем Сторчакой в bpo-28307).

  • Целочисленное деление (//) лучше настроено на оптимизацию компиляторами. Теперь оно примерно на 20 % быстрее на x86-64 при делении int на значение, меньшее 2**30. (Вклад Грегори П. Смита и Тима Питерса в gh-90564).

  • sum() теперь почти на 30% быстрее для целых чисел, меньших, чем 2**30. (Внесено Стефаном Бехнелем в gh-68264).

  • Изменение размеров списков оптимизировано для обычных случаев, ускоряя list.append() на ≈15%, а простые list comprehensionна 20-30% (Внесено Деннисом Суини в gh-91165).

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

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

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

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

  • unicodedata.normalize() теперь нормализует строки pure-ASCII за постоянное время. (Вклад Донгхи На в bpo-44987).

Более быстрый CPython

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

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

Ускоренный запуск

Замороженный импорт / Статические объекты кода

Python кэширует bytecode в директории __pycache__, чтобы ускорить загрузку модулей.

Раньше, в версии 3.10, выполнение модуля Python выглядело следующим образом:

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

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

Statically allocated code object -> Evaluate

В Python 3.11 запуск интерпретатора стал на 10-15% быстрее. Это имеет большое значение для короткодействующих программ, использующих Python.

(Вклад Эрика Сноу, Гвидо ван Россума и Кумара Адитьи во многие выпуски).

Ускоренное время выполнения

Более дешевые, ленивые рамы Python

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

  • Оптимизация процесса создания рамок.

  • Избегайте выделения памяти, щедро используя пространство фреймов в стеке C.

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

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

(Внесено Марком Шенноном в bpo-44590).

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

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

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

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

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

PEP 659: Специализация адаптивного переводчика

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

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

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

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

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

Операция

Форма

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

Ускорение работы (до)

Автор(ы)

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

x + x

x - x

x * x

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

10%

Марк Шеннон, Донгхи На, Брандт Бучер, Деннис Суини

Подпись

a[i]

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

Пользовательские подписи __getitem__() также инлайнятся, как и Встраиваемые вызовы функций Python.

10-25%

Ирит Катриэль, Марк Шеннон

Хранить подстрочный индекс

a[i] = z

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

10-25%

Деннис Суини

Звонки

f(arg)

C(arg)

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

20%

Марк Шеннон, Кен Джин

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

print

len

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

[1]

Марк Шеннон

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

o.attr

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

[2]

Марк Шеннон

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

o.meth()

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

10-20%

Кен Джин, Марк Шеннон

Атрибут магазина

o.attr = z

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

2% в производительности

Марк Шеннон

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

*seq

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

8%

Брандт Бухер

Misc

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

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

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

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

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

Как написать код, чтобы использовать эти ускорения?

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

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

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

Я не вижу никакого ускорения в своей рабочей нагрузке. Почему?

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

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

Существует ли JIT-компилятор?

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

О сайте

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

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

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

Новые опкоды

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

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

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

  • MAKE_CELL, чтобы создать Объекты ячеек.

  • CHECK_EG_MATCH и PREP_RERAISE_STAR, чтобы обрабатывать new exception groups and except*, добавленные в PEP 654.

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

  • RESUME, нет, для внутренней трассировки, отладки и проверки оптимизации.

Замененные опкоды

Замененный операционный код(ы)

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

Примечания

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 настройка блока

Измененные/удаленные опкоды

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

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

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

Утратившие актуальность

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

Устаревшие API на языке C обозначаются listed separately.

Язык/встроенные модули

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

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

  • Делегирование int() на __trunc__() теперь устарело. Вызов int(a), когда type(a) реализует __trunc__(), но не __int__() или __index__(), теперь вызывает ошибку DeprecationWarning. (Внесено Закери Спитцем в bpo-44977).

Модули

  • PEP 594 привёл к депривации следующих модулей, запланированных к удалению в Python 3.13:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (При участии Бретта Кэннона из bpo-47061 и Виктора Стиннера из gh-68966).

  • Модули asynchat, asyncore и smtpd были устаревшими, по крайней мере, с Python 3.6. Теперь их документация и предупреждения об устаревании обновлены, чтобы отметить, что они будут удалены в Python 3.12. (Внесено Хьюго ван Кеменаде в bpo-47022).

  • Пакет lib2to3 и инструмент 2to3 теперь устарели и могут не разбирать Python 3.10 или более новые версии. Подробности смотрите в PEP 617, представляющем новый парсер PEG. (Внесено Виктором Стиннером в bpo-40360).

  • Недокументированные модули sre_compile, sre_constants и sre_parse теперь являются устаревшими. (Внесено Сергеем Сторчакой в bpo-47152).

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

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

    • класс configparser.SafeConfigParser

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

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

    (Предоставлено Хьюго ван Кеменаде в bpo-45173).

  • configparser.LegacyInterpolation был устаревшим в документах начиная с Python 3.2 и не указан в документации по configparser. Теперь он выдает DeprecationWarning и будет удален в Python 3.13. Вместо него используйте configparser.BasicInterpolation или configparser.ExtendedInterpolation. (Внесено Хьюго ван Кеменаде в 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(). (Внесено Виктором Стиннером в gh-90817).

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

  • Для числовых ссылок на группы и имен групп в regular expressions теперь будут применяться более строгие правила. Теперь в качестве числовой ссылки будут приниматься только последовательности ASCII-цифр, а имя группы в шаблонах bytes и строках замены может содержать только ASCII-буквы, цифры и символы подчеркивания. На данный момент синтаксис, нарушающий эти правила, предупреждается об обесценивании. (Внесено Сергеем Сторчакой в gh-91760).

  • В модуле re функция re.template() и соответствующие флаги re.TEMPLATE и re.T являются устаревшими, поскольку они были недокументированы и не имели очевидного назначения. Они будут удалены в Python 3.13. (Внесено Сергеем Сторчакой и Миро Хрончоком в gh-92728).

  • turtle.settiltangle() был устаревшим с Python 3.1; теперь он выдает предупреждение об устаревании и будет удален в Python 3.13. Вместо него используйте turtle.tiltangle() (ранее он был ошибочно помечен как устаревший, и его docstring теперь исправлена). (Внесено Хьюго ван Кеменаде в bpo-45837).

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

  • Синтаксис аргумента ключевого слова для построения типов typing.TypedDict теперь устарел. Его поддержка будет удалена в Python 3.13. (Внесено Jingchen Ye в gh-90224).

  • webbrowser.MacOSX является устаревшим и будет удален в Python 3.13. Он не проверен, не документирован и не используется самим webbrowser. (Внесено Донгхи На в bpo-42255).

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

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

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

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

    (Предоставлено Эрлендом Э. Аасланом в bpo-5846).

  • unittest.TestProgram.usageExit() помечен как устаревший и будет удален в версии 3.13. (Внесено Карлосом Дамазио в gh-67048).

Отложенное удаление в Python 3.12

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

API на языке C, ожидающие удаления, обозначены listed separately.

  • Модуль asynchat

  • Модуль asyncore

  • На entire distutils package

  • Модуль 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

Удалено

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

Удаленные API на языке C - это listed separately.

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

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

  • Из-за серьезных проблем с безопасностью параметр reuse_address asyncio.loop.create_datagram_endpoint(), отключенный в Python 3.9, теперь полностью удален. Это связано с поведением параметра сокета SO_REUSEADDR в UDP. (Внесено Хьюго ван Кеменаде в bpo-45129).

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

    • binascii.a2b_hqx()

    • binascii.b2a_hqx()

    • binascii.rlecode_hqx()

    • binascii.rldecode_hqx()

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

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

  • Удалена команда distutils bdist_msi, устаревшая в Python 3.9. Вместо нее используйте bdist_wheel (wheel packages). (Внесено Хьюго ван Кеменаде в bpo-45124).

  • Удалены методы __getitem__() из xml.dom.pulldom.DOMEventStream, wsgiref.util.FileWrapper и fileinput.FileInput, устаревшие с Python 3.9. (Внесено Хьюго ван Кеменаде в bpo-45132).

  • Удалены устаревшие функции gettext lgettext(), ldgettext(), lngettext() и ldngettext(). Также удалены функция bind_textdomain_codeset(), методы NullTranslations.output_charset() и NullTranslations.set_output_charset(), а также параметр codeset из translation() и install(), поскольку они используются только для функций l*gettext(). (Внесено Донгхи На и Сергеем Сторчакой в 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().

    (Предоставлено Хьюго ван Кеменаде в bpo-45320).

  • Удален метод __class_getitem__() из pathlib.PurePath, так как в предыдущих версиях он не использовался и был добавлен по ошибке. (Внесено Никитой Соболевым в bpo-46483).

  • Удален класс MailmanProxy в модуле smtpd, поскольку он непригоден для использования без внешнего пакета mailman. (Внесено Донгхи На в bpo-35800).

  • Удален устаревший метод split() из _tkinter.TkappType. (Внесен Эрлендом Э. Аасланом в bpo-38371).

  • Удалена поддержка пакетов пространств имен из открытия unittest. Она была введена в Python 3.4, но была нарушена с Python 3.7. (Внесено Инадой Наоки в bpo-23882).

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

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

  • Pynche — Редактор цветов и оттенков Pythonically Natural — был перемещен из Tools/scripts и находится в being developed independently из дерева исходных текстов Python.

Переход на Python 3.11

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

Примечания по портированию API на C: listed separately.

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

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

  • Запрещена передача не:class:concurrent.futures.ThreadPoolExecutor исполнителей в asyncio.loop.set_default_executor() после исправления в Python 3.8. (Внесено Иллией Волохиным в bpo-43234).

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

  • Модуль pdb теперь читает файл конфигурации .pdbrc в кодировке 'UTF-8'. (Внесено Шринивасом Редди Тхатипарти (శ్రీనివాస్ రెడ్డి తాటిపర్తి) в bpo-41137).

  • Параметр популяция в random.sample() должен быть последовательностью, и автоматическое преобразование sets в lists больше не поддерживается. Кроме того, если размер выборки больше размера популяции, возникает ошибка ValueError. (Внесено Раймондом Хеттингером в bpo-40465).

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

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

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

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

  • Теперь CPython имеет PEP 11 Tier 3 support для кросс-компиляции на WebAssembly платформы Emscripten (wasm32-unknown-emscripten, т.е. Python в браузере) и WebAssembly System Interface (WASI) (wasm32-unknown-wasi). Эти усилия вдохновлены предыдущими работами, такими как Pyodide. Эти платформы предоставляют ограниченное подмножество POSIX API; функции и модули стандартных библиотек Python, связанные с сетями, процессами, потоками, сигналами, mmap и пользователями/группами, недоступны или не работают. (Emscripten предоставлен Кристианом Хаймсом и Итаном Смитом в gh-84461, WASI предоставлен Кристианом Хаймсом в gh-90473; платформы продвигаются в gh-95085)

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

    • Компилятор и стандартная библиотека C11 Optional C11 features не требуются. (Внесено Виктором Стиннером в bpo-46656, bpo-45440 и bpo-46640).

    • Поддержка чисел с плавающей запятой IEEE 754. (Внесено Виктором Стиннером в bpo-46917).

  • Макрос Py_NO_NAN был удален. Поскольку CPython теперь требует плавающих чисел IEEE 754, значения NaN всегда доступны. (Внесено Виктором Стиннером в bpo-46656).

  • Для работы пакета tkinter теперь требуется Tcl/Tk версии 8.5.12 или новее. (Внесено Сергеем Сторчакой в bpo-46996).

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

  • libpython больше не связан с libcrypt. (Внесено Майком Гилбертом в bpo-45433).

  • Теперь CPython можно собирать с опцией ThinLTO, передавая thin в --with-lto, то есть --with-lto=thin. (Внесено Донгхи На и Бреттом Холманом в bpo-44340).

  • Фрилисты для объектных структур теперь могут быть отключены. Новая опция configure --without-freelists может быть использована для отключения всех фрилистов, кроме пустого синглтона кортежа. (Внесено Кристианом Хаймсом в bpo-45522).

  • Modules/Setup и Modules/makesetup были улучшены и связаны. Модули расширения теперь можно собирать через makesetup. Все модули, кроме некоторых тестовых, могут быть статически подключены к основному бинарному файлу или библиотеке. (Вклад Бретта Кэннона и Кристиана Хаймса в 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-битные цифры по умолчанию для реализации Python int. Ранее по умолчанию использовались 30-битные цифры на платформах с SIZEOF_VOID_P >= 8, и 15-битные в противном случае. По-прежнему можно явно запросить использование 15-битных цифр с помощью опции --enable-big-digits в скрипте configure или (для Windows) переменной PYLONG_BITS_IN_DIGIT в PC/pyconfig.h, но в будущем эта опция может быть удалена. (Внесено Марком Дикинсоном в bpo-45569).

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

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

Переход на Python 3.11

  • Некоторые макросы были преобразованы в статические инлайн-функции, чтобы избежать macro pitfalls. Это изменение должно быть в основном прозрачным для пользователей, поскольку заменяющие функции будут приводить свои аргументы к ожидаемым типам, чтобы избежать предупреждений компилятора из-за статических проверок типов. Однако, если ограниченный C API установлен в значение >=3.11, эти приведения не выполняются, и вызывающие функции должны будут приводить аргументы к ожидаемым типам. Более подробную информацию см. в PEP 670. (Внесено Виктором Стиннером и Эрлендом Э. Аасланд в gh-89653).

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

  • PyErr_GetExcInfo() теперь выводит поля type и traceback результата из экземпляра исключения (поле value). (Внесено Ирит Катриэль в bpo-45711).

  • В _frozen появилось новое поле is_package, указывающее, является ли замороженный модуль пакетом. Ранее индикатором служило отрицательное значение в поле size. Теперь в поле size могут использоваться только неотрицательные значения. (Внесено Кумаром Адитьей в 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. (Вклад Брандта Бухера в bpo-46841 и Кена Джина в gh-92154 и gh-94936).

  • Старые макросы мусорной корзины (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, но не имеет функции traverse (PyTypeObject.tp_traverse). (Внесено Виктором Стиннером в bpo-44263).

  • Типы кучи с флагом Py_TPFLAGS_IMMUTABLETYPE теперь могут наследовать протокол векторных вызовов PEP 590. Ранее это было возможно только для static types. (Внесено Эрлендом Э. Аасланом в 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
    

    (Внесено Виктором Стиннером в 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
    

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

  • <Python.h> больше не включает заголовочные файлы <stdlib.h>, <stdio.h>, <errno.h> и <string.h>, если макрос Py_LIMITED_API имеет значение 0x030b0000 (Python 3.11) или выше. Расширения на Си должны явно включать заголовочные файлы после #include <Python.h>. (Внесено Виктором Стиннером в 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. (Внесено Виктором Стиннером в bpo-35134).

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

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

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

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

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

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

    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 project, чтобы получить эти две функции в старых версиях Python.

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

    • frame: удалено, используйте PyThreadState_GetFrame() (функция добавлена в Python 3.9 с помощью bpo-40429). Предупреждение: функция возвращает strong reference, необходимо вызвать Py_XDECREF().

    • tracing: изменено, используйте PyThreadState_EnterTracing() и PyThreadState_LeaveTracing() (функции, добавленные в Python 3.11 с помощью bpo-43760).

    • recursion_depth: удалено, вместо него используйте (tstate->recursion_limit - tstate->recursion_remaining).

    • stackcheck_counter: удалено.

    Код, определяющий 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
    

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

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

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

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

Утратившие актуальность

  • Утрачиваем следующие функции для настройки инициализации 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()

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

  • Устраните член ob_shash из PyBytesObject. Вместо него используйте PyObject_Hash(). (Внесено Инадой Наоки в bpo-46864).

Отложенное удаление в Python 3.12

Следующие API на языке C были устаревшими в предыдущих версиях 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()

Удалено

  • PyFrame_BlockSetup() и PyFrame_BlockPop() были удалены. (Внесено Марком Шенноном в bpo-40222).

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

    • Py_ADJUST_ERANGE1()

    • Py_ADJUST_ERANGE2()

    • Py_OVERFLOWED()

    • Py_SET_ERANGE_IF_OVERFLOW()

    • Py_SET_ERRNO_ON_MATH_ERROR()

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

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

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

  • Удалите макрос Py_FORCE_DOUBLE(). Он был использован макросом Py_IS_INFINITY(). (Внесено Виктором Стиннером в bpo-45440).

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

    Они не являются частью limited API.

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

  • Исключите PyWeakref_GET_OBJECT() из ограниченного C API. Это никогда не работало, поскольку структура PyWeakReference непрозрачна в ограниченном API C. (Внесено Виктором Стиннером в bpo-35134).

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

  • Удалите макрос HAVE_PY_SET_53BIT_PRECISION (перенесен во внутренний C API). (Внесено Виктором Стиннером в 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 и migration guidance. (Внесено Инада Наоки в bpo-44029).

Заметные изменения в версии 3.11.4

tarfile

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

Заметные изменения в версии 3.11.5

OpenSSL

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