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

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

Редактор:

Łukasz Langa

В этой статье описываются новые возможности Python 3.9 по сравнению с 3.8. Python 3.9 был выпущен 5 октября 2020 года. Подробнее см. в списке изменений.

См. также

PEP 596 – график выпуска Python 3.9

Итоги – основные измененияSummary – Release highlights

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

  • PEP 584, добавлены операторы объединения для dict;

  • PEP 585 – аннотации типов для обобщённых типов в стандартных коллекциях;

  • PEP 614 – ослаблены грамматические ограничения на декораторы.

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

  • PEP 616 – строковые методы для удаления префиксов и суффиксов.

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

  • PEP 593 – гибкие аннотации функций и переменных;

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

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

  • PEP 573 – быстрый доступ к состоянию модуля из методов типов C-расширений;

  • PEP 617 – CPython теперь использует новый парсер на основе PEG;

  • ряд встроенных функций Python (range, tuple, set, frozenset, list, dict) теперь ускорены с помощью PEP 590 vectorcall;

  • сборка мусора не блокируется на воскрешённых объектах;

  • ряд модулей Python (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, math, operator, resource, time, _weakref) теперь используют многофазную инициализацию, определённую в PEP 489;

  • ряд модулей стандартной библиотеки (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) теперь используют стабильный ABI, определённый в PEP 384.

Новые модули библиотеки:

  • PEP 615 – база данных часовых поясов IANA теперь присутствует в стандартной библиотеке в модуле zoneinfo;

  • реализация топологической сортировки графа теперь предоставляется в новом модуле graphlib.

Изменения в процессе выпуска:

  • PEP 602 – CPython переходит на ежегодный цикл выпуска.

Следует проверять наличие DeprecationWarning в кодеYou should check for DeprecationWarning in your code

Когда Python 2.7 ещё поддерживался, в Python 3 было сохранено множество функций для обратной совместимости с Python 2.7. С прекращением поддержки Python 2 эти прослойки обратной совместимости были удалены или будут удалены в ближайшее время. Большинство из них в течение нескольких лет выдавали предупреждение DeprecationWarning. Например, использование collections.Mapping вместо collections.abc.Mapping вызывает DeprecationWarning начиная с Python 3.3, выпущенного в 2012 году.

Протестируйте приложение с параметром командной строки -W default, чтобы увидеть DeprecationWarning и PendingDeprecationWarning, или даже с -W error, чтобы обрабатывать их как ошибки. Фильтр предупреждений можно использовать для игнорирования предупреждений из стороннего кода.

Python 3.9 – последняя версия, предоставляющая эти прослойки обратной совместимости с Python 2, чтобы дать разработчикам проектов на Python больше времени для организации удаления поддержки Python 2 и добавления поддержки Python 3.9.

Псевдонимы абстрактных базовых классов в модуле collections, например псевдоним collections.Mapping для collections.abc.Mapping, сохраняются в последнем релизе для обратной совместимости. Они будут удалены из Python 3.10.

В более общем смысле, старайтесь запускать тесты в режиме разработки Python, который помогает подготовить код к совместимости со следующей версией Python.

Примечание: в этой версии Python также были удалены некоторые ранее существовавшие устаревшие возможности. Обратитесь к разделу Удалено.

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

Операторы слияния и обновления словарейDictionary Merge & Update Operators

Операторы слияния (|) и обновления (|=) были добавлены во встроенный класс dict. Они дополняют существующие методы слияния словарей dict.update и {**d1, **d2}.

Пример:

>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

См. PEP 584 для полного описания. (Автор: Brandt Bucher в bpo-36144.)

Новые строковые методы для удаления префиксов и суффиксовNew String Methods to Remove Prefixes and Suffixes

Добавлены str.removeprefix(prefix) и str.removesuffix(suffix) для простого удаления ненужного префикса или суффикса из строки. Также добавлены соответствующие методы bytes, bytearray и collections.UserString. См. PEP 616 для полного описания. (Автор: Dennis Sweeney в bpo-39939.)

Обобщения (generics) для подсказок типов в стандартных коллекцияхType Hinting Generics in Standard Collections

В аннотациях типов теперь можно использовать встроенные типы коллекций, такие как list и dict, в качестве обобщённых типов, вместо импорта соответствующих типов с заглавной буквы (например, List или Dict) из typing. Некоторые другие типы в стандартной библиотеке теперь также являются обобщёнными, например queue.Queue.

Пример:

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

См. PEP 585 для подробностей. (Авторы: Guido van Rossum, Ethan Smith и Batuhan Taşkaya в bpo-39481.)

Новый парсерNew Parser

Python 3.9 использует новый парсер на основе PEG вместо LL(1). Производительность нового парсера примерно сравнима со старым, но формализм PEG более гибок, чем LL(1), когда речь идёт о проектировании новых возможностей языка. Мы начнём использовать эту гибкость в Python 3.10 и далее.

Модуль ast использует новый парсер и генерирует то же AST, что и старый парсер.

В Python 3.10 старый парсер будет удалён, а вместе с ним и все функции, зависящие от него (прежде всего модуль parser, который давно устарел). В Python 3.9 только можно переключиться обратно на парсер LL(1) с помощью параметра командной строки (-X oldparser) или переменной окружения (PYTHONOLDPARSER=1).

См. PEP 617 для подробностей. (Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в bpo-40334.)

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

  • __import__() теперь вызывает ImportError вместо ValueError, что ранее происходило, когда относительный импорт выходил за пределы своего пакета верхнего уровня. (Автор: Ngalim Siregar в bpo-37444.)

  • Python теперь получает абсолютный путь к имени файла сценария, указанному в командной строке (например: python3 script.py): атрибут __file__ модуля __main__ стал абсолютным путём, а не относительным. Эти пути теперь остаются действительными после изменения текущего каталога с помощью os.chdir(). Как побочный эффект, трассировка также отображает абсолютный путь для кадров модуля __main__ в этом случае. (Автор: Victor Stinner в bpo-20443.)

  • В режиме разработки Python и в отладочной сборке теперь проверяются аргументы encoding и errors для операций кодирования и декодирования строк. Примеры: open(), str.encode() и bytes.decode().

    По умолчанию для максимальной производительности аргумент errors проверяется только при первой ошибке кодирования/декодирования, а аргумент encoding иногда игнорируется для пустых строк. (Автор: Victor Stinner в bpo-37388.)

  • "".replace("", s, n) теперь возвращает s вместо пустой строки для всех ненулевых n. Теперь это согласовано с "".replace("", s). Аналогичные изменения внесены для объектов bytes и bytearray. (Автор: Serhiy Storchaka в bpo-28029.)

  • Любое допустимое выражение теперь может использоваться в качестве декоратора. Ранее грамматика была гораздо более ограничительной. См. PEP 614 для подробностей. (Автор: Brandt Bucher в bpo-39702.)

  • Улучшена справка для модуля typing. Теперь докстринги отображаются для всех специальных форм и специальных обобщённых псевдонимов (например, Union и List). Использование help() с обобщённым псевдонимом, например List[int], покажет справку для соответствующего конкретного типа (list в данном случае). (Автор: Serhiy Storchaka в bpo-40257.)

  • Параллельный запуск aclose() / asend() / athrow() теперь запрещён, а ag_running теперь отражает фактический статус выполнения асинхронного генератора. (Автор: Yury Selivanov в bpo-30773.)

  • Неожиданные ошибки при вызове метода __iter__ больше не маскируются TypeError в операторе in и функциях contains(), indexOf() и countOf() модуля operator. (Автор: Serhiy Storchaka в bpo-40824.)

  • Лямбда-выражения без скобок больше не могут быть частью выражения в предложении if в включениях и генераторных выражениях. См. bpo-41848 и bpo-43755 для подробностей.

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

