Что нового в 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 657: Тонкое определение местоположения ошибок в трассировках
Новые опции командной строки
-P
и переменная окруженияPYTHONSAFEPATH
для disable automatically prepending potentially unsafe paths -sys.path
Новые возможности набора текста:
Важные изъятия, удаления и ограничения:
Новые возможности¶
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 с местоположением исходного кода. Эту информацию можно получить с помощью:
Метод
codeobject.co_positions()
в Python.Функция
PyCode_Addr2Location()
в API языка C.
Более подробную информацию см. в 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__()
по умолчанию.copy
ing иpickle
ing экземпляров подклассов встроенных типов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 цифр в строковой форме.
Новые модули¶
Улучшенные модули¶
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¶
классы данных¶
datetime¶
Добавьте
datetime.UTC
, удобный псевдоним дляdatetime.timezone.utc
. (Внесено Кабиром Кватрой в gh-91973).datetime.date.fromisoformat()
,datetime.time.fromisoformat()
иdatetime.datetime.fromisoformat()
теперь можно использовать для разбора большинства форматов ISO 8601 (за исключением только тех, которые поддерживают дробные часы и минуты). (Внесено Полом Ганслом в gh-80010).
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
.
фракции¶
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¶
осмотреть¶
Добавьте
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¶
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¶
Добавьте
traceback.StackSummary.format_frame_summary()
, чтобы позволить пользователям изменять, какие кадры будут отображаться в обратном выводе, и как они будут отформатированы. (Внесено Аммаром Аскаром в bpo-44569).Добавьте
traceback.TracebackException.print()
, который печатает отформатированный экземплярTracebackException
в файл. (Внесено Ирит Катриэль в bpo-33809).
набор текста¶
Основные изменения см. в разделе Новые возможности, связанные с подсказками типа.
Добавьте
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¶
Добавлены методы
enterContext()
иenterClassContext()
классаTestCase
, методenterAsyncContext()
классаIsolatedAsyncioTestCase
и функцияunittest.enterModuleContext()
. (Внесено Сергеем Сторчакой в bpo-45046).
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. Реализация - Марк Шеннон и Брандт Бухер, с дополнительной помощью Ирит Катриэль и Денниса Суини).
Операция |
Форма |
Специализация |
Ускорение работы (до) |
Автор(ы) |
---|---|---|---|---|
Бинарные операции |
|
Двоичные сложение, умножение и вычитание для таких распространенных типов, как |
10% |
Марк Шеннон, Донгхи На, Брандт Бучер, Деннис Суини |
Подпись |
|
Подчиненные типы контейнеров, такие как Пользовательские подписи |
10-25% |
Ирит Катриэль, Марк Шеннон |
Хранить подстрочный индекс |
|
Аналогично специализации подписей выше. |
10-25% |
Деннис Суини |
Звонки |
|
Вызовы обычных встроенных (C) функций и типов, таких как |
20% |
Марк Шеннон, Кен Джин |
Загрузка глобальной переменной |
|
Индекс объекта в пространстве имен globals/builtins кэшируется. Загрузка глобальных и встроенных объектов требует нулевого поиска в пространстве имен. |
Марк Шеннон |
|
Атрибут загрузки |
|
Аналогично загрузке глобальных переменных. Индекс атрибута в пространстве имен класса/объекта кэшируется. В большинстве случаев загрузка атрибутов не требует поиска в пространстве имен. |
Марк Шеннон |
|
Загрузка методов для вызова |
|
Фактический адрес метода кэшируется. Загрузка метода теперь не требует поиска пространства имен - даже для классов с длинными цепочками наследования. |
10-20% |
Кен Джин, Марк Шеннон |
Атрибут магазина |
|
Аналогично оптимизации атрибутов нагрузки. |
2% в производительности |
Марк Шеннон |
Последовательность распаковки |
|
Специализирован для обычных контейнеров, таких как |
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_* |
Замените все числовые двоичные/вместо опкоды одним опкодом |
|
CALL_FUNCTION CALL_FUNCTION_KW CALL_METHOD |
Отделяет передачу аргументов для методов от обработки аргументов ключевых слов; позволяет лучше специализировать вызовы |
|
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 |
См. [3]; варианты |
|
SETUP_WITH SETUP_ASYNC_WITH |
|
Все опкоды перехода теперь относительные, включая существующие JUMP_IF_TRUE_OR_POP
и JUMP_IF_FALSE_OR_POP
. Аргументом теперь является смещение от текущей инструкции, а не абсолютное местоположение.
Измененные/удаленные опкоды¶
Изменены
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
Модуль
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
3.1
failIf
3.1
failUnlessEqual
3.1
failIfEqual
3.1
failUnlessAlmostEqual
3.1
failIfAlmostEqual
3.1
failUnlessRaises
3.1
assert_
3.2
assertEquals
3.2
assertNotEquals
3.2
assertAlmostEquals
3.2
assertNotAlmostEquals
3.2
assertRegexpMatches
3.2
assertRaisesRegexp
3.2
assertNotRegexpMatches
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()
должен быть последовательностью, и автоматическое преобразованиеset
s вlist
s больше не поддерживается. Кроме того, если размер выборки больше размера популяции, возникает ошибка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 теперь требуется:
Макрос
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¶
Новые возможности¶
Добавьте новую функцию
PyType_GetName()
для получения короткого имени типа. (Внесено Хай Ши в bpo-42035).Добавьте новую функцию
PyType_GetQualName()
для получения квалифицированного имени типа. (Внесено Хай Ши в bpo-42035).Добавьте новые функции
PyThreadState_EnterTracing()
иPyThreadState_LeaveTracing()
в ограниченный C API для приостановки и возобновления трассировки и профилирования. (Внесено Виктором Стиннером в bpo-43760).Добавлена константа
Py_Version
, имеющая то же значение, что иPY_VERSION_HEX
. (Внесено Габриэле Н. Торнетта в bpo-43931).Py_buffer
и API теперь являются частью ограниченного API и стабильного ABI:Слоты типа
bf_getbuffer
иbf_releasebuffer
(Внесено Кристианом Хаймсом в bpo-45459).
Добавлена функция
PyType_GetModuleByDef()
, используемая для получения модуля, в котором был определен метод, в случаях, когда эта информация недоступна напрямую (черезPyCMethod
). (Внесено Петром Викториным в bpo-46613).Добавьте новые функции для упаковки и распаковки C double (сериализации и десериализации):
PyFloat_Pack2()
,PyFloat_Pack4()
,PyFloat_Pack8()
,PyFloat_Unpack2()
,PyFloat_Unpack4()
иPyFloat_Unpack8()
. (Внесено Виктором Стиннером в bpo-46906).Добавьте новые функции для получения атрибутов объектов кадра:
PyFrame_GetBuiltins()
,PyFrame_GetGenerator()
,PyFrame_GetGlobals()
,PyFrame_GetLasti()
.Добавлены две новые функции для получения и установки активного экземпляра исключения:
PyErr_GetHandledException()
иPyErr_SetHandledException()
. Они являются альтернативойPyErr_SetExcInfo()
иPyErr_GetExcInfo()
, которые работают с унаследованным представлением исключений в виде 3 кортежей. (Внесено Ирит Катриэль в bpo-46343).Добавлен участник
PyConfig.safe_path
. (Внесен Виктором Стиннером в gh-57684).
Переход на 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_WSTR_LENGTH()
_PyUnicode_AsUnicode()
PyUnicode_WCHAR_KIND
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
:макрос
Py_MARSHAL_VERSION
Они не являются частью 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.