Что нового в 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
Кроме того, информация, используемая расширенной функцией обратной трассировки, доступна через общий API, который можно использовать для сопоставления bytecode instructions с местоположением исходного кода. Эту информацию можно получить с помощью:
Метод
codeobject.co_positions()в Python.Функция
PyCode_Addr2Location()в C API.
Смотрите PEP 657 для получения более подробной информации. (Материалы предоставлены Пабло Галиндо, Батуханом Таскайей и Аммаром Аскаром в bpo-43950.)
Примечание
Эта функция требует сохранения позиций столбцов в Объекты кода, что может привести к небольшому увеличению использования памяти интерпретатора и диска для скомпилированных файлов Python. Чтобы избежать сохранения дополнительной информации и отключить печать дополнительной информации обратной трассировки, используйте параметр командной строки -X no_debug_ranges или переменную среды PYTHONNODEBUGRANGES.
PEP 654: Группы исключений и except*¶
PEP 654 представлены языковые возможности, которые позволяют программе создавать и обрабатывать несколько несвязанных исключений одновременно. Встроенные типы ExceptionGroup и BaseExceptionGroup позволяют группировать исключения и создавать их вместе, а новый синтаксис except* обобщает except, чтобы соответствовать подгруппам групп исключений.
Смотрите PEP 654 для получения более подробной информации.
(Автор: Ирит Катриэль в bpo-45292. Подбадривающий текст написан Ирит Катриэль, Юрием Селивановым и Гвидо ван Россумом.)
PEP 678: Исключения могут быть дополнены примечаниями¶
Метод add_note() добавлен в BaseException. Его можно использовать для обогащения исключений контекстной информацией, которая недоступна в момент возникновения исключения. Добавленные примечания отображаются в обратной трассировке по умолчанию.
Смотрите PEP 678 для получения более подробной информации.
(Автор: Ирит Катриэль в bpo-45607. ОБОДРЯЮЩИЙ текст написан Заком Хэтфилдом-Доддсом.)
Улучшения в программе запуска Windows py.exe¶
Копия Программа запуска Python для Windows, входящая в состав Python 3.11, была значительно обновлена. Теперь он поддерживает синтаксис компании / тега, определенный в PEP 514, используя аргумент -V:<company>/<tag> вместо ограниченного аргумента -<major>.<minor>. Это позволяет запускать дистрибутивы, отличные от PythonCore, которые размещены на python.org.
При использовании селекторов -V: компания или тег могут быть опущены, но поиск будет производиться по всем установкам. Например, -V:OtherPython/ выберет «лучший» тег, зарегистрированный для OtherPython, в то время как -V:3.11 или -V:/3.11 выберет «лучший» дистрибутив с тегом 3.11.
При использовании устаревшего -<major>, -<major>.<minor>, -<major>-<bitness> или -<major>.<minor>-<bitness> аргументов, все существующее поведение должно быть сохранено из прошлых версий, и будут доступны только версии из PythonCore выбран. Однако суффикс -64 теперь означает «не 32-разрядный» (не обязательно x86-64), поскольку существует множество поддерживаемых 64-разрядных платформ. 32-разрядные среды выполнения определяются путем проверки тега среды выполнения на наличие суффикса -32. Все версии Python, начиная с версии 3.5, включали его в свои 32-разрядные сборки.
Другие языковые изменения¶
Запущенная распаковка выражений теперь может использоваться в операторах
for. (Более подробную информацию смотрите в разделе bpo-46725).Асинхронные comprehensions теперь разрешены для внутренних приложений в asynchronous functions. В этом случае внешние приложения неявно становятся асинхронными. (Добавлено Сергеем Сторчакой в bpo-33346.)
Значение
TypeErrorтеперь вызывается вместо значенияAttributeErrorв операторахwithиcontextlib.ExitStack.enter_context()для объектов, которые не поддерживают протокол context manager, а также вasync withинструкции иcontextlib.AsyncExitStack.enter_async_context()для объектов, не поддерживающих протокол asynchronous context manager. (Автор - Сергей Сторчака в bpo-12022 и bpo-44471.)Добавлен
object.__getstate__(), который обеспечивает реализацию метода__getstate__()по умолчанию.copyиpickle`в экземплярах подклассов встроенных типов. :class:`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. Это гарантирует, чтоimportполучает доступ только к stdlib и установленным модулям, и позволяет избежать непреднамеренного или злонамеренного дублирования модулей с модулями, находящимися в локальном (и, как правило, доступном для записи пользователем) каталоге. (Автор: Виктор Стиннер в 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.)Для установщика Windows добавлен новый command line option,
AppendPath,. Он работает аналогично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. (Автор: Эрик Араужо в bpo-46142.)Преобразование между
intиstrв основаниях, отличных от 2 (двоичных), 4, 8 (восьмеричных), 16 (шестнадцатеричных) или 32, таких как основание 10 (десятичных), теперь приводит к появлениюValueError, если число количество цифр в виде строки превышает допустимый предел, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за сложности алгоритма. Это ограничение для CVE-2020-10735. Это ограничение можно настроить или отключить с помощью переменной среды, флага командной строки илиsysAPI. Смотрите документацию по integer string conversion length limitation. Ограничение по умолчанию составляет 4300 цифр в виде строки.
Новые модули¶
Улучшенные модули¶
асинхронный¶
Добавлен класс
TaskGroup, содержащий asynchronous context manager, который содержит группу задач, которые будут ожидать выполнения всех из них при завершении. Для нового кода рекомендуется использовать это вместо прямого использованияcreate_task()иgather(). (Подготовлено Юрием Селивановым и другими авторами в gh-90908.)Добавлен
timeout(), асинхронный контекстный менеджер для установки таймаута для асинхронных операций. Для нового кода рекомендуется использовать это вместо прямого использованияwait_for(). (Добавлено Андреем Светловым в gh-90927).Добавлен класс
Runner, который отображает оборудование, используемоеrun(). (Добавлено Андреем Светловым в gh-91218.)Добавлен класс
Barrierк примитивам синхронизации в библиотеке asyncio и связанное с ним исключениеBrokenBarrierError. (Авторы Ив Дюпра и Андрей Светлов в статье gh-87518).Добавлен аргумент ключевого слова all_errors в
asyncio.loop.create_connection(), так что множественные ошибки подключения могут быть вызваны какExceptionGroup.Добавлен метод
asyncio.StreamWriter.start_tls()для обновления существующих потоковых подключений до TLS. (Автор Иэн Гуд в bpo-34975).Добавлены функции сокета исходных дейтаграмм в цикл обработки событий:
sock_sendto(),sock_recvfrom()иsock_recvfrom_into(). Они реализованы вSelectorEventLoopиProactorEventLoop. (Автор: Алекс Гренхольм в статье bpo-46805.)Добавлены методы
cancelling()иuncancel()вTask. Они в первую очередь предназначены для внутреннего использования, в частности,TaskGroup.
контекстная библиотека¶
классы данных¶
дата и время¶
Добавьте
datetime.UTC, удобный псевдоним дляdatetime.timezone.utc. (Добавлено Кабиром Кватрой в gh-91973.)datetime.date.fromisoformat(),datetime.time.fromisoformat()иdatetime.datetime.fromisoformat()теперь можно использовать для анализа большинства форматов ISO 8601 (за исключением только тех, которые поддерживают дробные часы и минуты). (Автор: Пол Ганссл в статье gh-80010.)
перечисление¶
Переименован
EnumMetaвEnumType(EnumMetaсохранен в качестве псевдонима).Добавлен
StrEnumс элементами, которые могут использоваться как (и должны быть) строки.Добавлен
ReprEnum, который изменяет только__repr__()элементов, возвращая их буквальные значения (а не имена) для__str__()и__format__()(используетсяstr(),format()и f-string).Изменено значение
Enum.__format__()(по умолчанию дляformat(),str.format()и f-strings), чтобы оно всегда приводило к тому же результату, что иEnum.__str__(): для перечислений, наследуемых отReprEnumэто будет значение элемента; для всех остальных перечислений это будет перечисление и имя элемента (например,Color.RED).Добавлен новый параметр boundary class в перечисления
Flagи в перечислениеFlagBoundaryс его параметрами, чтобы управлять обработкой значений флага, выходящих за пределы диапазона.Добавлены
verify()декоратор перечислений иEnumCheckenum с его параметрами, чтобы проверить классы перечислений на соответствие нескольким конкретным ограничениям.Добавлены декораторы
member()иnonmember(), чтобы гарантировать, что оформленный объект преобразуется /не преобразуется в элемент перечисления.Добавлен
property()декоратор, который работает какproperty(), за исключением перечислений. Используйте это вместоtypes.DynamicClassAttribute().Добавлен
global_enum()enum decorator, который настраивает__repr__()и__str__()так, чтобы значения отображались как члены их модуля, а не как класс enum. Например,'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.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.)
gzip-файл¶
Функция
gzip.compress()теперь работает быстрее при использовании с аргументом mtime=0, поскольку она полностью делегирует сжатие одной операцииzlib.compress(). У этого изменения есть один побочный эффект: заголовок файла gzip содержит байт «OS» в своем заголовке. Традиционно для него всегда устанавливалось значение 255, представляющее «неизвестный», с помощью модуляgzip. Теперь, при использованииcompress()с mtime=0, для него может быть установлено другое значение в соответствии с базовой библиотекой zlib C, с которой был связан Python. (Подробнее о побочном эффекте см. в gh-112346.)
хэшлиб¶
hashlib.blake2b()иhashlib.blake2s()теперь предпочитают libb2, а не разработанную на Python копию. (Автор Кристиан Хеймс в bpo-47095.)Внутренний модуль
_sha3с алгоритмами SHA3 и SHAKE теперь использует tiny_sha3 вместо Keccak Code Package для уменьшения размера кода и двоичных файлов. Модульhashlibпредпочитает оптимизированные реализации SHA 3 и SHAKE из OpenSSL. Изменение затрагивает только установки без поддержки OpenSSL. (Автор: Кристиан Хеймс в bpo-47098).Добавьте
hashlib.file_digest(), вспомогательную функцию для эффективного хэширования файлов или файлоподобных объектов. (Добавлено Кристианом Хеймсом в gh-89313.)
ХОЛОСТОЙ ход и idlelib¶
проверить¶
Добавьте
getmembers_static(), чтобы вернуть все элементы без запуска динамического поиска по протоколу дескриптора. ((Добавлено Weipeng Hong в 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.)Добавлен метод
createSocket()вSysLogHandler, чтобы соответствовать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.)
ос¶
В Windows
os.urandom()теперь используетBCryptGenRandom()вместоCryptGenRandom(), который устарел. (Добавлено Донхи На в bpo-44611.)Начиная с 3.11.10,
os.mkdir()иos.makedirs()в Windows теперь поддерживают передачу значения mode, равного0o700, для применения контроля доступа к новому каталогу. Это неявно влияет наtempfile.mkdtemp()и является смягчающим фактором для CVE-2024-4030. Другие значения для mode по-прежнему игнорируются. (Добавлено Стивом Дауэром в gh-118486.)
файл пути¶
ре¶
Атомарная группировка (
(?>...)) и притяжательные кванторы (*+,++,?+,{m,n}+) теперь поддерживаются в регулярных выражениях. (Материалы предоставлены Джеффри Джейкобсом и Сергеем Сторчакой в bpo-433030.)
выключил¶
Добавьте необязательный параметр dir_fd в
shutil.rmtree(). (Добавлено Сергеем Сторчакой в bpo-46245.)
разъем¶
Добавлена поддержка сокетов CAN для NetBSD. (Добавлено Томасом Клаузнером в bpo-30512.)
в
create_connection()есть возможность в случае сбоя подключения вызватьExceptionGroup, содержащий все ошибки, вместо того, чтобы вызывать только последнюю ошибку. (Добавлено Ирит Катриэль в bpo-29980.)
sqlite3¶
Теперь вы можете отключить авторизатор, передав
Noneвset_authorizer(). (Добавлено Эрлендом Э. Аасландом в bpo-44491.)Имя параметра сортировки
create_collation()не может содержать символов Юникода. Имена параметров сортировки, содержащие недопустимые символы, теперь содержат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.)
системная настройка¶
Были добавлены три новых installation schemes (posix_venv, nt_venv и venv), которые используются, когда Python создает новые виртуальные среды или когда он запускается из виртуальной среды. Первые две схемы (posix_venv и nt_venv) специфичны для ОС, отличных от Windows, и для Windows Windows, venv по сути является псевдонимом для одной из них в зависимости от операционной системы, на которой работает Python. Это полезно для последующих распространителей, которые модифицируют
sysconfig.get_preferred_scheme(). Сторонний код, создающий новые виртуальные среды, должен использовать новую схему установки venv для определения путей, как это делаетvenv. (Автор: Миро Хрончок в bpo-45413.)
временный файл¶
SpooledTemporaryFileобъекты теперь полностью реализуют методыio.BufferedIOBaseилиio.TextIOBase(в зависимости от режима работы с файлами). Это позволяет им корректно работать с API, которые ожидают объекты, подобные файлам, такие как модули сжатия. (Автор: Кэри Меткалф в gh-70363.)Начиная с 3.11.10 в Windows, режим по умолчанию
0o700, используемыйtempfile.mkdtemp(), теперь ограничивает доступ к новому каталогу из-за изменений вos.mkdir(). Это смягчение последствий CVE-2024-4030. (Автор: Стив Дауэр в статье gh-118486).
нарезание резьбы¶
В 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.)
ткинтер¶
Добавлен метод
info_patchlevel(), который возвращает точную версию библиотеки Tcl в виде именованного кортежа, аналогичногоsys.version_info. (Добавлено Сергеем Сторчакой в gh-91827.)
обратная связь¶
Добавьте
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типы теперь могут быть универсальными. (Добавлено Самодией Абейсиривардане в gh-89026.)NamedTupleтипы теперь могут быть универсальными. (Добавлено Сергеем Сторчакой в bpo-43923.)Разрешить создание подклассов для
typing.Any. Это полезно для предотвращения ошибок проверки типов, связанных с высокодинамичными классами, такими как mocks. (Автор Шантану Джайн в gh-91154).Декоратор
typing.final()теперь устанавливает атрибут__final__для оформляемого объекта. (Добавлено Джелле Зейлстрой в gh-90500.)Функция
typing.get_overloads()может использоваться для анализа перегрузок функции.typing.clear_overloads()может использоваться для очистки всех зарегистрированных перегрузок функции. (Автор: Джелле Зейлстра в статье 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.)
данные в юникоде¶
База данных Unicode обновлена до версии 14.0.0. (Добавлено Бенджамином Питерсоном в bpo-45190).
единичный тест¶
Добавлены методы
enterContext()иenterClassContext()из классаTestCase, методenterAsyncContext()из классаIsolatedAsyncioTestCaseи функцияunittest.enterModuleContext(). (Автор - Сергей Сторчака в bpo-45046.)
венв¶
Когда создаются новые виртуальные среды Python, для определения путей внутри среды используется venv sysconfig installation scheme. Когда Python запускается в виртуальной среде, по умолчанию используется та же схема установки. Это означает, что последующие распространители могут изменять схему установки sysconfig по умолчанию без изменения поведения виртуальных сред. Сторонний код, который также создает новые виртуальные среды, должен делать то же самое. (Автор: Миро Хрончок в bpo-45413).
предупреждения¶
warnings.catch_warnings()теперь принимает аргументы дляwarnings.simplefilter(), предоставляя более лаконичный способ локального игнорирования предупреждений или преобразования их в ошибки. (Добавлено Заком Хэтфилдом-Доддсом в bpo-47074.)
почтовый файл¶
Добавлена поддержка указания кодировки имени пользователя для чтения метаданных в каталоге
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.)Целочисленное деление (
//) лучше оптимизировано компиляторами. Теперь на x86-64 оно выполняется примерно на 20% быстрее при делении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"))на 64-разрядных платформах уменьшается с 352 байт до 272 байт (на 23% меньше). (Автор - Инада Наоки в bpo-46845.)Использование
asyncio.DatagramProtocolтеперь на несколько порядков ускоряет передачу больших файлов по протоколу UDP, при этом скорость более чем в 100 раз выше для файла размером ≈60 МБ. (Добавлено msoxzw в gh-91487.)mathфункцииcomb()иperm()теперь работают в ≈10 раз быстрее для больших аргументов (с большим ускорением для больших k). (Автор - Сергей Сторчака в bpo-37295.)Функции
statisticsmean(),variance()иstdev()теперь используют итераторы за один проход, а не преобразуют их сначала вlist. Это в два раза быстрее и позволяет существенно сэкономить память. (Автор - Раймонд Хеттингер в статье gh-90415).unicodedata.normalize()теперь нормализует строки в формате 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 значительно ускорились. Мы зафиксировали увеличение производительности py на 3-7%.
(Автор: Марк Шеннон в bpo-44590.)
Онлайн-вызовы функций Python¶
Во время вызова функции Python Python вызовет вычисляющую функцию C для интерпретации кода этой функции. Это эффективно ограничивает рекурсию в чистом виде в Python тем, что безопасно для стека C.
В версии 3.11, когда CPython обнаруживает код Python, вызывающий другую функцию Python, он создает новый фрейм и «переходит» к новому коду внутри нового фрейма. Это позволяет полностью избежать вызова функции интерпретации C.
Большинство вызовов функций Python теперь не занимают места в стеке C, что ускоряет их выполнение. В простых рекурсивных функциях, таких как fibonacci или factorial, мы наблюдали ускорение в 1,7 раза. Это также означает, что рекурсивные функции могут выполнять рекурсию значительно глубже (если пользователь увеличит предел рекурсии с помощью sys.setrecursionlimit()). Мы измерили улучшение производительности pyper на 1-3%.
(Материалы предоставлены Пабло Галиндо и Марком Шенноном в bpo-45256.)
PEP 659: Специализированный адаптивный переводчик¶
PEP 659 является одной из ключевых частей проекта Faster CPython. Общая идея заключается в том, что, хотя Python является динамическим языком, в большинстве областей кода объекты и типы меняются редко. Эта концепция известна как «стабильность типов».
Во время выполнения Python попытается найти общие шаблоны и стабильность типов в исполняемом коде. Затем Python заменит текущую операцию на более специализированную. В этой специализированной операции используются быстрые пути, доступные только для тех вариантов использования/типов, которые в целом превосходят свои универсальные аналоги. Это также привносит еще одну концепцию, называемую «встроенное кэширование», при которой Python кэширует результаты дорогостоящих операций непосредственно в bytecode.
Специализированная программа также объединит некоторые общие пары команд в одну суперинструкцию, что сократит накладные расходы при выполнении.
Python будет специализироваться только тогда, когда он видит «горячий» код (выполняемый несколько раз). Это не позволяет Python тратить время на однократный запуск кода. Python также может отказаться от специализации, когда код слишком динамичен или когда меняется его использование. Периодически предпринимаются попытки специализации, и попытки специализации обходятся не слишком дорого, что позволяет специализации адаптироваться к новым обстоятельствам.
(Руководство написано Марком Шенноном, а идеи вдохновлены Стефаном Брунталером. Дополнительную информацию смотрите в разделе PEP 659. Реализация осуществлена Марком Шенноном и Брандтом Бухером при дополнительной помощи Ирит Катриэль и Денниса Суини.)
Операция |
Форма |
Специализация |
Ускорение работы (до) |
Участник(ы) |
|---|---|---|---|---|
Бинарные операции |
|
Двоичное сложение, умножение и вычитание для распространенных типов, таких как |
10% |
Марк Шеннон, Дон Хи На, Брандт Бухер, Деннис Суини |
Нижний индекс |
|
Типы контейнеров подписки, такие как Пользовательская подписка |
10-25% |
Ирит Катриэль, Марк Шеннон |
Индекс магазина |
|
Аналогично описанной выше специализации подписки. |
10-25% |
Деннис Суини |
Звонки |
|
Вызовы обычных встроенных функций и типов (C), таких как |
20% |
Марк Шеннон, Кен Джин |
Загрузить глобальную переменную |
|
Индекс объекта в пространстве имен globals/builtins кэшируется. Загрузка глобальных и встроенных объектов не требует поиска в пространстве имен. |
Марк Шеннон |
|
Атрибут загрузки |
|
Аналогично загрузке глобальных переменных. Индекс атрибута внутри пространства имен класса/объекта кэшируется. В большинстве случаев загрузка атрибута не требует поиска в пространстве имен. |
Марк Шеннон |
|
Загружать методы для вызова |
|
Фактический адрес метода хранится в кэше. При загрузке метода теперь не выполняется поиск в пространстве имен - даже для классов с длинными цепочками наследования. |
10-20% |
Кен Джин, Марк Шеннон |
Атрибут хранилища |
|
Аналогично оптимизации атрибутов загрузки. |
повышение производительности на 2% |
Марк Шеннон |
Последовательность распаковки |
|
Специализированный для обычных контейнеров, таких как |
8% |
Брандт Бухер |
Разное¶
Объекты теперь требуют меньше памяти из-за лениво создаваемых пространств имен объектов. Их словари пространств имен теперь также более свободно обмениваются ключами. (Вклад Марка Шеннона в bpo-45340 и bpo-40116).
Реализованы исключения с «нулевой стоимостью», устраняющие стоимость операторов
try, когда исключение не вызывается. (Добавлено Марком Шенноном в bpo-40222.)Более сжатое представление исключений в интерпретаторе сократило время, необходимое для перехвата исключения, примерно на 10%. (Добавлено Ирит Катриэль в bpo-45711.)
Механизм сопоставления регулярных выражений
reбыл частично переработан и теперь использует вычисляемые goto (или «потоковый код») на поддерживаемых платформах. В результате Python 3.11 выполняет pyperformance regular expression benchmarks на 10% быстрее, чем Python 3.10. (Автор Брандт Бухер в gh-91404).
часто задаваемые вопросы¶
Как я должен написать свой код, чтобы использовать эти ускорения?¶
Пишите код на Python в соответствии с общепринятыми рекомендациями; вам не нужно менять свой код. Более быстрый проект CPython оптимизирован для использования общих шаблонов кода, которые мы наблюдаем.
Будет ли CPython 3.11 использовать больше памяти?¶
Возможно, и нет; мы не ожидаем, что использование памяти превысит 20% по сравнению с 3.10. Это компенсируется оптимизацией памяти для фреймовых объектов и объектных словарей, как упоминалось выше.
Я не вижу никакого увеличения своей рабочей нагрузки. Почему?¶
Определенный код не будет иметь заметных преимуществ. Если ваш код тратит большую часть времени на операции ввода-вывода или уже выполняет большую часть вычислений в библиотеке расширений C, такой как NumPy, существенного ускорения не произойдет. В настоящее время этот проект больше всего подходит для рабочих нагрузок на чистом Python.
Кроме того, показатели эффективности оплаты представляют собой среднее геометрическое значение. Даже в рамках тестов производительности pyper некоторые показатели немного замедлились, в то время как другие ускорились почти в 2 раза!
Есть ли JIT-компилятор?¶
Нет. Мы все еще изучаем другие варианты оптимизации.
О¶
Более быстрый 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_FUNCTIONCALL_FUNCTION_KWCALL_METHOD |
Отделяет перенос аргументов для методов от обработки аргументов ключевых слов; позволяет лучше специализировать вызовы |
|
DUP_TOPDUP_TOP_TWOROT_TWOROT_THREEROT_FOURROT_N |
Инструкции по манипулированию стеком |
|
JUMP_IF_NOT_EXC_MATCH |
Теперь выполняет проверку, но не переходит |
|
JUMP_ABSOLUTEPOP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE |
Смотрите варианты ; |
|
SETUP_WITHSETUP_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:
(Авторы Бретт Кэннон в 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устарел в docstring начиная с версии Python 3.2 и не указан в документации поconfigparser. Теперь он выдаетDeprecationWarningи будет удален в Python 3.13. Используйте вместо этогоconfigparser.BasicInterpolationилиconfigparser.ExtendedInterpolation. (Автор - Хьюго ван Кеменаде в bpo-46607.)Более старый набор функций
importlib.resourcesустарел в пользу замены, добавленной в Python 3.9, и будет удален в будущей версии Python из-за отсутствия поддержки ресурсов, расположенных в подкаталогах пакета:Функция
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()(ранее он был ошибочно помечен как устаревший, и его строка документа теперь исправлена). (Добавлено Хьюго ван Кеменаде в bpo-45837.)typing.Text, который существует исключительно для обеспечения совместимости кода на Python 2 и Python 3, теперь устарел. В настоящее время его удаление не планируется, но пользователям рекомендуется использовать вместо негоstrвезде, где это возможно. (Автор: Алекс Уэйгуд в статье gh-92332.)Синтаксис ключевого слова argument для построения типов
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.
КОЛПАЧОК, ожидающий снятия, равен listed separately.
Модуль
asynchatМодуль
asyncoreЗначение entire distutils package
Модуль
impПространство имен
typing.ioПространство имен
typing.recgi.log()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.WindowsRegistryFinder.find_module()importlib.util.set_loader_wrapper()importlib.util.set_package_wrapper()sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode()PYTHONTHREADDEBUGпеременная окруженияСледующие устаревшие псевдонимы в
unittest:Устаревший псевдоним
Название метода
Устарел в
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.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, используемый для переноса устаревших объектов сопрограммы на основе генератора в режим отладки. (Добавлено Ильей Волочием в 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.)
Удалена команда
distutilsbdist_msi, устаревшая в Python 3.9. Вместо нее используйтеbdist_wheel(пакеты wheel). (Добавлено Хьюго ван Кеменаде в bpo-45124.)Удалены методы
__getitem__()изxml.dom.pulldom.DOMEventStream,wsgiref.util.FileWrapperиfileinput.FileInput, которые считаются устаревшими начиная с версии Python 3.9. (Добавлено Хьюго ван Кеменаде в bpo-45132.)Удалены устаревшие функции
gettextlgettext(),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.)Удалена поддержка пакетов пространств имен из
unittestdiscovery. Она была введена в Python 3.4, но была нарушена начиная с Python 3.7. (Добавлено Инадой Наоки в bpo-23882).Удален недокументированный закрытый метод
float.__set_format__(), ранее известный какfloat.__setformat__()в Python 3.7. В его строке документации говорилось: «Вы, вероятно, не захотите использовать эту функцию. Она существует в основном для использования в наборе тестов Python». (Автор: Виктор Стиннер в статье bpo-46852.)Флаг
--experimental-isolated-subinterpretersconfigure (и соответствующий макросEXPERIMENTAL_ISOLATED_SUBINTERPRETERS) были удалены.Pynche — Редактор естественных цветов и оттенков Python — был перенесен из
Tools/scriptsв being developed independently из дерева исходных текстов Python.
Перенос на Python 3.11¶
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок в Python API, которые могут потребовать внесения изменений в ваш код на Python.
Примечания по переносу для C API следующие: 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)Запрещено передавать файлы, не относящиеся к
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.)Параметр population для
random.sample()должен быть последовательностью, и автоматическое преобразованиеsets вlists больше не поддерживается. Кроме того, если размер выборки превышает размер генеральной совокупности, ставитсяValueError. (Добавлено Раймондом Хеттингером в статье bpo-40465.)Необязательный параметр random, равный
random.shuffle(), был удален. Ранее для перетасовки использовалась произвольная функция random; теперь всегда будет использоваться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. Эти платформы предоставляют ограниченное количество API-интерфейсов POSIX; функции и модули стандартных библиотек 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.)библиотека lib python больше не связана с 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.)
Изменения в C API¶
Новые возможности¶
Добавьте новую функцию
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()и : c:func:PyFloat_Unpack8. (Автор: Виктор Стиннер в bpo-46906.)Добавьте новые функции для получения атрибутов объекта frame:
PyFrame_GetBuiltins(),PyFrame_GetGenerator(),PyFrame_GetGlobals(),PyFrame_GetLasti().Добавлены две новые функции для получения и установки активного экземпляра исключения:
PyErr_GetHandledException()иPyErr_SetHandledException(). Это альтернативы : c:func:PyErr_SetExcInfo() иPyErr_GetExcInfo(), которые работают с устаревшим представлением исключений, состоящим из 3 кортежей. (Добавлено Ирит Катриэль в bpo-46343.)Добавлен участник
PyConfig.safe_path. (Добавлено Виктором Стиннером в gh-57684.)
Перенос на Python 3.11¶
Некоторые макросы были преобразованы в статические встроенные функции, чтобы избежать macro pitfalls. Изменение должно быть в основном прозрачным для пользователей, поскольку заменяющие функции будут приводить свои аргументы к ожидаемым типам, чтобы избежать предупреждений компилятора из-за статических проверок типов. Однако, если для параметра limited CAP установлено значение >=3.11, эти преобразования не выполняются, и вызывающим абонентам нужно будет привести аргументы к ожидаемым типам. Более подробную информацию смотрите в разделе PEP 670. (Материалы предоставлены Виктором Стиннером и Эрлендом Э. Аасландом в gh-89653.)
PyErr_SetExcInfo()больше не использует аргументыtypeиtraceback, интерпретатор теперь извлекает эти значения из экземпляра exception (аргументvalue). Функция по-прежнему крадет ссылки на все три аргумента. (Добавлено Ирит Катриэль в bpo-45711.)PyErr_GetExcInfo()теперь выводит поляtypeиtracebackрезультата из экземпляра exception (полеvalue). (Автор: Ирит Катриэль в статье bpo-45711.)_frozenсодержит новое полеis_package, указывающее, является ли замороженный модуль пакетом. Ранее отрицательное значение в полеsizeбыло индикатором. Теперь дляsizeбудут использоваться только неотрицательные значения. (Добавлено Кумаром Адитьей в bpo-46608.)_PyFrameEvalFunction()теперь принимает_PyInterpreterFrame*в качестве второго параметра вместоPyFrameObject*. Смотрите PEP 523 для получения более подробной информации о том, как использовать этот тип указателя на функцию.PyCode_New()иPyCode_NewWithPosOnlyArgs()теперь принимают дополнительный аргументexception_table. По возможности следует избегать использования этих функций. Чтобы получить пользовательский объект кода: создайте объект кода с помощью компилятора, затем получите модифицированную версию с помощью методаreplace.:в c:type: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, но не имеет функции обхода (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) или более поздней версии. Расширения C должны явно включать заголовочные файлы после#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()был исключен из limited CAPI. Он никогда не использовался там, поскольку использовал внутренние структуры, недоступные в limited C API. (Добавлено Виктором Стиннером в 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 с использованием оптимизированной библиотеки Blake 2 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()
Вместо этого используйте новый : c:type: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_KINDPyUnicode_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*string) иPyUnicode_Fill(). (Автор: Виктор Стиннер в bpo-41123.)Удалите файл заголовка
pystrhex.h. Он содержит только закрытые функции. Расширения C должны включать только основной файл заголовка<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непрозрачна в ограниченном CAPI. (Добавлено Виктором Стиннером в bpo-35134.)Удалите макрос
PyHeapType_GET_MEMBERS(). Он был представлен в общедоступном C API по ошибке, его следует использовать только внутри Python. Вместо этого используйте элементPyTypeObject.tp_members. (Автор: Виктор Стиннер в статье bpo-40170.)Удалите макрос
HAVE_PY_SET_53BIT_PRECISION(перенесите его во внутренний C API). (Добавлено Виктором Стиннером в bpo-45412.)
Удалите API-интерфейсы
Py_UNICODEencoder, поскольку они устарели начиная с версии 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иshutil.unpack_archive()имеют новый аргумент a filter, который позволяет ограничить возможности tar, которые могут быть неожиданными или опасными, например, создание файлов за пределами каталога назначения. Подробнее смотрите в Экстракционные фильтры. В Python 3.12 при использовании без аргумента filter будет отображатьсяDeprecationWarning. В Python 3.14 значение по умолчанию будет изменено на'data'. (Автор: Петр Викторин в PEP 706.)
Заметные изменения в версии 3.11.5¶
OpenSSL открывает¶
Сборки Windows и установщики macOS из python.org теперь используют OpenSSL 3.0.
Заметные изменения в версии 3.11.10¶
ip-адрес¶
Исправлено поведение
is_globalиis_privateвIPv4Address,IPv6Address,IPv4NetworkиIPv6Network.
электронная почта¶
Заголовки со встроенными новыми строками теперь заключаются в кавычки при выводе.
generatorтеперь будет отказывать в сериализации (записи) заголовков, которые неправильно свернуты или разделены, так что они будут проанализированы как несколько заголовков или объединены со смежными данными. Если вам нужно отключить эту функцию безопасности, установитеverify_generated_headers. (Авторы: Бас Блумсаат и Петр Викторин в статье gh-121650.)email.utils.getaddresses()иemail.utils.parseaddr()теперь возвращают('', '')2-кортежи в большем количестве ситуаций, когда встречаются недопустимые адреса электронной почты, вместо потенциально неточных значений. К этим двум функциям был добавлен необязательный параметр strict: используйтеstrict=False, чтобы получить прежнее поведение, принимая неверные входные данные.getattr(email.utils, 'supports_strict_parsing', False)может использоваться для проверки доступности параметра strict. (Подготовлено Томасом Дуайером и Виктором Стиннером для gh-102988, чтобы улучшить исправление CVE-2023-27043.)