zoneinfo

Модуль zoneinfo добавляет поддержку базы данных часовых поясов IANA в стандартную библиотеку. Он добавляет zoneinfo.ZoneInfo – конкретную реализацию datetime.tzinfo, основанную на системных данных о часовых поясах.

Пример:

>>> from zoneinfo import ZoneInfo
>>> import datetime as dt

>>> # Летнее время
>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00
>>> when.tzname()
'PDT'

>>> # Стандартное время
>>> when += dt.timedelta(days=7)
>>> print(when)
2020-11-07 12:00:00-08:00
>>> print(when.tzname())
PST

В качестве резервного источника данных для платформ, не поставляющих базу данных IANA, модуль tzdata был выпущен как пакет первого уровня – распространяется через PyPI и поддерживается основной командой CPython.

См. также

PEP 615 – Поддержка базы данных часовых поясов IANA в стандартной библиотеке

PEP написан и реализован Полом Ганслом.

graphlib

Добавлен новый модуль graphlib, содержащий класс graphlib.TopologicalSorter для топологической сортировки графов. (Авторы: Pablo Galindo, Tim Peters и Larry Hastings в bpo-17005.)

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

ast

Добавлена опция indent в dump(), позволяющая создавать многострочный вывод с отступами. (Автор: Serhiy Storchaka в bpo-37995.)

Добавлена функция ast.unparse() в модуль ast, которую можно использовать для обратного синтаксического анализа объекта ast.AST и получения строки с кодом, который при разборе даст эквивалентный объект ast.AST. (Авторы: Pablo Galindo и Batuhan Taskaya в bpo-38870.)

Добавлены строки документации к узлам AST, содержащие сигнатуру ASDL, используемую для создания этого узла. (Автор: Batuhan Taskaya в bpo-39638.)

asyncio

Из-за серьёзных проблем безопасности параметр reuse_address функции asyncio.loop.create_datagram_endpoint() больше не поддерживается. Это связано с поведением опции сокета SO_REUSEADDR в UDP. Подробнее см. документацию loop.create_datagram_endpoint(). (Авторы: Kyle Stanley, Antoine Pitrou и Yury Selivanov в bpo-37228.)

Добавлена новая корутина shutdown_default_executor(), которая планирует завершение работы для исполнителя по умолчанию, ожидая закрытия ThreadPoolExecutor. Кроме того, asyncio.run() обновлена для использования новой корутины. (Автор: Kyle Stanley в bpo-34037.)

Добавлена asyncio.PidfdChildWatcher, реализация наблюдателя за дочерними процессами для Linux, которая опрашивает файловые дескрипторы процессов. (bpo-38692)

Добавлена новая корутина asyncio.to_thread(). В основном используется для выполнения функций, связанных с вводом-выводом, в отдельном потоке, чтобы не блокировать цикл событий, и по сути работает как высокоуровневая версия run_in_executor(), которая может напрямую принимать именованные аргументы. (Авторы: Kyle Stanley и Yury Selivanov в bpo-32309.)

При отмене задачи из-за тайм-аута asyncio.wait_for() теперь будет ждать завершения отмены также и в случае, когда timeout <= 0, как и при положительных значениях тайм-аута. (Автор: Elvis Pranskevichus в bpo-32751.)

asyncio теперь вызывает TypeError при вызове несовместимых методов с сокетом ssl.SSLSocket. (Автор: Ido Michael в bpo-37404.)

compileall

Добавлена новая возможность использовать жёсткие ссылки для дублирующихся файлов .pyc: параметр hardlink_dupes и опция командной строки –hardlink-dupes. (Автор: Lumír ‘Frenzy’ Balhar в bpo-40495.)

Добавлены новые опции для управления путями в результирующих файлах .pyc: параметры stripdir, prependdir, limit_sl_dest и опции командной строки -s, -p, -e. Добавлена возможность указывать опцию для уровня оптимизации несколько раз. (Автор: Lumír ‘Frenzy’ Balhar в bpo-38112.)

concurrent.futures

Добавлен новый параметр cancel_futures в concurrent.futures.Executor.shutdown(), который отменяет все ожидающие выполнения future, которые ещё не начали выполняться, вместо ожидания их завершения перед остановкой исполнителя. (Автор: Kyle Stanley в bpo-39349.)

Удалены потоки-демоны из ThreadPoolExecutor и ProcessPoolExecutor. Это улучшает совместимость с под-интерпретаторами и предсказуемость процессов их завершения. (Автор: Kyle Stanley в bpo-39812.)

Рабочие процессы в ProcessPoolExecutor теперь создаются по требованию, только когда нет свободных рабочих процессов для повторного использования. Это оптимизирует накладные расходы при запуске и уменьшает количество потерянного процессорного времени на простаивающие рабочие процессы. (Автор: Kyle Stanley в bpo-39207.)

curses

Добавлены функции curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize() и curses.set_tabsize(). (Автор: Anthony Sottile в bpo-38312.)

datetime

Методы isocalendar() класса datetime.date и isocalendar() класса datetime.datetime теперь возвращают namedtuple() вместо tuple. (Автор: Donghee Na в bpo-24416.)

distutils

Команда upload теперь создаёт хеш-дайджесты SHA2-256 и Blake2b-256. Она пропускает MD5 на платформах, которые блокируют дайджест MD5. (Автор: Christian Heimes в bpo-40698.)

fcntl

Добавлены константы fcntl.F_OFD_GETLK, fcntl.F_OFD_SETLK и fcntl.F_OFD_SETLKW. (Автор: Donghee Na в bpo-38602.)

ftplib

FTP и FTP_TLS теперь вызывают исключение ValueError, если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в bpo-39259.)

gc

Когда сборщик мусора выполняет сборку, в ходе которой некоторые объекты воскресают (они становятся доступны извне изолированных циклов после выполнения финализаторов), сборка всех объектов, которые всё ещё недоступны, не блокируется. (Авторы: Pablo Galindo и Tim Peters в bpo-38379.)

Добавлена новая функция gc.is_finalized() для проверки, был ли объект финализирован сборщиком мусора. (Автор: Pablo Galindo в bpo-39322.)

hashlib

Модуль hashlib теперь может использовать хеши SHA3 и SHAKE XOF из OpenSSL при их наличии. (Автор: Christian Heimes в bpo-37630.)

