Содержание страницы
Что нового в Python 3.11¶What’s New In Python 3.11
- Редактор:
Pablo Galindo Salgado
В этой статье описаны новые возможности Python 3.11 по сравнению с версией 3.10. Python 3.11 был выпущен 24 октября 2022 года. Подробности см. в журнале изменений.
Краткий обзор – основные изменения выпуска¶Summary – Release highlights
Python 3.11 работает на 10–60% быстрее Python 3.10. В среднем по стандартному набору тестов ускорение составило 1,25 раза. Подробнее см. Faster CPython.
Новые возможности синтаксиса:
PEP 654: Группы исключений и except*PEP 654: Exception Groups and except*
Новые встроенные возможности:
PEP 678: Исключения можно дополнять примечаниямиPEP 678: Exceptions can be enriched with notes
Новые модули стандартной библиотеки:
Улучшения интерпретатора:
PEP 657: Детализированное указание на ошибки в трассировкахPEP 657: Fine-grained error locations in tracebacks
Новый параметр командной строки
-Pи переменная окруженияPYTHONSAFEPATHдля отключения автоматического добавления потенциально небезопасных путей вsys.path
Новые возможности типизации:
PEP 646: Вариативные обобщенияPEP 646: Variadic generics
PEP 655: Пометка отдельных элементов TypedDict как обязательных или необязательныхPEP 655: Marking individual TypedDict items as required or not-required
PEP 673: Тип SelfPEP 673: Self type
PEP 675: Произвольный тип литеральной строкиPEP 675: Arbitrary literal string type
PEP 681: Преобразования классов данныхPEP 681: Data class transforms
Важные устаревания, удаления и ограничения:
Новые возможности¶New Features
PEP 657: Детализированное указание на ошибки в трассировках¶PEP 657: Fine-grained error locations in tracebacks
При выводе трассировки интерпретатор теперь указывает на точное выражение, которое вызвало ошибку, а не просто на строку. Например:
Traceback (most recent call last):
File "distance.py", line 11, in <module>
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "distance.py", line 6, in manhattan_distance
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
В предыдущих версиях интерпретатор указывал только на строку, из-за чего было
непонятно, какой объект был None. Эти улучшенные сообщения об ошибках также могут быть полезны
при работе с глубоко вложенными объектами dict и множественными вызовами функций:
Traceback (most recent call last):
File "query.py", line 37, in <module>
magic_arithmetic('foo')
File "query.py", line 18, in magic_arithmetic
return add_counts(x) / 25
^^^^^^^^^^^^^
File "query.py", line 24, in add_counts
return 25 + query_user(user1) + query_user(user2)
^^^^^^^^^^^^^^^^^
File "query.py", line 32, in query_user
return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
А также сложные арифметические выражения:
Traceback (most recent call last):
File "calculation.py", line 54, in <module>
result = (x / y / z) * (a / b / c)
~~~~~~^~~
ZeroDivisionError: division by zero
Кроме того, информация, используемая улучшенной функцией трассировки, становится доступной через общий API, который можно использовать для сопоставления байт-кода инструкций с расположением в исходном коде. Эту информацию можно получить с помощью:
Метод
codeobject.co_positions()в Python.Функция
PyCode_Addr2Location()в C API.
См. PEP 657 для получения более подробной информации. (Авторы: Pablo Galindo, Batuhan Taskaya и Ammar Askar в bpo-43950.)
Примечание
Эта функция требует хранения позиций столбцов в объектах кода,
что может привести к небольшому увеличению использования памяти интерпретатора
и места на диске для скомпилированных файлов Python.
Чтобы избежать хранения дополнительной информации
и отключить печать дополнительной информации трассировки,
используйте опцию командной строки -X no_debug_ranges
или переменную окружения PYTHONNODEBUGRANGES.
PEP 654: Группы исключений и except*¶PEP 654: Exception Groups and except*
PEP 654 вводит языковые возможности, которые позволяют программе
возбуждать и обрабатывать несколько не связанных исключений одновременно.
Встроенные типы ExceptionGroup и BaseExceptionGroup
позволяют группировать исключения и возбуждать их вместе,
а новый синтаксис except* обобщает
except для сопоставления подгрупп групп исключений.
См. PEP 654 для получения более подробной информации.
(Автор: Irit Katriel в bpo-45292. PEP написан Irit Katriel, Yury Selivanov и Guido van Rossum.)
PEP 678: Исключения можно обогащать примечаниями¶PEP 678: Exceptions can be enriched with notes
Метод add_note() добавлен в BaseException.
Его можно использовать для обогащения исключений контекстной информацией,
которая недоступна в момент возбуждения исключения.
Добавленные примечания отображаются в стандартной трассировке.
См. PEP 678 для получения более подробной информации.
(Автор: Irit Katriel в bpo-45607. PEP написан Zac Hatfield-Dodds.)
Улучшения py.exe лаунчера Windows¶Windows py.exe launcher improvements
Копия менеджера установки Python, включенная в Python 3.11, была значительно
обновлена. Теперь он поддерживает синтаксис company/tag, как определено в PEP 514, с использованием
аргумента -V:<company>/<tag> вместо ограниченного -<major>.<minor>.
Это позволяет запускать дистрибутивы, отличные от PythonCore,
того, который размещен на python.org.
При использовании селекторов -V: можно опустить либо компанию, либо тег, но будут сканироваться все
установки. Например, -V:OtherPython/ выберет
«лучший» тег, зарегистрированный для OtherPython, в то время как -V:3.11 или -V:/3.11
выберут «лучший» дистрибутив с тегом 3.11.
При использовании устаревших аргументов -<major>, -<major>.<minor>,
-<major>-<bitness> или -<major>.<minor>-<bitness>
все существующее поведение должно сохраняться из прошлых версий,
и будут выбраны только выпуски с PythonCore.
Однако суффикс -64 теперь означает «не 32-битный» (не обязательно x86-64),
поскольку существует несколько поддерживаемых 64-битных платформ.
32-битные среды выполнения определяются путем проверки тега среды выполнения на наличие суффикса -32.
Все выпуски Python начиная с 3.5 включали это в свои 32-битные сборки.
Прочие изменения языка ¶Other Language Changes
Выражения распаковки со звёздочкой теперь можно использовать в операторах
for. (Подробнее см. bpo-46725.)Асинхронные включения теперь разрешены внутри включений в асинхронных функциях. Внешние включения в этом случае неявно становятся асинхронными. (Предложено Serhiy Storchaka в bpo-33346.)
Теперь возбуждается
TypeErrorвместоAttributeErrorв операторахwithиcontextlib.ExitStack.enter_context()для объектов, не поддерживающих протокол менеджера контекста, а также в операторахasync withиcontextlib.AsyncExitStack.enter_async_context()для объектов, не поддерживающих протокол асинхронного менеджера контекста. (Предложено Serhiy Storchaka в bpo-12022 и bpo-44471.)Добавлен
object.__getstate__(), предоставляющий реализацию по умолчанию метода__getstate__().copyиpickleэкземпляров подклассов встроенных типовbytearray,set,frozenset,collections.OrderedDict,collections.deque,weakref.WeakSetиdatetime.tzinfoтеперь копируют и пиклизуют атрибуты экземпляров, реализованные как слоты. Это изменение имеет непреднамеренный побочный эффект: оно задевает небольшое количество существующих проектов Python, не ожидающих существованияobject.__getstate__(). См. последующие комментарии в gh-70766 для обсуждения возможных обходных путей для такого кода. (Предложено Serhiy Storchaka в bpo-26579.)
Добавлен параметр командной строки
-Pи переменная окруженияPYTHONSAFEPATH, которые отключают автоматическое добавление в началоsys.pathкаталога скрипта при его выполнении или текущего каталога при использовании-cи-m. Это гарантирует, чтоimportбудут подхватываться только модули из стандартной библиотеки и установленные модули, и предотвращает непреднамеренное или злонамеренное затенение модулей модулями из локального (обычно доступного для записи пользователем) каталога. (Предложено Victor Stinner в gh-57684.)В миниязык спецификации формата добавлена опция
"z", которая преобразует отрицательный ноль в положительный после округления до точности формата. Подробнее см. PEP 682. (Предложено John Belmonte в gh-90153.)Объекты bytes больше не принимаются в
sys.path. Поддержка была нарушена где-то между Python 3.2 и 3.6, и никто этого не заметил до выхода Python 3.10.0. Кроме того, восстановление поддержки было бы проблематичным из-за взаимодействия между-bиsys.path_importer_cacheпри смешивании ключейstrиbytes. (Предложено Thomas Grainger в gh-91181.)
Прочие изменения реализации CPython ¶Other CPython Implementation Changes
Специальные методы
__complex__()дляcomplexи__bytes__()дляbytesреализованы для поддержки протоколовtyping.SupportsComplexиtyping.SupportsBytes. (Предложено Mark Dickinson и Donghee Na в bpo-24234.)siphash13добавлен как новый внутренний алгоритм хеширования. Он обладает аналогичными свойствами безопасности, что иsiphash24, но немного быстрее для длинных входных данных.str,bytesи некоторые другие типы теперь используют его как алгоритм по умолчанию дляhash(). PEP 552 хешированные .pyc-файлы теперь также используютsiphash13. (Предложено Inada Naoki в bpo-29410.)Когда активное исключение повторно возбуждается оператором
raiseбез параметров, трассировка, прикреплённая к этому исключению, теперь всегдаsys.exc_info()[1].__traceback__. Это означает, что изменения, внесённые в трассировку в текущем предложенииexcept, отражаются в повторно возбуждённом исключении. (Предложено Irit Katriel в bpo-45711.)Представление обработанных исключений в состоянии интерпретатора (также известное как
exc_infoили_PyErr_StackItem) теперь содержит только полеexc_value;exc_typeиexc_tracebackудалены, поскольку они могут быть получены изexc_value. (Предложено Irit Katriel в bpo-45711.)Для установщика Windows добавлена новая опция командной строки,
AppendPath. Она ведёт себя аналогичноPrependPath, но добавляет каталоги установки и скриптов в конец, а не в начало. (Предложено Bastian Neuburger в bpo-44934.)Поле
PyConfig.module_search_paths_setтеперь должно быть установлено в1, чтобы инициализация использовалаPyConfig.module_search_pathsдля инициализацииsys.path. В противном случае инициализация пересчитает путь и заменит любые значения, добавленные вmodule_search_paths.Вывод опции
--helpтеперь умещается в 50 строк/80 столбцов. Информация о переменных окружения Python и опциях-Xтеперь доступна с помощью соответствующих флагов--help-envи--help-xoptions, а также новой--help-all. (Предложено Éric Araujo в bpo-46142.)Преобразование между
intиstrпо основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызываетValueError, если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для CVE 2020-10735. Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или APIsys. См. документацию ограничения длины строкового представления целых чисел. Лимит по умолчанию – 4300 цифр в строковом представлении.
Новые модули ¶New Modules
Улучшенные модули¶Improved Modules
asyncio¶
Добавлен класс
TaskGroup, асинхронный контекстный менеджер, который содержит группу задач и ожидает завершения всех при выходе. Для нового кода рекомендуется использовать его вместо непосредственного использованияcreate_task()иgather(). (Автор: Yury Selivanov и другие, gh-90908.)Добавлен
timeout()– асинхронный контекстный менеджер для установки тайм-аута на асинхронные операции. Для нового кода рекомендуется использовать его вместо непосредственного использованияwait_for(). (Автор: Andrew Svetlov, gh-90927.)Добавлен класс
Runner, предоставляющий доступ к механизмам, используемымrun(). (Автор: Andrew Svetlov, gh-91218.)В библиотеку asyncio добавлен класс
Barrierк примитивам синхронизации, а также связанное с ним исключениеBrokenBarrierError. (Авторы: Yves Duprat и Andrew Svetlov, gh-87518.)Добавлен именованный аргумент all_errors в функцию
asyncio.loop.create_connection(), чтобы несколько ошибок соединения можно было возбудить как одноExceptionGroup.Добавлен метод
asyncio.StreamWriter.start_tls()для обновления существующих потоковых соединений до TLS. (Автор: Ian Good, bpo-34975.)В цикл событий добавлены функции для работы с сырыми датаграммными сокетами:
sock_sendto(),sock_recvfrom()иsock_recvfrom_into(). Их реализации находятся вSelectorEventLoopиProactorEventLoop. (Автор: Alex Grönholm, bpo-46805.)Добавлены методы
cancelling()иuncancel()вTask. Они предназначены в первую очередь для внутреннего использования, в частности,TaskGroup.
contextlib¶
dataclasses¶
Изменена проверка мутабельности значений по умолчанию для полей: теперь допускаются только хешируемые значения вместо любого объекта, не являющегося экземпляром
dict,listилиset. (Автор: Eric V. Smith, bpo-44674.)
datetime¶
Добавлен
datetime.UTC– удобный псевдоним дляdatetime.timezone.utc. (Автор: Kabir Kwatra, gh-91973.)datetime.date.fromisoformat(),datetime.time.fromisoformat()иdatetime.datetime.fromisoformat()теперь можно использовать для разбора большинства форматов ISO 8601 (за исключением тех, которые поддерживают дробные часы и минуты). (Автор: Paul Ganssle, gh-80010.)
enum¶
Переименован
EnumMetaвEnumType(EnumMetaоставлен как псевдоним).Добавлен
StrEnum, с членами, которые могут (и должны) использоваться как строки.Добавлен
ReprEnum, который изменяет только__repr__()членов, возвращая их буквальные значения (а не имена) для__str__()и__format__()(используется вstr(),format()и f-строках).Изменено
Enum.__format__()(значение по умолчанию дляformat(),str.format()и f-строк) – теперь оно всегда даёт тот же результат, что иEnum.__str__(): для перечислений, наследующих отReprEnum, это будет значение члена; для всех остальных перечислений это будет имя перечисления и имя члена (например,Color.RED).Добавлен новый параметр класса boundary для перечислений
Flagи перечислениеFlagBoundaryс его параметрами, чтобы управлять обработкой значений флагов, выходящих за пределы диапазона.Добавлены декоратор перечислений
verify()и перечислениеEnumCheckс его параметрами для проверки классов перечислений на соответствие нескольким конкретным ограничениям.Добавлены декораторы
member()иnonmember(), чтобы гарантировать, что декорируемый объект преобразуется/не преобразуется в член перечисления.Добавлен декоратор
property(), который работает какproperty(), но для перечислений. Используйте его вместоtypes.DynamicClassAttribute().Добавлен декоратор перечислений
global_enum(), который изменяет__repr__()и__str__()так, чтобы отображать значения как члены их модуля, а не класса перечисления. Например,'re.ASCII'для членаASCIIизre.RegexFlagвместо'RegexFlag.ASCII'.Улучшен
Flag: теперь поддерживаютсяlen(), итерация иin/not inпо его членам. Например, теперь работает следующий код:len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)Изменены
EnumиFlag: теперь члены определяются до вызова__init_subclass__();dir()теперь включает методы и т.д. из примешанных типов данных.Изменено
Flag: теперь только первичные значения (степени двойки) считаются каноническими, в то время как составные значения (3,6,10и т.д.) считаются псевдонимами; инвертированные флаги приводятся к положительному эквиваленту.
fcntl¶
На FreeBSD поддерживаются флаги
F_DUP2FDиF_DUP2FD_CLOEXEC: первый эквивалентен использованиюdup2, а второй, кроме того, устанавливает флагFD_CLOEXEC.
fractions¶
functools¶
Теперь
functools.singledispatch()поддерживаетtypes.UnionTypeиtyping.Unionв качестве аннотаций к аргументу dispatch.:>>> from functools import singledispatch >>> @singledispatch ... def fun(arg, verbose=False): ... if verbose: ... print("Let me just say,", end=" ") ... print(arg) ... >>> @fun.register ... def _(arg: int | float, verbose=False): ... if verbose: ... print("Strength in numbers, eh?", end=" ") ... print(arg) ... >>> from typing import Union >>> @fun.register ... def _(arg: Union[list, set], verbose=False): ... if verbose: ... print("Enumerate this:") ... for i, elem in enumerate(arg): ... print(i, elem) ...
(Автор: Yurii Karabas, bpo-46014.)
gzip¶
Функция
gzip.compress()теперь работает быстрее при использовании аргумента mtime=0, так как она полностью делегирует сжатие единственной операцииzlib.compress(). У этого изменения есть один побочный эффект: заголовок gzip-файла содержит байт «OS». Ранее модульgzipвсегда устанавливал в нём значение 255, означающее «неизвестно». Теперь при использованииcompress()с mtime=0 это значение может быть другим, в зависимости от библиотеки zlib на C, с которой слинкован Python. (Подробнее о побочном эффекте см. gh-112346.)
hashlib¶
hashlib.blake2b()иhashlib.blake2s()теперь предпочитают libb2 собственной копии Python. (Автор: Christian Heimes, bpo-47095.)Внутренний модуль
_sha3с алгоритмами SHA3 и SHAKE теперь использует tiny_sha3 вместо Keccak Code Package для уменьшения объёма кода и двоичного размера. Модульhashlibпредпочитает оптимизированные реализации SHA3 и SHAKE из OpenSSL. Изменение затрагивает только установки без поддержки OpenSSL. (Автор: Christian Heimes, bpo-47098.)Добавлена
hashlib.file_digest()– вспомогательная функция для эффективного хеширования файлов или файлоподобных объектов. (Автор: Christian Heimes, gh-89313.)
IDLE and idlelib¶
inspect¶
Добавлена
getmembers_static()для возврата всех членов без запуска динамического поиска через протокол дескрипторов. (Автор: Weipeng Hong, bpo-30533.)Добавлена
ismethodwrapper()для проверки, является ли тип объектаMethodWrapperType. (Автор: Hakan Çelik, bpo-29418.)Функции, связанные с фреймами, в модуле
inspectизменены так, чтобы возвращать новые экземпляры классовFrameInfoиTraceback(обратно совместимые с предыдущими интерфейсами, подобными именованным кортежам), которые включают расширенную информацию о позиции PEP 657 (номер конечной строки, колонку и конечную колонку). Затронуты следующие функции:(Автор: Pablo Galindo, gh-88116.)
locale¶
Добавлена
locale.getencoding()для получения текущей кодировки локали. Она аналогичнаlocale.getpreferredencoding(False), но игнорирует режим UTF-8 в Python.
logging¶
Добавлена
getLevelNamesMapping()для возврата отображения имён уровней логирования (например,'CRITICAL') в значения соответствующих уровней логирования (например,50по умолчанию). (Автор: Andrei Kulakovin, gh-88024.)Добавлен метод
createSocket()вSysLogHandlerдля соответствияSocketHandler.createSocket(). Он вызывается автоматически при инициализации обработчика и при отправке события, если нет активного сокета. (Автор: Kirill Pinchuk, gh-88457.)
math¶
Добавлена
math.exp2(): возвращает 2, возведённое в степень x. (Автор: Gideon Mitchell, bpo-45917.)Добавлена
math.cbrt(): возвращает кубический корень из x. (Автор: Ajith Ramachandran, bpo-44357.)Поведение двух особых случаев
math.pow()было изменено для соответствия спецификации IEEE 754. Операцииmath.pow(0.0, -math.inf)иmath.pow(-0.0, -math.inf)теперь возвращаютinf. Ранее они вызывалиValueError. (Автор: Mark Dickinson, bpo-44339.)Значение
math.nanтеперь всегда доступно. (Автор: Victor Stinner, bpo-46917.)
operator¶
Добавлена новая функция
operator.call, так чтоoperator.call(obj, *args, **kwargs) == obj(*args, **kwargs). (Предложено Antony Lee в bpo-44019.)
os¶
В Windows
os.urandom()теперь используетBCryptGenRandom()вместоCryptGenRandom(), который устарел. (Предложено Donghee Na в bpo-44611.)
pathlib¶
re¶
Атомарные группы (
(?>...)) и possessive-квантификаторы (*+,++,?+,{m,n}+) теперь поддерживаются в регулярных выражениях. (Предложено Jeffrey C. Jacobs и Serhiy Storchaka в bpo-433030.)
shutil¶
Добавлен необязательный параметр dir_fd в
shutil.rmtree(). (Предложено Serhiy Storchaka в bpo-46245.)
socket¶
Добавлена поддержка CAN-сокетов для NetBSD. (Предложено Thomas Klausner в bpo-30512.)
create_connection()имеет опцию, позволяющую в случае неудачи подключения возбуждатьExceptionGroup, содержащее все ошибки, вместо того чтобы возбуждать только последнюю. (Предложено Irit Katriel в bpo-29980.)
sqlite3¶
Теперь можно отключить авторизатор, передав
Noneвset_authorizer(). (Предложено Erlend E. Aasland в bpo-44491.)Имя collation
create_collation()теперь может содержать любые символы Unicode. Имена collation с недопустимыми символами теперь возбуждаютUnicodeEncodeErrorвместоsqlite3.ProgrammingError. (Предложено Erlend E. Aasland в bpo-44688.)Исключения
sqlite3теперь включают расширенный код ошибки SQLite какsqlite_errorcodeи имя ошибки SQLite какsqlite_errorname. (Предложено Aviv Palivoda, Daniel Shahaf и Erlend E. Aasland в bpo-16379 и bpo-24139.)Добавлены
setlimit()иgetlimit()вsqlite3.Connectionдля установки и получения лимитов SQLite на уровне соединения. (Предложено Erlend E. Aasland в bpo-45243.)sqlite3теперь устанавливаетsqlite3.threadsafetyна основе режима потоков по умолчанию, с которым скомпилирована базовая библиотека SQLite. (Предложено Erlend E. Aasland в bpo-45613.)C-колбэки
sqlite3теперь используют невыбрасываемые исключения, если включены трассировки колбэков. Пользователи теперь могут зарегистрироватьunraisable hook handlerдля улучшения опыта отладки. (Предложено Erlend E. Aasland в bpo-45828.)Выборка при откате больше не возбуждает
InterfaceError. Вместо этого мы передаём обработку этих случаев библиотеке SQLite. (Предложено Erlend E. Aasland в bpo-44092.)Добавлены
serialize()иdeserialize()вsqlite3.Connectionдля сериализации и десериализации баз данных. (Предложено Erlend E. Aasland в bpo-41930.)Добавлен
create_window_function()вsqlite3.Connectionдля создания агрегатных оконных функций. (Предложено Erlend E. Aasland в bpo-34916.)Добавлен
blobopen()вsqlite3.Connection.sqlite3.Blobпозволяет выполнять инкрементальные операции ввода-вывода над BLOB-ами. (Предложено Aviv Palivoda и Erlend E. Aasland в bpo-24905.)
string¶
Добавлены
get_identifiers()иis_valid()вstring.Template, которые соответственно возвращают все допустимые заполнители и наличие недопустимых заполнителей. (Предложено Ben Kehoe в gh-90465.)
sys¶
sys.exc_info()теперь выводит поляtypeиtracebackизvalue(экземпляра исключения), так что при изменении исключения во время его обработки изменения отражаются в результатах последующих вызововexc_info(). (Предложено Irit Katriel в bpo-45711.)Добавлен
sys.exception(), который возвращает активный экземпляр исключения (эквивалентноsys.exc_info()[1]). (Предложено Irit Katriel в bpo-46328.)Добавлен флаг
sys.flags.safe_path. (Предложено Victor Stinner в gh-57684.)
sysconfig¶
Три новые схемы установки (posix_venv, nt_venv и venv) были добавлены и используются, когда Python создаёт новые виртуальные окружения или запускается из виртуального окружения. Первые две схемы (posix_venv и nt_venv) являются зависимыми от ОС: для не-Windows и Windows, а venv по сути является псевдонимом одной из них в зависимости от ОС, на которой работает Python. Это полезно для дистрибьюторов, которые модифицируют
sysconfig.get_preferred_scheme(). Сторонний код, создающий новые виртуальные окружения, должен использовать новую схему установки venv для определения путей, как это делаетvenv. (Предложено Miro Hrončok в bpo-45413.)
tempfile¶
Объекты
SpooledTemporaryFileтеперь полностью реализуют методыio.BufferedIOBaseилиio.TextIOBase(в зависимости от режима файла). Это позволяет им корректно работать с API, ожидающими объекты, подобные файлам, например, модулями сжатия. (Автор: Carey Metcalfe в gh-70363.)
threading¶
В Unix, если функция
sem_clockwait()доступна в библиотеке C (glibc 2.30 и новее), методthreading.Lock.acquire()теперь использует монотонные часы (time.CLOCK_MONOTONIC) для тайм-аута, вместо использования системных часов (time.CLOCK_REALTIME), чтобы не зависеть от изменений системных часов. (Автор: Victor Stinner в bpo-41710.)
time¶
В Unix,
time.sleep()теперь использует функциюclock_nanosleep()илиnanosleep(), если она доступна, которая имеет разрешение 1 наносекунда (10-9 секунды), вместо использованияselect(), которая имеет разрешение 1 микросекунда (10-6 секунды). (Авторы: Benjamin Szőke и Victor Stinner в bpo-21302.)В Windows 8.1 и новее,
time.sleep()теперь использует ожидаемый таймер на основе высокоточных таймеров, который имеет разрешение 100 наносекунд (10-7 секунды). Ранее он имел разрешение 1 миллисекунда (10-3 секунды). (Авторы: Benjamin Szőke, Donghee Na, Eryk Sun и Victor Stinner в bpo-21302 и bpo-45429.)
tkinter¶
Добавлен метод
info_patchlevel(), который возвращает точную версию библиотеки Tcl в виде именованного кортежа, подобногоsys.version_info. (Автор: Serhiy Storchaka в gh-91827.)
traceback¶
Добавлен
traceback.StackSummary.format_frame_summary(), чтобы позволить пользователям переопределять, какие фреймы появляются в трассировке и как они форматируются. (Автор: Ammar Askar в bpo-44569.)Добавлен
traceback.TracebackException.print(), который выводит отформатированный экземплярTracebackExceptionв файл. (Автор: Irit Katriel в bpo-33809.)
typing¶
Основные изменения см. в новых возможностях, связанных с аннотациями типов.
Добавлены
typing.assert_never()иtyping.Never.typing.assert_never()полезен для запроса к проверяльщику типов подтверждения, что строка кода недостижима. Во время выполнения он возбуждаетAssertionError. (Автор: Jelle Zijlstra в gh-90633.)Добавлен
typing.reveal_type(). Это полезно для запроса к проверяльщику типов, какой тип он вывел для данного выражения. Во время выполнения он выводит тип полученного значения. (Автор: Jelle Zijlstra в gh-90572.)Добавлен
typing.assert_type(). Это полезно для запроса к проверяльщику типов подтверждения, что выведенный им тип для данного выражения соответствует заданному типу. Во время выполнения он просто возвращает полученное значение. (Автор: Jelle Zijlstra в gh-90638.)Типы
typing.TypedDictтеперь могут быть обобщёнными. (Автор: Samodya Abeysiriwardane в gh-89026.)Типы
NamedTupleтеперь могут быть обобщёнными. (Автор: Serhiy Storchaka в bpo-43923.)Разрешено создание подклассов
typing.Any. Это полезно для избежания ошибок проверяльщика типов, связанных с высокодинамичными классами, такими как mocks. (Автор: Shantanu Jain в gh-91154.)Декоратор
typing.final()теперь устанавливает атрибут__final__на декорируемом объекте. (Автор: Jelle Zijlstra в gh-90500.)Функция
typing.get_overloads()может использоваться для интроспекции перегрузок функции.typing.clear_overloads()можно использовать для очистки всех зарегистрированных перегрузок функции. (Автор: Jelle Zijlstra в gh-89263.)Метод
__init__()подклассовProtocolтеперь сохраняется. (Автор: Adrian Garcia Badarasco в gh-88970.)Представление типов пустых кортежей (
Tuple[()]) упрощено. Это влияет на интроспекцию, например,get_args(Tuple[()])теперь вычисляется в()вместо((),). (Автор: Serhiy Storchaka в gh-91137.)Ослаблены требования времени выполнения для аннотаций типов путём удаления проверки на вызываемость в частной функции
typing._type_check. (Автор: Gregory Beauregard в gh-90802.)typing.get_type_hints()теперь поддерживает вычисление строк как прямых ссылок в обобщённых псевдонимах PEP 585. (Автор: Niklas Rosenstein в gh-85542.)typing.get_type_hints()больше не добавляетOptionalк параметрам сNoneв качестве значения по умолчанию. (Автор: Nikita Sobolev в gh-90353.)typing.get_type_hints()теперь поддерживает вычисление чистых строковых аннотацийClassVar. (Автор: Gregory Beauregard в gh-90711.)typing.no_type_check()больше не изменяет внешние классы и функции. Теперь он также корректно помечает методы класса как не подлежащие проверке типов. (Автор: Nikita Sobolev в gh-90729.)
unicodedata¶
База данных Unicode обновлена до версии 14.0.0. (Автор: Benjamin Peterson в bpo-45190).
unittest¶
Добавлены методы
enterContext()иenterClassContext()классаTestCase, методenterAsyncContext()классаIsolatedAsyncioTestCaseи функцияunittest.enterModuleContext(). (Автор: Serhiy Storchaka в bpo-45046.)
venv¶
Когда создаются новые виртуальные окружения Python, venv схема установки sysconfig используется для определения путей внутри окружения. Когда Python работает в виртуальном окружении, эта же схема установки используется по умолчанию. Это означает, что нижестоящие распространители могут изменить схему установки sysconfig по умолчанию, не меняя поведение виртуальных окружений. Сторонний код, который также создаёт новые виртуальные окружения, должен делать то же самое. (Предложено Miro Hrončok в bpo-45413.)
warnings¶
warnings.catch_warnings()теперь принимает аргументы дляwarnings.simplefilter(), предоставляя более краткий способ локального игнорирования предупреждений или преобразования их в ошибки. (Предложено Zac Hatfield-Dodds в bpo-47074.)
zipfile¶
Добавлена поддержка указания кодировки имён членов для чтения метаданных в заголовках каталога и файлов
ZipFile. (Предложено Stephen J. Turnbull и Serhiy Storchaka в bpo-28080.)Добавлен
ZipFile.mkdir()для создания новых каталогов внутри ZIP-архивов. (Предложено Sam Ezeh в gh-49083.)Добавлены
stem,suffixиsuffixesвzipfile.Path. (Предложено Miguel Brito в gh-88261.)
Оптимизации¶Optimizations
В этом разделе рассматриваются конкретные оптимизации, не связанные с проектом Faster CPython, который описан в отдельном разделе.
Компилятор теперь оптимизирует простое printf-форматирование % строковых литералов, содержащих только коды формата
%s,%rи%a, и делает его таким же быстрым, как соответствующее выражение f-строки. (Предложено Serhiy Storchaka в bpo-28307.)Целочисленное деление (
//) лучше оптимизируется компиляторами. Теперь оно примерно на 20% быстрее на x86-64 при деленииintна значение меньше2**30. (Предложено Gregory P. Smith и Tim Peters в gh-90564.)sum()теперь почти на 30% быстрее для целых чисел меньше2**30. (Предложено Stefan Behnel в gh-68264.)Изменение размера списков оптимизировано для типичного случая, ускоряя
list.append()примерно на 15% и простые списковые включения до 20–30%. (Предложено Dennis Sweeney в gh-91165.)Словари не хранят хеш-значения, если все ключи являются объектами Unicode, что уменьшает размер
dict. Например,sys.getsizeof(dict.fromkeys("abcdefg"))уменьшается с 352 байт до 272 байт (на 23% меньше) на 64-битных платформах. (Предложено Inada Naoki в bpo-46845.)Использование
asyncio.DatagramProtocolтеперь на порядки быстрее при передаче больших файлов через UDP: скорость более чем в 100 раз выше для файла размером ≈60 МиБ. (Предложено msoxzw в gh-91487.)Функции
mathcomb()иperm()теперь примерно в 10 раз быстрее для больших аргументов (с большим ускорением для больших k). (Предложено Serhiy Storchaka в bpo-37295.)Функции
statisticsmean(),variance()иstdev()теперь обрабатывают итераторы за один проход, а не преобразуют их сначала вlist. Это вдвое быстрее и может существенно сэкономить память. (Предложено Raymond Hettinger в gh-90415.)unicodedata.normalize()теперь нормализует строки из чистого ASCII за константное время. (Предложено Donghee Na в bpo-44987.)
Faster CPython¶
CPython 3.11 в среднем на 25% быстрее CPython 3.10 по результатам тестового набора pyperformance при компиляции с GCC на Ubuntu Linux. В зависимости от нагрузки общее ускорение может составлять 10–60%.
Этот проект фокусируется на двух основных областях Python: Faster Startup и Faster Runtime. Оптимизации, не охваченные этим проектом, перечислены отдельно в разделе Optimizations.
Faster Startup¶
Frozen imports / Static code objects¶
Python кеширует байткод в каталоге __pycache__ для ускорения загрузки модулей.
Ранее в Python 3.10 выполнение модуля выглядело так:
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
В Python 3.11 основные модули, необходимые для запуска Python, «заморожены». Это означает, что их объекты кода (и байткод) статически выделяются интерпретатором. Это сокращает этапы выполнения модуля до:
Statically allocated code object -> Evaluate
Запуск интерпретатора теперь на 10–15% быстрее в Python 3.11. Это оказывает большое влияние на короткие программы, использующие Python.
(Предложено Eric Snow, Guido van Rossum и Kumar Aditya во многих тикетах.)
Faster Runtime¶
Cheaper, lazy Python frames¶
Фреймы Python, содержащие информацию о выполнении, создаются при каждом вызове Python-функции. Ниже приведены новые оптимизации фреймов:
Упрощён процесс создания фреймов.
Удалось избежать выделения памяти за счёт повторного использования пространства фреймов в C-стеке.
Упрощена внутренняя структура фрейма: теперь она содержит только основную информацию. Раньше фреймы содержали дополнительную отладочную информацию и информацию об управлении памятью.
Объекты фреймов старого стиля теперь создаются только по запросу отладчиков
или функций самоанализа Python, таких как sys._getframe() и
inspect.currentframe(). Для большинства пользовательского кода объекты фреймов не создаются вовсе.
Как результат, почти все вызовы функций Python значительно ускорились. Мы измерили прирост производительности на 3–7% в pyperformance.
(Предложено Марком Шенноном в bpo-44590.)
Встраивание вызовов функций Python¶Inlined Python function calls
Во время вызова функции Python вызывает C-функцию оценки для интерпретации кода этой функции. Это фактически ограничивает чистую рекурсию Python тем, что безопасно для C-стека.
В версии 3.11, когда CPython обнаруживает, что Python-код вызывает другую функцию Python, он создаёт новый фрейм и «перепрыгивает» к новому коду внутри нового фрейма. Это позволяет полностью избежать вызова C-функции интерпретации.
Большинство вызовов функций Python теперь не расходуют память C-стека, что ускоряет их. В простых рекурсивных функциях, таких как fibonacci или factorial, мы наблюдали ускорение в 1,7 раза. Это также означает, что рекурсивные функции могут углубляться значительно сильнее (если пользователь увеличивает предел рекурсии с помощью sys.setrecursionlimit()). Мы измерили улучшение на 1–3% в pyperformance.
(Предложено Пабло Галиндо и Марком Шенноном в bpo-45256.)
PEP 659: Специализирующийся адаптивный интерпретатор¶PEP 659: Specializing Adaptive Interpreter
PEP 659 – одна из ключевых частей проекта Faster CPython. Общая идея в том, что, хотя Python – динамический язык, в большинстве кода есть участки, где объекты и типы редко меняются. Эта концепция известна как стабильность типов.
Во время выполнения Python пытается найти общие шаблоны и стабильность типов в исполняемом коде. Затем Python заменяет текущую операцию на более специализированную. Эта специализированная операция использует быстрые пути, доступные только для этих сценариев использования/типов, которые в целом превосходят свои универсальные аналоги. Это также вводит ещё одну концепцию, называемую кэширование в коде, когда Python кэширует результаты дорогостоящих операций непосредственно в байткод.
Специализатор также объединяет некоторые распространённые пары инструкций в одну суперинструкцию, уменьшая накладные расходы во время выполнения.
Python выполняет специализацию только тогда, когда видит код, который является «горячим» (выполняется несколько раз). Это предотвращает трату времени Python на код, выполняющийся один раз. Python также может деспециализироваться, когда код слишком динамичен или когда использование меняется. Специализация предпринимается периодически, и попытки специализации не слишком дороги, что позволяет специализации адаптироваться к новым условиям.
(PEP написан Марком Шенноном, идеи вдохновлены Стефаном Брунталером. См. PEP 659 для получения дополнительной информации. Реализация Марка Шеннона и Брэндта Бухера, с дополнительной помощью Ирит Катриэль и Денниса Суини.)
Операция |
Форма |
Специализация |
Ускорение операции (до) |
Автор(ы) |
|---|---|---|---|---|
Бинарные операции |
|
Бинарные сложение, умножение и вычитание для распространённых типов, таких как |
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
Индексация |
|
Индексация типов-контейнеров, таких как Индексация пользовательских |
10-25% |
Irit Katriel, Mark Shannon |
Присваивание по индексу |
|
Аналогично специализации индексации выше. |
10-25% |
Dennis Sweeney |
Вызовы |
|
Вызовы распространённых встроенных (C) функций и типов, таких как |
20% |
Mark Shannon, Ken Jin |
Загрузка глобальной переменной |
|
Индекс объекта в пространстве имён globals/builtins кэшируется. Для загрузки globals и builtins не требуется ни одного поиска в пространстве имён. |
Mark Shannon |
|
Загрузка атрибута |
|
Аналогично загрузке глобальных переменных. Индекс атрибута внутри пространства имён класса/объекта кэшируется. В большинстве случаев загрузка атрибута не требует поиска в пространстве имён. |
Mark Shannon |
|
Загрузка методов для вызова |
|
Фактический адрес метода кэшируется. Загрузка метода теперь не требует поиска в пространстве имён – даже для классов с длинными цепочками наследования. |
10-20% |
Ken Jin, Mark Shannon |
Сохранение атрибута |
|
Аналогично оптимизации загрузки атрибута. |
2% в pyperformance |
Mark Shannon |
Распаковка последовательности |
|
Специализирован для распространённых контейнеров, таких как
|
8% |
Brandt Bucher |
Разное¶Misc
Объекты теперь требуют меньше памяти благодаря лениво создаваемым пространствам имён объектов. Их словари пространств имён теперь также более свободно разделяют ключи. (Вклад Марка Шеннона в bpo-45340 и bpo-40116.)
Реализованы исключения с «нулевой стоимостью», устраняющие затраты на оператор
try, когда исключение не возбуждается. (Вклад Марка Шеннона в bpo-40222.)Более компактное представление исключений в интерпретаторе сократило время, необходимое для перехвата исключения, примерно на 10%. (Вклад Ирит Катриэль в bpo-45711.)
Движок сопоставления регулярных выражений
reбыл частично переработан и теперь на поддерживаемых платформах использует вычисляемые переходы (или «threaded code»). В результате Python 3.11 выполняет тесты производительности регулярных выражений pyperformance до 10% быстрее, чем Python 3.10. (Вклад Брандта Бухера в gh-91404.)
Часто задаваемые вопросы¶FAQ
Как следует писать код, чтобы использовать эти ускорения?¶How should I write my code to utilize these speedups?
Пишите Pythonic-код, следующий общепринятым лучшим практикам; вам не нужно менять свой код. Проект Faster CPython оптимизирует типичные шаблоны кода, которые мы наблюдаем.
Будет ли CPython 3.11 использовать больше памяти?¶Will CPython 3.11 use more memory?
Возможно, нет; мы не ожидаем, что использование памяти превысит 20% по сравнению с 3.10. Это компенсируется оптимизациями памяти для объектов фреймов и словарей объектов, как упоминалось выше.
Я не вижу ускорений в своей рабочей нагрузке. Почему?¶I don’t see any speedups in my workload. Why?
Некоторый код не получит заметных преимуществ. Если ваш код тратит большую часть времени на операции ввода-вывода или уже выполняет большую часть вычислений в расширении на C, таком как NumPy, значительного ускорения не будет. Этот проект в настоящее время больше всего выигрывают чисто Python-нагрузки.
Кроме того, показатели pyperformance являются средним геометрическим. Даже среди тестов pyperformance некоторые тесты немного замедлились, в то время как другие ускорились почти в 2 раза!
Есть ли JIT-компилятор?¶Is there a JIT compiler?
Нет. Мы всё ещё изучаем другие оптимизации.
О проекте¶About
Проект Faster CPython изучает оптимизации для CPython. Основная команда финансируется Microsoft для полной занятости над проектом. Пабло Галиндо Сальгадо также получает финансирование от Bloomberg LP для работы над проектом неполный рабочий день. Наконец, многие участники являются волонтёрами из сообщества.
Изменения байткода CPython¶CPython bytecode changes
Байткод теперь содержит встроенные записи кэша
в виде недавно добавленных инструкций CACHE.
Многие опкоды ожидают, что за ними следует точное количество записей кэша,
и инструктируют интерпретатор пропускать их во время выполнения.
Заполненные записи кэша могут выглядеть как произвольные инструкции,
поэтому следует проявлять особую осторожность при чтении или изменении
сырого адаптивного байткода, содержащего ускоренные данные.
Новые опкоды¶New opcodes
ASYNC_GEN_WRAP,RETURN_GENERATORиSEND, используемые в генераторах и корутинах.COPY_FREE_VARS, что устраняет необходимость в специальном коде на стороне вызывающего для замыканий.JUMP_BACKWARD_NO_INTERRUPT, для использования в определённых циклах, где обработка прерываний нежелательна.MAKE_CELL, для создания Cell Objects.CHECK_EG_MATCHиPREP_RERAISE_STAR, для обработки новых групп исключений и except*, добавленных в PEP 654.PUSH_EXC_INFO, для использования в обработчиках исключений.RESUME, пустая операция (no-op), для внутреннего трассирования, отладки и проверок оптимизации.
Заменённые опкоды¶Replaced opcodes
Заменённый(ые) опкод(ы) |
Новый(ые) опкод(ы) |
Примечания |
|---|---|---|
BINARY_*INPLACE_* |
Заменены все числовые бинарные/операции на месте одним опкодом |
|
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 |
См. [3];
варианты |
|
SETUP_WITHSETUP_ASYNC_WITH |
|
Настройка блока |
Все опкоды перехода теперь относительные, включая
существующие JUMP_IF_TRUE_OR_POP и JUMP_IF_FALSE_OR_POP.
Аргумент теперь является смещением от текущей инструкции,
а не абсолютным адресом.
Изменённые/удалённые опкоды¶Changed/removed opcodes
Изменены
MATCH_CLASSиMATCH_KEYS: они больше не помещают дополнительное логическое значение для указания успеха/неудачи. Вместо этого при неудаче помещаетсяNoneвместо кортежа извлечённых значений.Изменены опкоды, работающие с исключениями, чтобы отразить их представление в виде одного элемента в стеке вместо трёх (см. gh-89874).
Удалены
COPY_DICT_WITHOUT_KEYS,GEN_START,POP_BLOCK,SETUP_FINALLYиYIELD_FROM.
Устарело¶Deprecated
В этом разделе перечислены API Python, объявленные устаревшими в Python 3.11.
Устаревшие C API перечислены отдельно.
Язык/Встроенные функции¶Language/Builtins
Цепочка дескрипторов
classmethod(введённая в bpo-19072) теперь устарела. Её больше нельзя использовать для оборачивания других дескрипторов, таких какproperty. Базовая архитектура этой возможности была ошибочной и вызвала ряд проблем в дальнейшем. Для «пропускания»classmethodрекомендуется использовать атрибут__wrapped__, добавленный в Python 3.10. (Автор: Raymond Hettinger, gh-89519.)Восьмеричные управляющие последовательности в строковых и байтовых литералах со значениями больше
0o377(255 в десятичной системе) теперь вызываютDeprecationWarning. В будущей версии Python они будут порождатьSyntaxWarningи в конечном итогеSyntaxError. (Автор: Serhiy Storchaka в gh-81548.)Делегирование
int()в__trunc__()теперь устарело. Вызовint(a), когдаtype(a)реализует__trunc__(), но не__int__()или__index__(), теперь вызываетDeprecationWarning. (Автор: Zackery Spytz в bpo-44977.)
Модули¶Modules
PEP 594 привёл к объявлению устаревшими следующих модулей, которые планируется удалить в Python 3.13:
aifcchunkmsilibpipestelnetlibaudioopcryptnissndhdruucgiimghdrnntplibspwdxdrlibcgitbmailcapossaudiodevsunau(Авторы: Brett Cannon в bpo-47061 и Victor Stinner в gh-68966.)
Модули
asynchat,asyncoreиsmtpdустарели начиная как минимум с Python 3.6. Их документация и предупреждения об устаревании теперь обновлены, чтобы отметить, что они будут удалены в Python 3.12. (Автор: Hugo van Kemenade в bpo-47022.)Пакет
lib2to3и инструмент2to3теперь устарели и могут не поддерживать синтаксис Python 3.10 и новее. Подробнее см. PEP 617, который вводит новый PEG-парсер. (Автор: Victor Stinner в bpo-40360.)Модули без документации
sre_compile,sre_constantsиsre_parseтеперь устарели. (Автор: Serhiy Storchaka в bpo-47152.)
Стандартная библиотека¶Standard Library
Следующие элементы устарели в
configparserначиная с Python 3.2. Теперь предупреждения об устаревании обновлены, чтобы указать, что они будут удалены в Python 3.12:класс
configparser.SafeConfigParserсвойство
configparser.ParsingError.filenameметод
configparser.RawConfigParser.readfp()
(Автор: Hugo van Kemenade в bpo-45173.)
configparser.LegacyInterpolationустарел в строке документации начиная с Python 3.2 и не указан в документацииconfigparser. Теперь он вызываетDeprecationWarningи будет удалён в Python 3.13. Вместо него используйтеconfigparser.BasicInterpolationилиconfigparser.ExtendedInterpolation. (Автор: Hugo van Kemenade в bpo-46607.)Старый набор функций
importlib.resourcesбыл объявлен устаревшим в пользу замен, добавленных в Python 3.9, и будет удалён в будущей версии Python из-за отсутствия поддержки ресурсов, находящихся в подкаталогах пакетов:importlib.resources.contents()importlib.resources.is_resource()importlib.resources.open_binary()importlib.resources.open_text()importlib.resources.read_binary()importlib.resources.read_text()importlib.resources.path()
Функция
locale.getdefaultlocale()устарела и будет удалена в Python 3.15. Используйте функцииlocale.setlocale(),locale.getpreferredencoding(False)иlocale.getlocale(). (Автор: Victor Stinner в gh-90817.)Функция
locale.resetlocale()устарела и будет удалена в Python 3.13. Вместо неё используйтеlocale.setlocale(locale.LC_ALL, ""). (Автор: Victor Stinner в gh-90817.)Теперь будут применяться более строгие правила для числовых ссылок на группы и имён групп в регулярных выражениях. В качестве числовой ссылки будут приниматься только последовательности ASCII-цифр, а имя группы в
bytesшаблонах и строках замены может содержать только ASCII-буквы, цифры и символы подчёркивания. Пока что для синтаксиса, нарушающего эти правила, выводится предупреждение об устаревании. (Автор: Serhiy Storchaka в gh-91760.)В модуле
reфункцияre.template()и соответствующие флагиre.TEMPLATEиre.Tустарели, поскольку они не были документированы и не имели очевидного назначения. Они будут удалены в Python 3.13. (Авторы: Serhiy Storchaka и Miro Hrončok в gh-92728.)turtle.settiltangle()устарел начиная с Python 3.1; теперь он выдаёт предупреждение об устаревании и будет удалён в Python 3.13. Используйте вместо негоturtle.tiltangle()(ранее он был ошибочно помечен как устаревший, и его строка документации теперь исправлена). (Автор: Hugo van Kemenade в bpo-45837.)typing.Text, который существует исключительно для обеспечения совместимости между кодом Python 2 и Python 3, теперь устарел. Его удаление пока не планируется, но пользователям рекомендуется использоватьstrвезде, где это возможно. (Автор: Alex Waygood в gh-92332.)Синтаксис с именованными аргументами для создания типов
typing.TypedDictтеперь устарел. Поддержка будет удалена в Python 3.13. (Автор: Jingchen Ye в gh-90224.)webbrowser.MacOSXустарел и будет удалён в Python 3.13. Он не тестируется, не документирован и не используется самимwebbrowser. (Автор: Donghee Na в bpo-42255.)Поведение, при котором из тестовых методов
TestCaseиIsolatedAsyncioTestCaseвозвращается значение (отличное от значения по умолчаниюNone), теперь устарело.Объявлены устаревшими следующие неофициально документированные функции
unittest, запланированные к удалению в Python 3.13:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()
Вместо этого используйте методы
TestLoader:(Автор: Erlend E. Aasland в bpo-5846.)
unittest.TestProgram.usageExit()отмечен как устаревший, будет удалён в 3.13. (Автор: Carlos Damázio в gh-67048.)
Предстоящее удаление в Python 3.12¶Pending Removal in Python 3.12
Следующие Python API были объявлены устаревшими в более ранних версиях Python и будут удалены в Python 3.12.
API языка C, которые планируется удалить, перечислены отдельно.
Модуль
asynchatМодуль
asyncoreМодуль
impПространство имён
typing.ioПространство имён
typing.recgi.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.ImpImporterpkgutil.ImpLoaderpathlib.Path.link_to()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
Удалено¶Removed
В этом разделе перечислены API Python, которые были удалены в Python 3.11.
Удалённые C API перечислены отдельно.
Удалён
@asyncio.coroutine()декоратор, обеспечивающий совместимость устаревших корутин на основе генераторов с кодомasync/await. Эта функция считается устаревшей с Python 3.8, и удаление изначально планировалось на Python 3.10. Используйтеasync defвместо неё. (Автор: Illia Volochii в bpo-43216.)Удалён
asyncio.coroutines.CoroWrapper, использовавшийся для обёртывания устаревших корутинных объектов на основе генераторов в режиме отладки. (Автор: Illia Volochii в bpo-43216.)Из-за серьёзных проблем безопасности параметр reuse_address функции
asyncio.loop.create_datagram_endpoint(), отключённый в Python 3.9, теперь полностью удалён. Это связано с поведением опции сокетаSO_REUSEADDRв UDP. (Автор: Hugo van Kemenade в bpo-45129.)Удалён модуль
binhex, считавшийся устаревшим в Python 3.9. Также удалены связанные с ним, также устаревшие, функцииbinascii:binascii.a2b_hqx()binascii.b2a_hqx()binascii.rlecode_hqx()binascii.rldecode_hqx()
Функция
binascii.crc_hqx()остаётся доступной.(Автор: Victor Stinner в bpo-45085.)
Удалена команда
distutilsbdist_msi, устаревшая в Python 3.9. Вместо неё используйтеbdist_wheel(wheel-пакеты). (Автор: Hugo van Kemenade в bpo-45124.)Удалены методы
__getitem__()уxml.dom.pulldom.DOMEventStream,wsgiref.util.FileWrapperиfileinput.FileInput, объявленные устаревшими с Python 3.9. (Автор: Hugo van Kemenade в bpo-45132.)Удалены устаревшие функции
gettext:lgettext(),ldgettext(),lngettext()иldngettext(). Также удалены функцияbind_textdomain_codeset(), методыNullTranslations.output_charset()иNullTranslations.set_output_charset(), а также параметр codeset функцийtranslation()иinstall(), поскольку они используются только для функцийl*gettext(). (Авторы: Donghee Na и Serhiy Storchaka в bpo-44235.)Удалено из модуля
inspect:Функция
getargspec(), устаревшая с Python 3.0; используйтеinspect.signature()илиinspect.getfullargspec()вместо неё.Функция
formatargspec(), устаревшая с Python 3.5; используйте функциюinspect.signature()или непосредственно объектinspect.Signature.Незадокументированные методы
Signature.from_builtin()иSignature.from_function(), устаревшие с Python 3.5; вместо них используйте методSignature.from_callable().
(Автор: Hugo van Kemenade в bpo-45320.)
Удалён метод
__class_getitem__()изpathlib.PurePath, поскольку он не использовался и был добавлен по ошибке в предыдущих версиях. (Автор: Nikita Sobolev в bpo-46483.)Удалён класс
MailmanProxyиз модуляsmtpd, так как он непригоден для использования без внешнего пакетаmailman. (Автор: Donghee Na в bpo-35800.)Удалён устаревший метод
split()объекта_tkinter.TkappType. (Автор: Erlend E. Aasland в bpo-38371.)Удалена поддержка пакетов пространства имён из обнаружения
unittest. Она была введена в Python 3.4, но была неработоспособна начиная с Python 3.7. (Автор: Inada Naoki в bpo-23882.)Удалён недокументированный приватный метод
float.__set_format__(), ранее известный какfloat.__setformat__()в Python 3.7. Его докстринг гласил: «Вероятно, вам не следует использовать эту функцию. Она существует в основном для использования в тестовом наборе Python». (Автор: Victor Stinner в bpo-46852.)Флаг конфигурации
--experimental-isolated-subinterpreters(и соответствующий макросEXPERIMENTAL_ISOLATED_SUBINTERPRETERS) были удалены.Pynche – The Pythonically Natural Color and Hue Editor – был вынесен из
Tools/scriptsи развивается независимо от дерева исходных кодов Python.
Перенос на Python 3.11¶Porting to Python 3.11
В этом разделе перечислены описанные ранее изменения и другие исправления ошибок в Python API, которые могут потребовать изменений в коде Python.
Замечания по переносу для C API приведены отдельно.
open(),io.open(),codecs.open()иfileinput.FileInputбольше не принимают'U'(«универсальный символ новой строки») в режиме файла. В Python 3 режим «универсального символа новой строки» используется по умолчанию при открытии файла в текстовом режиме, а флаг'U'устарел начиная с Python 3.3. Параметр параметр newline этих функций управляет работой универсальных символов новой строки. (Автор: Victor Stinner в bpo-37330.)Позиции узлов
ast.ASTтеперь проверяются при передаче вcompile()и другие связанные функции. Если обнаружены недопустимые позиции, будет вызвано исключениеValueError. (Автор: Pablo Galindo в gh-93351)Запрещена передача исполнителей, не являющихся
concurrent.futures.ThreadPoolExecutor, вasyncio.loop.set_default_executor()после объявления устаревшим в Python 3.8. (Автор: Illia Volochii в bpo-43234.)calendar: классыcalendar.LocaleTextCalendarиcalendar.LocaleHTMLCalendarтеперь используютlocale.getlocale()вместоlocale.getdefaultlocale(), если локаль не указана. (Автор: Victor Stinner в bpo-46659.)Модуль
pdbтеперь читает конфигурационный файл.pdbrcс кодировкой'UTF-8'. (Автор: Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) в bpo-41137.)Параметр популяция функции
random.sample()должен быть последовательностью, и автоматическое преобразованиеsetвlistбольше не поддерживается. Кроме того, если размер выборки превышает размер популяции, вызывается исключениеValueError. (Автор: Raymond Hettinger в bpo-40465.)Необязательный параметр random функции
random.shuffle()был удалён. Ранее это была произвольная случайная функция для перемешивания; теперь всегда будет использоватьсяrandom.random()(её предыдущее значение по умолчанию).В
reСинтаксис регулярных выражений глобальные встроенные флаги (например,(?i)) теперь можно использовать только в начале регулярных выражений. Использование их в других местах объявлено устаревшим начиная с Python 3.6. (Автор: Serhiy Storchaka в bpo-47066.)В модуле
reбыли исправлены несколько давних ошибок, которые в редких случаях могли приводить к неверным результатам в захватываемых группах. Поэтому в этих случаях может измениться захваченный вывод. (Автор: Ma Lin в bpo-35859.)
Изменения в сборке¶Build Changes
В CPython теперь есть PEP 11 поддержка третьего уровня для кросс-компиляции на платформы WebAssembly Emscripten (
wasm32-unknown-emscripten, т.е. Python в браузере) и WebAssembly System Interface (WASI) (wasm32-unknown-wasi). Эта работа вдохновлена предыдущими проектами, такими как Pyodide. Эти платформы предоставляют ограниченное подмножество POSIX API; возможности и модули стандартной библиотеки Python, связанные с сетью, процессами, потоками, сигналами, mmap, пользователями/группами, недоступны или не работают. (Emscripten: авторы Christian Heimes и Ethan Smith в gh-84461 и WASI: автор Christian Heimes в gh-90473; платформы повышены до уровня в gh-95085)Для сборки CPython теперь требуется:
Макрос
Py_NO_NANбыл удалён. Поскольку CPython теперь требует IEEE 754 с плавающей запятой, значения NaN всегда доступны. (Автор: Victor Stinner в bpo-46656.)Пакет
tkinterтеперь требует Tcl/Tk версии 8.5.12 или новее. (Автор: Serhiy Storchaka в bpo-46996.)Зависимости сборки, флаги компилятора и флаги компоновщика для большинства модулей расширения стандартной библиотеки теперь определяются с помощью configure. Флаги для libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk и uuid определяются pkg-config (при наличии). Для
tkinterтеперь требуется команда pkg-config, чтобы определить настройки разработки для заголовков и библиотек Tcl/Tk. (Авторы: Christian Heimes и Erlend Egeberg Aasland в bpo-45847, bpo-45747 и bpo-45763.)libpython больше не компонуется с libcrypt. (Автор: Mike Gilbert в bpo-45433.)
CPython теперь может быть собран с опцией ThinLTO путём передачи
thinв--with-lto, т.е.--with-lto=thin. (Авторы: Donghee Na и Brett Holman в bpo-44340.)Списки свободных блоков для структур объектов теперь можно отключить. Новая опция configure
--without-freelistsможет использоваться для отключения всех списков свободных блоков, кроме синглтона пустого кортежа. (Автор: Christian Heimes в bpo-45522.)Modules/SetupиModules/makesetupбыли улучшены и доработаны. Модули расширения теперь можно собирать черезmakesetup. Все, кроме некоторых тестовых модулей, могут быть статически скомпонованы в основную программу или библиотеку. (Авторы: Brett Cannon и Christian Heimes в bpo-45548, bpo-45570, bpo-45571 и bpo-43974.)Примечание
Используйте переменные окружения
TCLTK_CFLAGSиTCLTK_LIBSдля ручного указания расположения заголовков Tcl/Tk и библиотек. Опции configure--with-tcltk-includesи--with-tcltk-libsбыли удалены.В RHEL 7 и CentOS 7 пакеты разработки не предоставляют
tcl.pcиtk.pc; используйтеTCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5". КаталогMisc/rhel7содержит файлы.pcи инструкции о том, как собрать Python с Tcl/Tk и OpenSSL из RHEL 7 и CentOS 7.CPython теперь будет использовать 30-битные цифры по умолчанию для реализации
intPython. Ранее по умолчанию использовались 30-битные цифры на платформах сSIZEOF_VOID_P >= 8, и 15-битные цифры в остальных случаях. По-прежнему возможно явно запросить использование 15-битных цифр через опцию--enable-big-digitsскрипта configure или (для Windows) переменнуюPYLONG_BITS_IN_DIGITвPC/pyconfig.h, но эта опция может быть удалена в будущем. (Автор: Mark Dickinson в bpo-45569.)
Изменения в C API¶C API Changes
Новые возможности¶New Features
Добавлена новая функция
PyType_GetName()для получения краткого имени типа. (Автор: Hai Shi в bpo-42035.)Добавлена новая функция
PyType_GetQualName()для получения полного имени типа. (Автор: Hai Shi в bpo-42035.)Добавлены новые функции
PyThreadState_EnterTracing()иPyThreadState_LeaveTracing()в ограниченный C API для приостановки и возобновления трассировки и профилирования. (Автор: Victor Stinner в bpo-43760.)Добавлена константа
Py_Version, которая имеет то же значение, что иPY_VERSION_HEX. (Автор: Gabriele N. Tornetta в bpo-43931.)Py_bufferи API теперь являются частью ограниченного API и стабильного ABI:слоты типов
bf_getbufferиbf_releasebuffer
(Автор: Christian Heimes в bpo-45459.)
Добавлена функция
PyType_GetModuleByDef(), используемая для получения модуля, в котором был определён метод, в тех случаях, когда эта информация недоступна напрямую (черезPyCMethod). (Автор: Petr Viktorin в bpo-46613.)Добавлены новые функции для упаковки и распаковки C double (сериализации и десериализации):
PyFloat_Pack2(),PyFloat_Pack4(),PyFloat_Pack8(),PyFloat_Unpack2(),PyFloat_Unpack4()иPyFloat_Unpack8(). (Автор: Victor Stinner в bpo-46906.)Добавлены новые функции для получения атрибутов объекта фрейма:
PyFrame_GetBuiltins(),PyFrame_GetGenerator(),PyFrame_GetGlobals(),PyFrame_GetLasti().Добавлены две новые функции для получения и установки активного экземпляра исключения:
PyErr_GetHandledException()иPyErr_SetHandledException(). Это альтернативы функциямPyErr_SetExcInfo()иPyErr_GetExcInfo(), которые работают с устаревшим представлением исключений в виде кортежа из 3 элементов. (Автор: Irit Katriel в bpo-46343.)Добавлен элемент
PyConfig.safe_path. (Автор: Victor Stinner в gh-57684.)
Переход на Python 3.11¶Porting to Python 3.11
Некоторые макросы были преобразованы в статические встроенные функции, чтобы избежать проблем макросов. Изменение должно быть в основном незаметным для пользователей, поскольку функции-заменители приводят свои аргументы к ожидаемым типам, чтобы избежать предупреждений компилятора из-за статических проверок типов. Однако, когда ограниченный C API установлен на >=3.11, эти приведения не выполняются, и вызывающим сторонам потребуется приводить аргументы к ожидаемым типам. Подробнее см. PEP 670. (Авторы: Victor Stinner и Erlend E. Aasland в gh-89653.)
PyErr_SetExcInfo()больше не использует аргументыtypeиtraceback, интерпретатор теперь получает эти значения из экземпляра исключения (аргументvalue). Функция по-прежнему похищает ссылки всех трёх аргументов. (Автор: Irit Katriel в bpo-45711.)PyErr_GetExcInfo()теперь получает поляtypeиtracebackрезультата из экземпляра исключения (полеvalue). (Автор: Irit Katriel в bpo-45711.)_frozenимеет новое полеis_package, указывающее, является ли замороженный модуль пакетом. Ранее отрицательное значение в полеsizeбыло индикатором. Теперь дляsizeиспользуются только неотрицательные значения. (Автор: Kumar Aditya в bpo-46608.)_PyFrameEvalFunction()теперь принимает_PyInterpreterFrame*в качестве второго параметра вместоPyFrameObject*. Подробнее об использовании этого типа указателя на функцию см. в PEP 523.PyCode_New()иPyCode_NewWithPosOnlyArgs()теперь принимают дополнительный аргументexception_table. По возможности следует избегать использования этих функций. Чтобы получить пользовательский объект кода: создайте объект кода с помощью компилятора, затем получите изменённую версию методомreplace.PyCodeObjectбольше не имеет полейco_code,co_varnames,co_cellvarsиco_freevars. Вместо этого используйтеPyCode_GetCode(),PyCode_GetVarnames(),PyCode_GetCellvars()иPyCode_GetFreevars()соответственно для доступа к ним через C API. (Авторы: Brandt Bucher в bpo-46841 и Ken Jin в gh-92154 и gh-94936.)Старые макросы trashcan (
Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) теперь устарели. Их следует заменить новыми макросамиPy_TRASHCAN_BEGINиPy_TRASHCAN_END.Функция tp_dealloc с использованием старых макросов, например:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
должна быть переведена на новые макросы следующим образом:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
Обратите внимание, что
Py_TRASHCAN_BEGINпринимает второй аргумент, который должен быть функцией освобождения, в которой он находится.Для поддержки старых версий Python в той же кодовой базе можно определить следующие макросы и использовать их по всему коду (источник: эти макросы скопированы из кодовой базы
mypy):#if PY_VERSION_HEX >= 0x03080000 # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END #else # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) #endif
Функция
PyType_Ready()теперь вызывает ошибку, если тип определён с установленным флагомPy_TPFLAGS_HAVE_GC, но не имеет функции обхода (PyTypeObject.tp_traverse). (Автор: Victor Stinner в bpo-44263.)Heap-типы с флагом
Py_TPFLAGS_IMMUTABLETYPEтеперь могут наследовать протокол vectorcall PEP 590. Ранее это было возможно только для статических типов. (Автор: Erlend E. Aasland в bpo-43908)Поскольку
Py_TYPE()изменена на встроенную статическую функцию,Py_TYPE(obj) = new_typeнеобходимо заменить наPy_SET_TYPE(obj, new_type): см. функциюPy_SET_TYPE()(доступна начиная с Python 3.9). Для обратной совместимости можно использовать этот макрос:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE) static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { ob->ob_type = type; } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type) #endif
(Автор: Victor Stinner в bpo-39573.)
Поскольку
Py_SIZE()изменена на встроенную статическую функцию,Py_SIZE(obj) = new_sizeнеобходимо заменить наPy_SET_SIZE(obj, new_size): см. функциюPy_SET_SIZE()(доступна начиная с Python 3.9). Для обратной совместимости можно использовать этот макрос:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE) static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { ob->ob_size = size; } #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size) #endif
(Автор: Victor Stinner в bpo-39573.)
<Python.h>больше не включает заголовочные файлы<stdlib.h>,<stdio.h>,<errno.h>и<string.h>, когда макросPy_LIMITED_APIустановлен в0x030b0000(Python 3.11) или выше. Расширения C должны явно включать эти заголовочные файлы после#include <Python.h>. (Автор: Victor Stinner в bpo-45434.)Файлы неограниченного API
cellobject.h,classobject.h,code.h,context.h,funcobject.h,genobject.hиlongintrepr.hбыли перемещены в каталогInclude/cpython. Кроме того, заголовочный файлeval.hбыл удалён. Эти файлы не должны включаться напрямую, так как они уже включены вPython.h: Include Files. Если они включались напрямую, рассмотрите возможность включенияPython.hвместо этого. (Автор: Victor Stinner в bpo-35134.)Макрос
PyUnicode_CHECK_INTERNED()был исключён из ограниченного C API. Он никогда не был там пригоден к использованию, потому что использовал внутренние структуры, недоступные в ограниченном C API. (Автор: Victor Stinner в bpo-46007.)Следующие функции и тип для работы с фреймами теперь доступны напрямую через
#include <Python.h>, больше не нужно добавлять#include <frameobject.h>:(Автор: Victor Stinner в gh-93937.)
Элементы структуры
PyFrameObjectбыли удалены из публичного C API.Хотя в документации указано, что поля
PyFrameObjectмогут измениться в любой момент, они долгое время оставались стабильными и использовались в нескольких популярных расширениях.В Python 3.11 структура кадра была реорганизована для оптимизации производительности. Некоторые поля были полностью удалены, так как они были деталями старой реализации.
Поля
PyFrameObject:f_back: используйтеPyFrame_GetBack().f_blockstack: удалено.f_builtins: используйтеPyFrame_GetBuiltins().f_code: используйтеPyFrame_GetCode().f_gen: используйтеPyFrame_GetGenerator().f_globals: используйтеPyFrame_GetGlobals().f_iblock: удалено.f_lasti: используйтеPyFrame_GetLasti(). Код, использующийf_lastiсPyCode_Addr2Line(), должен использоватьPyFrame_GetLineNumber()вместо этого; это может быть быстрее.f_lineno: используйтеPyFrame_GetLineNumber()f_locals: используйтеPyFrame_GetLocals().f_stackdepth: удалено.f_state: нет публичного API (переименовано вf_frame.f_state).f_trace: нет публичного API.f_trace_lines: используйтеPyObject_GetAttrString((PyObject*)frame, "f_trace_lines").f_trace_opcodes: используйтеPyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes").f_localsplus: нет публичного API (переименовано вf_frame.localsplus).f_valuestack: удалено.
Объект кадра Python теперь создаётся лениво. Побочный эффект: к элементу
f_backнельзя обращаться напрямую, так как его значение теперь также вычисляется лениво. Вместо этого необходимо вызывать функциюPyFrame_GetBack().Отладчики, которые обращались к
f_localsнапрямую, должны вызыватьPyFrame_GetLocals()вместо этого. Им больше не нужно вызыватьPyFrame_FastToLocalsWithError()илиPyFrame_LocalsToFast(), более того, не следует вызывать эти функции. Необходимое обновление кадра теперь управляется виртуальной машиной.Код, определяющий
PyFrame_GetCode()в Python 3.8 и старше:#if PY_VERSION_HEX < 0x030900B1 static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) { Py_INCREF(frame->f_code); return frame->f_code; } #endif
Код, определяющий
PyFrame_GetBack()в Python 3.8 и старше:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) { Py_XINCREF(frame->f_back); return frame->f_back; } #endif
Или используйте проект pythoncapi_compat, чтобы получить эти две функции в старых версиях Python.
Изменения элементов структуры
PyThreadState:frame: удалено, используйтеPyThreadState_GetFrame()(функция добавлена в Python 3.9 в bpo-40429). Предупреждение: функция возвращает сильную ссылку, необходимо вызвать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
Или используйте проект pythoncapi-compat, чтобы получить эти функции в старых версиях Python.
Распространителям рекомендуется собирать Python с оптимизированной библиотекой Blake2 libb2.
Теперь для инициализации с использованием
PyConfig.module_search_pathsдля инициализацииsys.pathполеPyConfig.module_search_paths_setдолжно быть установлено в 1. В противном случае инициализация пересчитает путь и заменит любые значения, добавленные вmodule_search_paths.PyConfig_Read()больше не вычисляет начальный путь поиска и не будет заполнять значения вPyConfig.module_search_paths. Чтобы вычислить пути по умолчанию и затем изменить их, завершите инициализацию и используйтеPySys_GetObject()для полученияsys.pathв виде объекта списка Python и измените его напрямую.
Устарело¶Deprecated
Объявить устаревшими следующие функции для настройки инициализации Python:
PySys_AddWarnOptionUnicode()PySys_AddWarnOption()PySys_AddXOption()PySys_HasWarnOptions()PySys_SetArgvEx()PySys_SetArgv()PySys_SetPath()Py_SetPath()Py_SetProgramName()Py_SetPythonHome()Py_SetStandardStreamEncoding()_Py_SetProgramFullPath()
Используйте новый API
PyConfigиз конфигурации инициализации Python вместо этого (PEP 587). (Автор: Victor Stinner в gh-88279.)Устарел элемент
ob_shashизPyBytesObject. Вместо него используйтеPyObject_Hash(). (Автор: Inada Naoki в bpo-46864.)
Запланировано к удалению в Python 3.12¶Pending Removal in Python 3.12
Следующие C API были объявлены устаревшими в предыдущих версиях Python и будут удалены в Python 3.12.
PyUnicode_AS_DATA()PyUnicode_AS_UNICODE()PyUnicode_AsUnicodeAndSize()PyUnicode_AsUnicode()PyUnicode_FromUnicode()PyUnicode_GET_DATA_SIZE()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_IS_COMPACT()PyUnicode_IS_READY()PyUnicode_WSTR_LENGTH()_PyUnicode_AsUnicode()PyUnicode_WCHAR_KINDPyUnicode_InternImmortal()
Удалено¶Removed
PyFrame_BlockSetup()иPyFrame_BlockPop()были удалены. (Автор: Mark Shannon в bpo-40222.)Удалите следующие математические макросы, использующие переменную
errno:Py_ADJUST_ERANGE1()Py_ADJUST_ERANGE2()Py_OVERFLOWED()Py_SET_ERANGE_IF_OVERFLOW()Py_SET_ERRNO_ON_MATH_ERROR()
(Автор: Victor Stinner в bpo-45412.)
Удалите макросы
Py_UNICODE_COPY()иPy_UNICODE_FILL(), устаревшие начиная с Python 3.3. Вместо них используйтеPyUnicode_CopyCharacters()илиmemcpy()(строкуwchar_t*) и функцииPyUnicode_Fill(). (Автор: Victor Stinner в bpo-41123.)Удалите заголовочный файл
pystrhex.h. Он содержит только внутренние функции. Расширения C должны включать только главный заголовочный файл<Python.h>. (Автор: Victor Stinner в bpo-45434.)Удалите макрос
Py_FORCE_DOUBLE(). Он использовался макросомPy_IS_INFINITY(). (Автор: Victor Stinner в bpo-45440.)Следующие элементы больше не доступны, когда определён
Py_LIMITED_API:макрос
Py_MARSHAL_VERSION
Они не являются частью ограниченного API.
(Автор: Victor Stinner в bpo-45474.)
Исключите
PyWeakref_GET_OBJECT()из ограниченного C API. Он никогда не работал, поскольку структураPyWeakReferenceявляется непрозрачной в ограниченном C API. (Автор: Victor Stinner в bpo-35134.)Удалите макрос
PyHeapType_GET_MEMBERS(). Он был по ошибке включён в публичный C API, этот макрос должен использоваться только внутри Python. Вместо него используйте элементPyTypeObject.tp_members. (Автор: Victor Stinner в bpo-40170.)Удалите макрос
HAVE_PY_SET_53BIT_PRECISION(перенесён во внутренний C API). (Автор: Victor Stinner в bpo-45412.)
Удалите API кодировщиков
Py_UNICODE, так как они устарели начиная с Python 3.3, редко используются и неэффективны по сравнению с рекомендуемыми альтернативами.Удалённые функции:
PyUnicode_Encode()PyUnicode_EncodeASCII()PyUnicode_EncodeLatin1()PyUnicode_EncodeUTF7()PyUnicode_EncodeUTF8()PyUnicode_EncodeUTF16()PyUnicode_EncodeUTF32()PyUnicode_EncodeUnicodeEscape()PyUnicode_EncodeRawUnicodeEscape()PyUnicode_EncodeCharmap()PyUnicode_TranslateCharmap()PyUnicode_EncodeDecimal()PyUnicode_TransformDecimalToASCII()
Подробнее см. PEP 624 и руководство по миграции. (Автор: Inada Naoki в bpo-44029.)
Заметные изменения в 3.11.4¶Notable changes in 3.11.4
tarfile¶
Методы извлечения в
tarfileиshutil.unpack_archive()получили новый аргумент filter, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. Extraction filters. В Python 3.12 использование без аргумента filter вызоветDeprecationWarning. В Python 3.14 значение по умолчанию будет изменено на'data'. (Автор: Petr Viktorin в PEP 706.)
Заметные изменения в 3.11.5¶Notable changes in 3.11.5
OpenSSL¶
Сборки для Windows и установщики для macOS с python.org теперь используют OpenSSL 3.0.
Эта страница – перевод. Оригинал на английском – docs.python.org. Нашли неточность? Сообщите нам.