Встроенные хеш-модули теперь можно отключить с помощью ./configure --without-builtin-hashlib-hashes или выборочно включить, например, ./configure --with-builtin-hashlib-hashes=sha3,blake2, чтобы принудительно использовать реализацию на основе OpenSSL. (Автор: Christian Heimes в bpo-40479)

http

Коды состояния HTTP 103 EARLY_HINTS, 418 IM_A_TEAPOT и 425 TOO_EARLY добавлены в http.HTTPStatus. (Авторы: Donghee Na в bpo-39509 и Ross Rhodes в bpo-39507.)

IDLE и idlelibIDLE and idlelib

Добавлена опция для отключения мигания курсора. (Автор: Zackery Spytz в bpo-4603.)

Клавиша Escape теперь закрывает окна автодополнения IDLE. (Автор: Johnny Najera в bpo-38944.)

Добавлены ключевые слова в список завершения имён модулей. (Автор: Terry J. Reedy в bpo-37765.)

Новое в корректирующих выпусках 3.9

IDLE теперь вызывает sys.excepthook() (при запуске без «-n»). Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в bpo-43008.)

Приведённые выше изменения были перенесены в корректирующие выпуски 3.8.

Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в bpo-40468.) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в bpo-33962.)

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

imaplib

IMAP4 и IMAP4_SSL теперь имеют необязательный параметр тайм-аут для своих конструкторов. Кроме того, метод open() теперь имеет необязательный параметр тайм-аут. Переопределённые методы IMAP4_SSL и IMAP4_stream были применены к этому изменению. (Автор: Donghee Na в bpo-38615.)

Добавлен imaplib.IMAP4.unselect(). imaplib.IMAP4.unselect() освобождает ресурсы сервера, связанные с выбранным почтовым ящиком, и возвращает сервер в состояние аутентификации. Эта команда выполняет те же действия, что и imaplib.IMAP4.close(), за исключением того, что никакие сообщения не удаляются безвозвратно из текущего выбранного почтового ящика. (Автор: Donghee Na в bpo-40375.)

importlib

Для улучшения согласованности с операторами import importlib.util.resolve_name() теперь вызывает ImportError вместо ValueError при попытке недопустимого относительного импорта. (Автор: Ngalim Siregar в bpo-37444.)

Загрузчики импорта, которые предоставляют неизменяемые объекты модулей, теперь могут предоставлять неизменяемые пакеты в дополнение к отдельным модулям. (Автор: Dino Viehland в bpo-39336.)

Добавлена функция importlib.resources.files() с поддержкой подкаталогов в данных пакета, что соответствует обратному порту в importlib_resources версии 1.5. (Автор: Jason R. Coombs в bpo-39791.)

Обновлён importlib.metadata из importlib_metadata версии 1.6.1.

inspect

inspect.BoundArguments.arguments изменён с OrderedDict на обычный dict. (Автор: Inada Naoki в bpo-36350 и bpo-39775.)

ipaddress

ipaddress теперь поддерживает адреса IPv6 с областью действия (IPv6-адрес с суффиксом %<scope_id>).

Адреса IPv6 с областью действия можно разобрать с помощью ipaddress.IPv6Address. Если присутствует, идентификатор зоны области действия доступен через атрибут scope_id. (Автор: Oleksandr Pavliuk в bpo-34788.)

Начиная с Python 3.9.5 модуль ipaddress больше не принимает ведущие нули в строках IPv4-адресов. (Автор: Christian Heimes в bpo-36384).

math

Расширена функция math.gcd() для обработки нескольких аргументов. Ранее она поддерживала только два аргумента. (Автор: Serhiy Storchaka в bpo-39648.)

Добавлена math.lcm(): возвращает наименьшее общее кратное указанных аргументов. (Авторы: Mark Dickinson, Ananthakrishnan и Serhiy Storchaka в bpo-39479 и bpo-39648.)

Добавлена math.nextafter(): возвращает следующее значение с плавающей запятой после x по направлению к y. (Автор: Victor Stinner в bpo-39288.)

Добавлена math.ulp(): возвращает значение младшего значащего бита числа с плавающей запятой. (Автор: Victor Stinner в bpo-39310.)

multiprocessing

Класс multiprocessing.SimpleQueue теперь имеет новый метод close() для явного закрытия очереди. (Автор: Victor Stinner в bpo-30966.)

nntplib

NNTP и NNTP_SSL теперь вызывают исключение ValueError, если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в bpo-39259.)

os

Добавлены CLD_KILLED и CLD_STOPPED для si_code. (Автор: Donghee Na в bpo-38493.)

Добавлены специфичные для Linux os.pidfd_open() (bpo-38692) и os.P_PIDFD (bpo-38713) для управления процессами с помощью файловых дескрипторов.

Функция os.unsetenv() теперь также доступна в Windows. (Автор: Victor Stinner в bpo-39413.)

Функции os.putenv() и os.unsetenv() теперь всегда доступны. (Автор: Victor Stinner в bpo-39395.)

Добавлена функция os.waitstatus_to_exitcode(): преобразует статус ожидания в код завершения. (Автор: Victor Stinner в bpo-40094.)

pathlib

Добавлен pathlib.Path.readlink(), который работает аналогично os.readlink(). (Автор: Girts Folkmanis в bpo-30618)

pdb

В Windows Pdb теперь поддерживает ~/.pdbrc. (Авторы: Tim Hopper и Dan Lidral-Porter в bpo-20523.)

poplib

POP3 и POP3_SSL теперь вызывают исключение ValueError, если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в bpo-39259.)

pprint

pprint теперь может красиво печатать types.SimpleNamespace. (Автор: Carl Bordum Hansen в bpo-37376.)

pydoc

Строка документации теперь отображается не только для классов, функций, методов и т.д., но и для любого объекта, у которого есть собственный атрибут __doc__. (Автор: Serhiy Storchaka в bpo-40257.)

random

Добавлен новый метод random.Random.randbytes(): генерирует случайные байты. (Автор: Victor Stinner в bpo-40286.)

signal

Добавлен специфичный для Linux signal.pidfd_send_signal() для отправки сигналов процессу с помощью файлового дескриптора вместо pid. (bpo-38712)

smtplib

SMTP и SMTP_SSL теперь вызывают исключение ValueError, если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в bpo-39259.)

Конструктор LMTP теперь имеет необязательный параметр timeout. (Автор: Donghee Na в bpo-39329.)

socket

Модуль socket теперь экспортирует константу CAN_RAW_JOIN_FILTERS в Linux 4.1 и выше. (Авторы: Stefan Tatschner и Zackery Spytz в bpo-25780.)

Модуль socket теперь поддерживает протокол CAN_J1939 на платформах, которые его поддерживают. (Автор: Karl Ding в bpo-40291.)

Модуль socket теперь содержит функции socket.send_fds() и socket.recv_fds(). (Авторы: Joannah Nanjekye, Shinya Okano и Victor Stinner, bpo-28724.)

time

На AIX thread_time() теперь реализован с помощью thread_cputime(), имеющего наносекундное разрешение, вместо clock_gettime(CLOCK_THREAD_CPUTIME_ID) с разрешением 10 миллисекунд. (Автор: Batuhan Taskaya, bpo-40192)

sys

Добавлен новый атрибут sys.platlibdir: имя каталога библиотек, зависящего от платформы. Он используется для построения пути к стандартной библиотеке и путям к установленным модулям расширения. На большинстве платформ он равен "lib". На Fedora и SuSE на 64-битных платформах он равен "lib64". (Авторы: Jan Matějek, Matěj Cepl, Charalampos Stratakis и Victor Stinner, bpo-1294959.)

Ранее sys.stderr использовал блочную буферизацию в неинтерактивном режиме. Теперь stderr по умолчанию всегда использует построчную буферизацию. (Автор: Jendrik Seipp, bpo-13601.)

tracemalloc

Добавлен tracemalloc.reset_peak() для установки пикового размера отслеживаемых блоков памяти равным текущему размеру, чтобы измерять пик для определённых участков кода. (Автор: Huon Wilson, bpo-40630.)

typing

PEP 593 представил тип typing.Annotated для декорирования существующих типов контекстно-зависимыми метаданными и новый параметр include_extras для typing.get_type_hints() доступа к метаданным во время выполнения. (Авторы: Till Varoquaux и Konstantin Kashin.)

unicodedata

База данных Unicode обновлена до версии 13.0.0. (bpo-39926).

venv

Сценарии активации, предоставляемые venv, теперь все единообразно задают настройку приглашения, всегда используя значение, указанное __VENV_PROMPT__. Ранее некоторые сценарии безусловно использовали __VENV_PROMPT__, другие только если оно было установлено (что было по умолчанию), а один использовал __VENV_NAME__ вместо. (Автор: Brett Cannon, bpo-37663.)

xml

Пробельные символы внутри атрибутов теперь сохраняются при сериализации xml.etree.ElementTree в XML-файл. Символы конца строки больше не нормализуются в 'n'. Это результат обсуждения интерпретации раздела 2.11 спецификации XML. (Автор: Mefistotelis, bpo-39011.)

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

  • Оптимизирован идиом для присваивания временной переменной в генераторах. Теперь for y in [expr] в генераторах работает так же быстро, как простое присваивание y = expr. Например:

    sums = [s for s in [0] for x in data for s in [s + x]]

    В отличие от оператора :=, этот идиом не выносит переменную во внешнюю область видимости.

    (Автор: Serhiy Storchaka, bpo-32856.)

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

    Ранее цикл выполнения байт-кода прерывался на каждой инструкции до тех пор, пока главный поток не обработает сигналы. (Автор: Victor Stinner, bpo-40010.)

  • Оптимизирован модуль subprocess на FreeBSD с использованием closefrom(). (Авторы: Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak и Victor Stinner, bpo-38061.)

  • PyLong_FromDouble() теперь до 1.87x быстрее для значений, помещающихся в long. (Автор: Sergey Fedoseev, bpo-37986.)

  • Ряд встроенных функций Python (range, tuple, set, frozenset, list, dict) теперь ускорены за счёт использования протокола vectorcall PEP 590. (Авторы: Donghee Na, Mark Shannon, Jeroen Demeyer и Petr Viktorin, bpo-37207.)

  • Оптимизирован set.difference_update() для случая, когда другое множество значительно больше базового. (Предложено Evgeny Kapun, код от Michele Orrù, bpo-8425.)

  • Аллокатор малых объектов Python (obmalloc.c) теперь разрешает (не более) одной пустой арене оставаться доступной для немедленного повторного использования, не возвращая её ОС. Это предотвращает «трешинг» в простых циклах, где арена могла бы создаваться и уничтожаться заново на каждой итерации. (Автор: Tim Peters, bpo-37257.)

  • Целочисленное деление с плавающей запятой теперь работает быстрее. Также обновлено сообщение ZeroDivisionError для этой операции. (Автор: Donghee Na, bpo-39434.)

  • Декодирование коротких ASCII-строк с помощью кодировок UTF-8 и ascii теперь примерно на 15% быстрее. (Автор: Inada Naoki, bpo-37348.)

Вот сводка улучшений производительности от Python 3.4 до Python 3.9:

Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    3.9
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
    read_global                     15.5    19.0    14.3    13.6     7.6    7.8
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.3
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
    write_global                    19.7    21.2    18.0    18.0    15.8   16.7
    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   19.5
    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   20.0
    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

Эти результаты были получены с помощью сценария тестирования доступа к переменным по адресу: Tools/scripts/var_access_benchmark.py. Сценарий отображает время в наносекундах. Тесты проводились на процессоре Intel® Core™ i7-4960HQ под управлением 64-битных сборок macOS, доступных на python.org.

УстарелоDeprecated

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

  • В настоящее время math.factorial() принимает экземпляры float с неотрицательными целочисленными значениями (например, 5.0). Для нецелых и отрицательных чисел с плавающей запятой возбуждается ValueError. Сейчас это поведение устарело. В будущих версиях Python для всех чисел с плавающей запятой будет возбуждаться TypeError. (Автор: Serhiy Storchaka в bpo-37315.)

  • Модули parser и symbol устарели и будут удалены в будущих версиях Python. В большинстве случаев пользователи могут задействовать этап генерации и компиляции абстрактного синтаксического дерева (AST) с помощью модуля ast.

  • Функции публичного C API PyParser_SimpleParseStringFlags(), PyParser_SimpleParseStringFlagsFilename(), PyParser_SimpleParseFileFlags() и PyNode_Compile() устарели и будут удалены в Python 3.10 вместе со старым парсером.

  • Использование NotImplemented в логическом контексте объявлено устаревшим, поскольку почти всегда является результатом неправильной реализации расширенных операторов сравнения. В одной из будущих версий Python оно будет преобразовано в TypeError. (Автор: Josh Rosenberg в bpo-35712.)

  • Модуль random в настоящее время принимает любой хешируемый тип в качестве возможного значения зерна. К сожалению, для некоторых из этих типов хеш-значение не гарантированно детерминировано. После Python 3.9 модуль будет ограничивать свои зерна типами None, int, float, str, bytes и bytearray.

  • Открытие файла GzipFile для записи без указания аргумента mode объявлено устаревшим. В будущих версиях Python он всегда будет открываться для чтения по умолчанию. Укажите аргумент mode, чтобы открыть его для записи и отключить предупреждение. (Автор: Serhiy Storchaka в bpo-28286.)

  • Метод split() класса _tkinter.TkappType объявлен устаревшим в пользу метода splitlist(), который обладает более последовательным и предсказуемым поведением. (Автор: Serhiy Storchaka в bpo-38371.)

  • Явная передача объектов-корутин в asyncio.wait() объявлена устаревшей и будет удалена в версии 3.11. (Авторы: Yury Selivanov и Kyle Stanley в bpo-34790.)

  • Стандарты binhex4 и hexbin4 теперь устарели. Модуль binhex и следующие функции binascii теперь устарели:

    • b2a_hqx(), a2b_hqx()

    • rlecode_hqx(), rledecode_hqx()

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

  • Классы ast: slice, Index и ExtSlice считаются устаревшими и будут удалены в будущих версиях Python. Вместо Index(value) следует использовать сам value. Вместо ExtSlice(slices) следует использовать Tuple(slices, Load()). (Автор: Serhiy Storchaka в bpo-34822.)

  • Классы ast Suite, Param, AugLoad и AugStore считаются устаревшими и будут удалены в будущих версиях Python. Они не создавались парсером и не принимались генератором кода в Python 3. (Авторы: Batuhan Taskaya в bpo-39639 и bpo-39969 и Serhiy Storchaka в bpo-39988.)

  • Функции PyEval_InitThreads() и PyEval_ThreadsInitialized() теперь устарели и будут удалены в Python 3.11. Вызов PyEval_InitThreads() теперь ничего не делает. GIL инициализируется с помощью Py_Initialize() начиная с Python 3.7. (Автор: Victor Stinner в bpo-39877.)

  • Передача None в качестве первого аргумента функции shlex.split() объявлена устаревшей. (Автор: Zackery Spytz в bpo-33262.)

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

  • Модуль lib2to3 теперь генерирует PendingDeprecationWarning. Python 3.9 перешёл на PEG-парсер (см. PEP 617), и Python 3.10 может включать новый синтаксис языка, который не поддаётся разбору LL(1)-парсером lib2to3. Модуль lib2to3 может быть удалён из стандартной библиотеки в одной из будущих версий Python. Рассмотрите сторонние альтернативы, такие как LibCST или parso. (Автор: Carl Meyer в bpo-40360.)

  • Параметр random функции random.shuffle() объявлен устаревшим. (Автор: Raymond Hettinger в bpo-40465)

УдаленоRemoved

  • Ошибочная версия по адресу unittest.mock.__version__ удалена.

  • nntplib.NNTP: методы xpath() и xgtitle() удалены. Эти методы устарели начиная с Python 3.3. Как правило, эти расширения не поддерживаются или не включены администраторами NNTP-серверов. Для xgtitle() используйте nntplib.NNTP.descriptions() или nntplib.NNTP.description(). (Автор: Donghee Na в bpo-39366.)

  • array.array: методы tostring() и fromstring() удалены. Они были псевдонимами для tobytes() и frombytes(), устаревших начиная с Python 3.2. (Автор: Victor Stinner в bpo-38916.)

  • Незадокументированная функция sys.callstats() удалена. Начиная с Python 3.7 она была устаревшей и всегда возвращала None. Она требовала специальной опции сборки CALL_PROFILE, которая уже была удалена в Python 3.7. (Автор: Victor Stinner в bpo-37414.)

  • Функции sys.getcheckinterval() и sys.setcheckinterval() удалены. Они были устаревшими начиная с Python 3.2. Используйте вместо них sys.getswitchinterval() и sys.setswitchinterval(). (Автор: Victor Stinner в bpo-37392.)

  • C-функция PyImport_Cleanup() удалена. Она была задокументирована как: «Очистить таблицу модулей. Только для внутреннего использования.» (Автор: Victor Stinner в bpo-36710.)

  • Модули _dummy_thread и dummy_threading удалены. Эти модули были устаревшими начиная с Python 3.7, который требует поддержки потоков. (Автор: Victor Stinner в bpo-37312.)

  • Псевдонимы aifc.openfp() для aifc.open(), sunau.openfp() для sunau.open() и wave.openfp() для wave.open() удалены. Они были устаревшими начиная с Python 3.7. (Автор: Victor Stinner в bpo-37320.)

  • Метод isAlive() класса threading.Thread удалён. Он был устаревшим начиная с Python 3.8. Используйте вместо него is_alive(). (Автор: Donghee Na в bpo-37804.)

  • Методы getchildren() и getiterator() классов ElementTree и Element в модуле ElementTree удалены. Они были устаревшими начиная с Python 3.2. Используйте iter(x) или list(x) вместо x.getchildren() и x.iter() или list(x.iter()) вместо x.getiterator(). (Автор: Serhiy Storchaka в bpo-36543.)

  • Старый API plistlib удалён, он был устаревшим начиная с Python 3.4. Используйте функции load(), loads(), dump() и dumps(). Кроме того, удалён параметр use_builtin_types; вместо него всегда используются стандартные объекты bytes. (Автор: Jon Janzen в bpo-36409.)

  • C-функция PyGen_NeedsFinalizing удалена. Она не была задокументирована, не тестировалась и нигде не использовалась в CPython после реализации PEP 442. Патч от Joannah Nanjekye. (Автор: Joannah Nanjekye в bpo-15088)

  • base64.encodestring() и base64.decodestring(), псевдонимы, устаревшие начиная с Python 3.1, удалены: используйте base64.encodebytes() и base64.decodebytes(). (Автор: Victor Stinner в bpo-39351.)

  • Функция fractions.gcd() удалена, она была устаревшей начиная с Python 3.5 (bpo-22486): используйте math.gcd(). (Автор: Victor Stinner в bpo-39350.)

  • Параметр buffering функции bz2.BZ2File удалён. Начиная с Python 3.0 он игнорировался, а его использование вызывало DeprecationWarning. Передавайте открытый файловый объект, чтобы управлять тем, как файл открывается. (Автор: Victor Stinner в bpo-39357.)

  • Параметр encoding функции json.loads() был удалён. Начиная с Python 3.1 он считался устаревшим и игнорировался; его использование вызывало DeprecationWarning, начиная с Python 3.8. (Автор: Inada Naoki в bpo-39377)

  • Операторы with (await asyncio.lock): и with (yield from asyncio.lock): больше не поддерживаются, используйте вместо них async with lock. То же самое верно для asyncio.Condition и asyncio.Semaphore. (Автор: Andrew Svetlov в bpo-34793.)

  • Функция sys.getcounts(), параметр командной строки -X showalloccount и поле show_alloc_count C-структуры PyConfig были удалены. Они требовали специальной сборки Python с определённым макросом COUNT_ALLOCS. (Автор: Victor Stinner в bpo-39489.)

  • Атрибут _field_types класса typing.NamedTuple был удалён. Он был устаревшим с Python 3.8. Используйте вместо него атрибут __annotations__. (Автор: Serhiy Storchaka в bpo-40182.)

  • Метод symtable.SymbolTable.has_exec() был удалён. Он был устаревшим с 2006 года и при вызове просто возвращал False. (Автор: Batuhan Taskaya в bpo-40208)

  • asyncio.Task.current_task() и asyncio.Task.all_tasks() были удалены. Они были устаревшими с Python 3.7, и вы можете использовать вместо них asyncio.current_task() и asyncio.all_tasks(). (Автор: Rémi Lapeyre в bpo-40967)

  • Метод unescape() в классе html.parser.HTMLParser был удалён (он был устаревшим с Python 3.4). Для преобразования символьных ссылок в соответствующие символы Юникода следует использовать html.unescape().

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

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

Изменения в Python APIChanges in the Python API

  • __import__() и importlib.util.resolve_name() теперь вызывают ImportError вместо ValueError. Код, который перехватывает конкретный тип исключения и должен поддерживать как Python 3.9, так и более ранние версии, должен перехватывать оба с помощью except (ImportError, ValueError):.

  • Скрипты активации venv больше не обрабатывают особым образом случай, когда __VENV_PROMPT__ установлено в "".

  • Метод select.epoll.unregister() больше не игнорирует ошибку EBADF. (Автор: Victor Stinner в bpo-39239.)

  • Параметр compresslevel функции bz2.BZ2File стал только ключевым (keyword-only), поскольку параметр buffering был удалён. (Автор: Victor Stinner в bpo-39357.)

  • Упрощённое AST для операций индексации. Простые индексы будут представлены своим значением, расширенные срезы – кортежами. Index(value) будет возвращать сам value, ExtSlice(slices) будет возвращать Tuple(slices, Load()). (Автор: Serhiy Storchaka в bpo-34822.)

  • Модуль importlib теперь игнорирует переменную окружения PYTHONCASEOK при использовании параметров командной строки -E или -I.

  • Параметр encoding был добавлен в классы ftplib.FTP и ftplib.FTP_TLS как только ключевой (keyword-only), а кодировка по умолчанию изменена с Latin-1 на UTF-8 в соответствии с RFC 2640.

  • asyncio.loop.shutdown_default_executor() был добавлен в AbstractEventLoop, что означает, что альтернативные циклы событий, наследующие от него, должны иметь этот определённый метод. (Автор: Kyle Stanley в bpo-34037.)

  • Константные значения флагов future в модуле __future__ обновлены, чтобы избежать пересечения с флагами компилятора. Ранее PyCF_ALLOW_TOP_LEVEL_AWAIT конфликтовал с CO_FUTURE_DIVISION. (Автор: Batuhan Taskaya в bpo-39562)

  • array('u') теперь использует в качестве C-типа wchar_t вместо Py_UNICODE. Это изменение не влияет на его поведение, поскольку Py_UNICODE является псевдонимом wchar_t начиная с Python 3.3. (Автор: Inada Naoki в bpo-34538.)

  • API logging.getLogger() теперь возвращает корневой логгер при передаче имени 'root', тогда как ранее возвращался некорневой логгер с именем 'root'. Это может повлиять на случаи, когда код явно требует некорневой логгер с именем 'root' или создаёт логгер с помощью logging.getLogger(__name__) в некотором модуле верхнего уровня с именем 'root.py'. (Автор: Vinay Sajip в bpo-37742.)

  • Обработка деления в PurePath теперь возвращает NotImplemented вместо возбуждения TypeError, если передано что-то, не являющееся экземпляром str или PurePath. Это позволяет создавать совместимые классы, не наследующие от упомянутых типов. (Автор: Roger Aiudi в bpo-34775).

  • Начиная с Python 3.9.5 модуль ipaddress больше не принимает ведущие нули в строках IPv4-адресов. Ведущие нули неоднозначны и некоторыми библиотеками интерпретируются как восьмеричная запись. Например, устаревшая функция socket.inet_aton() трактует ведущие нули как восьмеричную запись. Реализация glibc современного inet_pton() не принимает никаких ведущих нулей. (Автор: Christian Heimes в bpo-36384).

  • codecs.lookup() теперь нормализует имя кодировки так же, как encodings.normalize_encoding(), за исключением того, что codecs.lookup() также приводит имя к нижнему регистру. Например, имя кодировки "latex+latin1" теперь нормализуется в "latex_latin1". (Автор: Jordon Xu в bpo-37751.)

Изменения в C APIChanges in the C API

  • Экземпляры типов, выделяемых в куче (таких как созданные с помощью PyType_FromSpec() и подобных API) содержат ссылку на свой объект-тип начиная с Python 3.8. Как указано в разделе «Changes in the C API» для Python 3.8, в подавляющем большинстве случаев побочных эффектов не должно быть, но для типов, имеющих собственную функцию tp_traverse, необходимо убедиться, что все пользовательские функции tp_traverse типов, выделяемых в куче, посещают тип объекта.

    Пример:

    int
    foo_traverse(foo_struct *self, visitproc visit, void *arg) {
    // Остальная часть функции traverse
    #if PY_VERSION_HEX >= 0x03090000
        // Это не требовалось до Python 3.9 (Python issue 35810 и 40217)
        Py_VISIT(Py_TYPE(self));
    #endif
    }
    

    Если ваша функция traverse делегирует вызов tp_traverse своего базового класса (или другого типа), убедитесь, что Py_TYPE(self) посещается только один раз. Обратите внимание, что только тип, выделяемый в куче должны посещать тип в tp_traverse.

    Например, если ваша функция tp_traverse содержит:

    base->tp_traverse(self, visit, arg)
    

    то добавьте:

    #if PY_VERSION_HEX >= 0x03090000
        // Это не требовалось до Python 3.9 (bpo-35810 и bpo-40217)
        if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
            // tp_traverse типа‑кучи уже посетил Py_TYPE(self)
        } else {
            Py_VISIT(Py_TYPE(self));
        }
    #else
    

    (См. bpo-35810 и bpo-40217 для получения дополнительной информации.)

  • Функции PyEval_CallObject, PyEval_CallFunction, PyEval_CallMethod и PyEval_CallObjectWithKeywords устарели. Используйте вместо них PyObject_Call() и его варианты. (Подробнее см. в bpo-29548.)

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

  • Код операции LOAD_ASSERTION_ERROR был добавлен для обработки оператора assert. Ранее оператор assert работал некорректно, если исключение AssertionError было скрыто. (Автор: Zackery Spytz в bpo-34880.)

  • Код операции COMPARE_OP был разделён на четыре отдельные инструкции:

    • COMPARE_OP для сравнений с богатой семантикой (rich comparisons)

    • IS_OP для проверок «is» и «is not»

    • CONTAINS_OP для проверок ‘in’ и ‘not in’

    • JUMP_IF_NOT_EXC_MATCH для проверки исключений в конструкциях ‘try-except’

    (Автор: Mark Shannon в bpo-39156.)

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

  • Добавлена опция --with-platlibdir в скрипт configure: имя платформо-зависимого каталога библиотек, хранящееся в новом атрибуте sys.platlibdir. См. атрибут sys.platlibdir для получения дополнительной информации. (Авторы: Jan Matějek, Matěj Cepl, Charalampos Stratakis и Victor Stinner в bpo-1294959.)

  • Специальный макрос сборки COUNT_ALLOCS удалён. (Автор: Victor Stinner в bpo-39489.)

  • На платформах, отличных от Windows, функции setenv() и unsetenv() теперь необходимы для сборки Python. (Автор: Victor Stinner в bpo-39395.)

  • На платформах, отличных от Windows, создание установщиков bdist_wininst теперь официально не поддерживается. (Подробнее см. bpo-10945.)

  • При сборке Python на macOS из исходного кода, _tkinter теперь компонуется с несистемными фреймворками Tcl и Tk, если они установлены в /Library/Frameworks, как это было в более старых версиях macOS. Если явно указан macOS SDK, с помощью --enable-universalsdk или -isysroot, поиск ведется только в самом SDK. Поведение по умолчанию по-прежнему можно переопределить с помощью --with-tcltk-includes и --with-tcltk-libs. (Автор: Ned Deily в bpo-34956.)

  • Python теперь можно собрать для Windows 10 ARM64. (Автор: Steve Dower в bpo-33125.)

  • Некоторые отдельные тесты теперь пропускаются при использовании --pgo. Указанные тесты значительно увеличивали время выполнения задачи PGO и, вероятно, не способствовали улучшению оптимизации конечного исполняемого файла. Это ускоряет выполнение задачи примерно в 15 раз. Запуск полного набора модульных тестов выполняется медленно. Это изменение может привести к немного менее оптимизированной сборке, поскольку будет выполняться меньше ветвей кода. Если вы готовы ждать сборки дольше, прежнее поведение можно восстановить с помощью ./configure [..] PROFILE_TASK="-m test --pgo-extended". Мы не даем никаких гарантий относительно того, какой набор задач PGO дает более быструю сборку. Заинтересованным пользователям следует запускать собственные соответствующие тесты производительности, так как результаты могут зависеть от среды, рабочей нагрузки и цепочки инструментов компилятора. (Подробнее см. bpo-36044 и bpo-37707.)

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

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

  • PEP 573: Добавлены PyType_FromModuleAndSpec() для связывания модуля с классом; PyType_GetModule() и PyType_GetModuleState() для получения модуля и его состояния; и PyCMethod и METH_METHOD для предоставления методу доступа к классу, в котором он был определен. (Авторы: Marcel Plch и Petr Viktorin в bpo-38787.)

  • Добавлена функция PyFrame_GetCode(): получение кода фрейма. Добавлена функция PyFrame_GetBack(): получение следующего внешнего фрейма. (Автор: Victor Stinner в bpo-40421.)

  • Добавлен PyFrame_GetLineNumber() в ограниченный C API. (Автор: Victor Stinner в bpo-40421.)

  • Добавлены функции PyThreadState_GetInterpreter() и PyInterpreterState_Get() для получения интерпретатора. Добавлена функция PyThreadState_GetFrame() для получения текущего фрейма состояния потока Python. Добавлена функция PyThreadState_GetID(): получение уникального идентификатора состояния потока Python. (Автор: Victor Stinner в bpo-39947.)

  • Добавлена новая публичная функция PyObject_CallNoArgs() в C API, которая вызывает вызываемый объект Python без аргументов. Это наиболее эффективный способ вызова вызываемого объекта Python без аргументов. (Автор: Victor Stinner в bpo-37194.)

  • Изменения в ограниченном C API (если определён макрос Py_LIMITED_API):

    • Предоставить Py_EnterRecursiveCall() и Py_LeaveRecursiveCall() как обычные функции для ограниченного API. Ранее они были определены как макросы, но эти макросы не компилировались с ограниченным C API, который не может получить доступ к полю PyThreadState.recursion_depth (структура является непрозрачной в ограниченном C API).

    • PyObject_INIT() и PyObject_INIT_VAR() становятся обычными «непрозрачными» функциями для скрытия деталей реализации.

    (Автор: Victor Stinner в bpo-38644 и bpo-39542.)

  • Добавлена функция PyModule_AddType() для помощи в добавлении типа в модуль. (Автор: Donghee Na в bpo-40024.)

  • Добавлены функции PyObject_GC_IsTracked() и PyObject_GC_IsFinalized() в публичный API, позволяющие запрашивать, отслеживаются ли в данный момент объекты Python или уже финализированы сборщиком мусора, соответственно. (Автор: Pablo Galindo Salgado в bpo-40241.)

  • Добавлен _PyObject_FunctionStr() для получения удобочитаемого строкового представления объекта, подобного функции. (Патч от Jeroen Demeyer в bpo-37645.)

  • Добавлен PyObject_CallOneArg() для вызова объекта с одним позиционным аргументом. (Патч от Jeroen Demeyer в bpo-37483.)

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

  • PyInterpreterState.eval_frame (PEP 523) теперь требует новый обязательный параметр tstate (PyThreadState*). (Автор: Victor Stinner в bpo-38500.)

  • Модули расширения: функции m_traverse, m_clear и m_free из PyModuleDef больше не вызываются, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и до его выполнения (функция Py_mod_exec). Точнее, эти функции не вызываются, если m_size больше 0, а состояние модуля (возвращаемое PyModule_GetState()) равно NULL.

    Модули расширения без состояния модуля (m_size <= 0) не затрагиваются.

  • Если Py_AddPendingCall() вызывается в подынтерпретаторе, функция теперь планируется к вызову из подынтерпретатора, а не вызывается из основного интерпретатора. Каждый подынтерпретатор теперь имеет свой собственный список запланированных вызовов. (Автор: Victor Stinner в bpo-39984.)

  • Реестр Windows больше не используется для инициализации sys.path при использовании опции -E (если PyConfig.use_environment установлено в 0). Это важно при встраивании Python в Windows. (Автор: Zackery Spytz в bpo-8901.)

  • Глобальная переменная PyStructSequence_UnnamedField теперь является константой и ссылается на строковую константу. (Автор: Serhiy Storchaka в bpo-38650.)

  • Структура PyGC_Head теперь непрозрачна. Она определяется только во внутреннем C API (pycore_gc.h). (Автор: Victor Stinner в bpo-40241.)

  • Py_UNICODE_COPY, Py_UNICODE_FILL, PyUnicode_WSTR_LENGTH, PyUnicode_FromUnicode(), PyUnicode_AsUnicode(), _PyUnicode_AsUnicode и PyUnicode_AsUnicodeAndSize() помечены как устаревшие в C. Они устарели PEP 393 начиная с Python 3.3. (Автор: Inada Naoki в bpo-36346.)

  • Функция Py_FatalError() заменена макросом, который автоматически записывает имя текущей функции, если не определён макрос Py_LIMITED_API. (Автор: Victor Stinner в bpo-39882.)

  • Протокол vectorcall теперь требует, чтобы вызывающая сторона передавала только строки в качестве имён ключевых аргументов. (См. bpo-37540 для получения дополнительной информации.)

  • Детали реализации ряда макросов и функций теперь скрыты:

    • Макрос PyObject_IS_GC() преобразован в функцию.

    • Макрос PyObject_NEW() становится псевдонимом макроса PyObject_New, а макрос PyObject_NEW_VAR() становится псевдонимом макроса PyObject_NewVar. Они больше не обращаются напрямую к элементу PyTypeObject.tp_basicsize.

    • Макрос PyObject_GET_WEAKREFS_LISTPTR() преобразован в функцию: макрос напрямую обращался к элементу PyTypeObject.tp_weaklistoffset.

    • Макрос PyObject_CheckBuffer() преобразован в функцию: макрос напрямую обращался к элементу PyTypeObject.tp_as_buffer.

    • PyIndex_Check() теперь всегда объявляется как непрозрачная функция для скрытия деталей реализации: удалён макрос PyIndex_Check(). Макрос напрямую обращался к элементу PyTypeObject.tp_as_number.

    (См. bpo-40170 для получения дополнительных сведений.)

УдаленоRemoved

  • Макросы PyFPE_START_PROTECT() и PyFPE_END_PROTECT() из pyfpe.h исключены из ограниченного C API. (Автор: Victor Stinner в bpo-38835.)

  • Слот tp_print структуры PyTypeObject удалён. Он использовался для печати объектов в файлы в Python 2.7 и ранее. Начиная с Python 3.0, он игнорируется и не используется. (Автор: Jeroen Demeyer в bpo-36974.)

  • Изменения в ограниченном C API (если определён макрос Py_LIMITED_API):

    • Из ограниченного C API исключены следующие функции:

      • PyThreadState_DeleteCurrent() (Автор: Joannah Nanjekye в bpo-37878.)

      • _Py_CheckRecursionLimit

      • _Py_NewReference()

      • _Py_ForgetReference()

      • _PyTraceMalloc_NewReference()

      • _Py_GetRefTotal()

      • Механизм trashcan, который никогда не работал в ограниченном C API.

      • PyTrash_UNWIND_LEVEL

      • Py_TRASHCAN_BEGIN_CONDITION

      • Py_TRASHCAN_BEGIN

      • Py_TRASHCAN_END

      • Py_TRASHCAN_SAFE_BEGIN

      • Py_TRASHCAN_SAFE_END

    • Следующие функции и определения перемещены во внутренний C API:

      • _PyDebug_PrintTotalRefs()

      • _Py_PrintReferences()

      • _Py_PrintReferenceAddresses()

      • _Py_tracemalloc_config

      • _Py_AddToAllObjects() (специфично для сборки Py_TRACE_REFS)

    (Автор: Victor Stinner в bpo-38644 и bpo-39542.)

  • Удалены хук _PyRuntime.getframe и макрос _PyThreadState_GetFrame, который был псевдонимом _PyRuntime.getframe. Они были доступны только через внутренний C API. Также удалён тип PyThreadFrameGetter. (Автор: Victor Stinner в bpo-39946.)

  • Из C API удалены следующие функции. Явно вызывайте PyGC_Collect() для очистки всех свободных списков. (Авторы: Inada Naoki и Victor Stinner в bpo-37340, bpo-38896 и bpo-40428.)

    • PyAsyncGen_ClearFreeLists()

    • PyContext_ClearFreeList()

    • PyDict_ClearFreeList()

    • PyFloat_ClearFreeList()

    • PyFrame_ClearFreeList()

    • PyList_ClearFreeList()

    • PyMethod_ClearFreeList() и PyCFunction_ClearFreeList(): свободные списки объектов связанных методов удалены.

    • PySet_ClearFreeList(): свободный список множеств удалён в Python 3.4.

    • PyTuple_ClearFreeList()

    • PyUnicode_ClearFreeList(): свободный список Unicode удалён в Python 3.3.

  • Удалена функция _PyUnicode_ClearStaticStrings(). (Автор: Victor Stinner в bpo-39465.)

  • Удалён Py_UNICODE_MATCH. Он был объявлен устаревшим с помощью PEP 393 и перестал работать с Python 3.3. Вместо него можно использовать функцию PyUnicode_Tailmatch(). (Автор: Inada Naoki в bpo-36346.)

  • Очищены заголовочные файлы от интерфейсов, определённых, но не имеющих реализации. Удаляемые символы публичного API: _PyBytes_InsertThousandsGroupingLocale, _PyBytes_InsertThousandsGrouping, _Py_InitializeFromArgs, _Py_InitializeFromWideArgs, _PyFloat_Repr, _PyFloat_Digits, _PyFloat_DigitsInit, PyFrame_ExtendStack, _PyAIterWrapper_Type, PyNullImporter_Type, PyCmpWrapper_Type, PySortWrapper_Type, PyNoArgsFunction. (Автор: Pablo Galindo Salgado в bpo-39372.)

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

typing

Поведение typing.Literal было изменено в соответствии с PEP 586 и для соответствия поведению статических анализаторов типов, описанному в PEP.

  1. Literal теперь удаляет дубликаты параметров.

  2. Проверки равенства между объектами Literal теперь не зависят от порядка.

  3. Сравнения Literal теперь учитывают типы. Например, Literal[0] == Literal[False] ранее давало True. Теперь это False. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.

  4. Объекты Literal теперь будут вызывать исключение TypeError при сравнении на равенство, если любой из их параметров не является хэшируемым. Обратите внимание, что объявление Literal с изменяемыми параметрами не вызовет ошибку:

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

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

Поддержка macOS 11.0 (Big Sur) и Mac на Apple SiliconmacOS 11.0 (Big Sur) and Apple Silicon Mac support

Начиная с версии 3.9.1, Python полностью поддерживает сборку и работу на macOS 11.0 (Big Sur) и на Mac с Apple Silicon (на базе архитектуры ARM64). Теперь доступна новая универсальная конфигурация сборки, universal2, которая позволяет изначально поддерживать как ARM64, так и Intel 64 в одном наборе исполняемых файлов. Также теперь можно создавать двоичные файлы на текущих версиях macOS для развёртывания на более старых версиях macOS (проверено до 10.9), при этом некоторые функции и возможности новых ОС становятся условно доступными в зависимости от версии ОС, используемой во время выполнения («weaklinking»).

(Авторы: Ronald Oussoren и Lawrence D’Anna в bpo-41100.)

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

collections.abc

collections.abc.Callable обобщённый тип теперь упрощает параметры типов, аналогично тому, как это делает typing.Callable. Это означает, что collections.abc.Callable[[int, str], str] будет иметь __args__ из (int, str, str); ранее это было ([int, str], str). Чтобы обеспечить это изменение, types.GenericAlias теперь может быть унаследован, и подкласс будет возвращён при индексации типа collections.abc.Callable. Код, который обращается к аргументам через typing.get_args() или __args__, должен учитывать это изменение. DeprecationWarning может быть вызвано для некорректных форм параметризации collections.abc.Callable, которые могли проходить незаметно в Python 3.9.1. Это DeprecationWarning станет TypeError в Python 3.10. (Предложено Ken Jin в bpo-42195.)

urllib.parse

Более ранние версии Python допускали использование как ;, так и & в качестве разделителей параметров запроса в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). Из соображений безопасности и для соответствия новым рекомендациям W3C это поведение было изменено: теперь разрешён только один ключ-разделитель, & по умолчанию. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они внутренне используют затронутые функции. Дополнительные сведения см. в их документации. (Авторы: Adam Goldschmidt, Senthil Kumaran и Ken Jin в bpo-42967.)

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

Исправление безопасности изменяет поведение ftplib.FTP, чтобы не доверять IPv4-адресу, отправленному удалённым сервером при настройке пассивного канала данных. Вместо этого используется IP-адрес FTP-сервера. Для необычного кода, которому требуется старое поведение, установите атрибут trust_server_pasv_ipv4_address экземпляра FTP в True. (См. gh-87451)

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

urllib.parse

Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. Следуя спецификации WHATWG, обновляющей RFC 3986, символы ASCII новой строки \n, \r и табуляции \t удаляются из URL анализатором в urllib.parse, предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (См. gh-88048)

Заметная функция безопасности в 3.9.14Notable security feature in 3.9.14

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

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

tarfile

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