Что нового в Python 3.9

Редактор:

Лукаш Ланга

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

См.также

PEP 596 - График выхода Python 3.9

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

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

  • 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 в вашем коде

Когда 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, чтобы рассматривать их как ошибки. Warnings Filter можно использовать для игнорирования предупреждений от стороннего кода.

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

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

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

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

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

Операторы слияния и обновления словаря

Во встроенный класс dict были добавлены операторы Merge (|) и update (|=). Они дополняют существующие методы слияния словарей 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. (Внесено Брандтом Бухером в bpo-36144).

Новые методы удаления префиксов и суффиксов из строк

Полное описание см. в str.removeprefix(prefix).

Генераторы с подсказкой типа в стандартных коллекциях

Полное описание см. в list.

Пример:

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

Более подробную информацию см. в PEP 585. (Внесено Гвидо ван Россумом, Итаном Смитом и Батуханом Ташкая в bpo-39481).

Новый парсер

В 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. (Внесено Гвидо ван Россумом, Пабло Галиндо и Лисандросом Николау в bpo-40334).

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

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

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

  • В Python Development Mode и debug build аргументы encoding и errors теперь проверяются при операциях кодирования и декодирования строк. Примеры: open(), str.encode() и bytes.decode().

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

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

  • Теперь в качестве decorator можно использовать любое допустимое выражение. Ранее грамматика была гораздо более строгой. Подробности см. в PEP 614. (Внесено Брандтом Бухером в bpo-39702).

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

  • Параллельное выполнение aclose() / asend() / athrow() теперь запрещено, а ag_running теперь отражает реальное состояние работы асинхронного генератора. (Внесено Юрием Селивановым в bpo-30773).

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

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

Новые модули

информация о зоне

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

Пример:

>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta

>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'

>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST

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

См.также

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

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

graphlib

Был добавлен новый модуль graphlib, содержащий класс graphlib.TopologicalSorter, чтобы предложить функциональность для выполнения топологической сортировки графов. (Вклад Пабло Галиндо, Тима Питерса и Ларри Гастингса в bpo-17005).

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

ast

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

В модуль ast добавлена функция ast.unparse(), с помощью которой можно разобрать объект ast.AST и вывести строку с кодом, который при разборе выдаст эквивалентный объект ast.AST. (Внесено Пабло Галиндо и Батуханом Таская в bpo-38870).

К узлам AST добавлены документограммы, содержащие подпись ASDL, использованную для создания этого узла. (Внесено Батуханом Таская в bpo-39638).

asyncio

По соображениям безопасности параметр reuse_address asyncio.loop.create_datagram_endpoint() больше не поддерживается. Это связано с поведением параметра сокета SO_REUSEADDR в UDP. Для получения более подробной информации см. документацию по loop.create_datagram_endpoint(). (Внесено Кайлом Стэнли, Антуаном Питру и Юрием Селивановым в bpo-37228).

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

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

Добавлена новая coroutine asyncio.to_thread(). Он используется в основном для запуска функций, связанных с IO, в отдельном потоке, чтобы избежать блокировки цикла событий, и по сути работает как высокоуровневая версия run_in_executor(), которая может напрямую принимать аргументы ключевых слов. (Вклад Кайла Стэнли и Юрия Селиванова в bpo-32309).

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

asyncio теперь поднимает TypeError при вызове несовместимых методов с сокетом ssl.SSLSocket. (Внесено Идо Майклом в 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

В concurrent.futures.Executor.shutdown() добавлен новый параметр cancel_futures, который отменяет все ожидающие фьючерсы, которые еще не начали выполняться, вместо того чтобы ждать их завершения перед завершением работы исполнителя. (Внесено Кайлом Стэнли в bpo-39349).

Удалены потоки демонов из ThreadPoolExecutor и ProcessPoolExecutor. Это улучшает совместимость с субинтерпретаторами и предсказуемость процессов их завершения. (Внесено Кайлом Стэнли в bpo-39812).

Рабочие в ProcessPoolExecutor теперь порождаются по требованию, только когда нет свободных незанятых рабочих для повторного использования. Это оптимизирует накладные расходы при запуске и уменьшает потери процессорного времени на простаивающих рабочих. (Внесено Кайлом Стэнли в bpo-39207).

проклятия

Добавлены функции curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize() и curses.set_tabsize(). (Внесено Энтони Соттилом в bpo-38312).

datetime

Методы isocalendar() из datetime.date и isocalendar() из datetime.datetime теперь возвращают namedtuple(), а не tuple. (Внесено Донгхи На в bpo-24416).

distutils

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

fcntl

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

ftplib

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

gc

Когда сборщик мусора производит сборку, в которой некоторые объекты воскресают (они становятся достижимыми извне изолированных циклов после выполнения финализаторов), не блокируйте сборку всех объектов, которые все еще недостижимы. (Вклад Пабло Галиндо и Тима Питерса в bpo-38379).

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

hashlib

Модуль hashlib теперь может использовать хэши SHA3 и SHAKE XOF из OpenSSL, когда они доступны. (Внесено Кристианом Хаймсом в bpo-37630).

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

http

Коды состояния HTTP 103 EARLY_HINTS, 418 IM_A_TEAPOT и 425 TOO_EARLY добавлены в http.HTTPStatus. (Вклад Донгхи На в bpo-39509 и Росса Родса в bpo-39507).

IDLE и idlelib

Добавлена возможность отключения мигания курсора. (Внесено Закери Спитцем в bpo-4603).

Клавиша Escape теперь закрывает окна завершения IDLE. (Внесено Джонни Наджерой в bpo-38944).

Добавлены ключевые слова в список завершения имени модуля. (Внесено Терри Дж. Риди в bpo-37765).

Новое в обновлении 3.9

Заставляет IDLE вызывать sys.excepthook() (при запуске без „-n“). Пользовательские крючки ранее игнорировались. (Внесено Кеном Хилтоном в bpo-43008).

Вышеуказанные изменения были перенесены в релизы сопровождения 3.8.

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

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

imaplib

Методы IMAP4 и IMAP4_SSL теперь имеют необязательный параметр timeout для своих конструкторов. Кроме того, метод open() теперь имеет необязательный параметр timeout с этим изменением. Переопределенные методы IMAP4_SSL и IMAP4_stream были применены к этому изменению. (Внесено Донгхи На в bpo-38615).

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

importlib

Чтобы улучшить согласованность с операторами импорта, importlib.util.resolve_name() теперь выдает ImportError вместо ValueError для некорректных попыток относительного импорта. (Внесено Нгалимом Сирегаром в bpo-37444).

Импортные загрузчики, публикующие неизменяемые объекты модулей, теперь могут публиковать неизменяемые пакеты в дополнение к отдельным модулям. (Внесено Дино Вьеландом в bpo-39336).

Добавлена функция importlib.resources.files() с поддержкой подкаталогов в данных пакета, соответствующая бэкпорту в importlib_resources версии 1.5. (Внесено Джейсоном Р. Кумбсом в bpo-39791).

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

осмотреть

inspect.BoundArguments.arguments заменен OrderedDict на обычный диктант. (Внесено Инадой Наоки в bpo-36350 и bpo-39775).

ipaddress

ipaddress теперь поддерживает IPv6 Scoped Addresses (IPv6-адреса с суффиксом %<scope_id>).

Скопированные IPv6-адреса могут быть разобраны с помощью атрибута ipaddress.IPv6Address. Если присутствует, идентификатор зоны охвата доступен через атрибут scope_id. (Внесено Александром Павлюком в bpo-34788).

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

математика

Расширили функцию math.gcd() для работы с несколькими аргументами. Ранее она поддерживала только два аргумента. (Внесено Сергеем Сторчакой в bpo-39648).

Добавлено math.lcm(): возвращает наименьшее общее кратное указанных аргументов. (Вклад Марка Дикинсона, Анантхакришнана и Сергея Сторчака в bpo-39479 и bpo-39648).

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

Добавлено math.ulp(): возвращает значение наименьшего значащего бита float. (Внесено Виктором Стиннером в bpo-39310).

многопроцессорная обработка

В классе multiprocessing.SimpleQueue появился новый метод close() для явного закрытия очереди. (Внесено Виктором Стиннером в bpo-30966).

nntplib

NNTP и NNTP_SSL теперь вызывают ошибку ValueError, если заданный таймаут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Внесено Донгхи На в 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. (Внесено Виктором Стиннером в bpo-39413).

Функции os.putenv() и os.unsetenv() теперь всегда доступны. (Внесено Виктором Стиннером в bpo-39395).

Добавлена функция os.waitstatus_to_exitcode(): преобразование статуса ожидания в код выхода. (Внесено Виктором Стиннером в bpo-40094).

pathlib

Добавлена pathlib.Path.readlink(), которая действует аналогично os.readlink(). (Внесено Гиртсом Фолкманисом в bpo-30618)

pdb

В Windows теперь Pdb поддерживает ~/.pdbrc. (Внесено Тимом Хоппером и Дэном Лидрал-Портером в bpo-20523).

poplib

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

pprint

pprint теперь может красиво печатать types.SimpleNamespace. (Внесено Карлом Бордумом Хансеном в bpo-37376).

pydoc

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

случайно

Добавлен новый метод random.Random.randbytes: генерация случайных байтов. (Внесен Виктором Стиннером в bpo-40286).

сигнал

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

smtplib

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

Конструктор LMTP теперь имеет необязательный параметр timeout. (Внесено Донгхи На в bpo-39329).

сокет

Модуль socket теперь экспортирует константу CAN_RAW_JOIN_FILTERS в Linux 4.1 и выше. (Вклад Стефана Татшнера и Закери Спитца в bpo-25780).

Модуль сокетов теперь поддерживает протокол CAN_J1939 на платформах, которые его поддерживают. (Внесено Карлом Дингом в bpo-40291).

Модуль сокетов теперь имеет функции socket.send_fds() и socket.recv_fds(). (Вклад Джоанны Нанджекье, Шиньи Окано и Виктора Стиннера в bpo-28724).

время

В AIX для thread_time() теперь используется thread_cputime() с разрешением в наносекунды, а не clock_gettime(CLOCK_THREAD_CPUTIME_ID) с разрешением в 10 миллисекунд. (Внесено Батуханом Таская в bpo-40192)

sys

Добавлен новый атрибут sys.platlibdir: имя каталога библиотеки для конкретной платформы. Используется для построения пути к стандартной библиотеке и путей к установленным модулям расширения. На большинстве платформ он равен "lib". В Fedora и SuSE оно равно "lib64" на 64-битных платформах. (Внесено Яном Матееком, Матеем Цеплом, Харалампосом Стратакисом и Виктором Стиннером в bpo-1294959).

Раньше sys.stderr в неинтерактивном состоянии буферизировался блоками. Теперь stderr по умолчанию всегда буферизуется строками. (Внесено Йендриком Сейпом в bpo-13601).

tracemalloc

Добавлена функция tracemalloc.reset_peak() для установки пикового размера отслеживаемых блоков памяти на текущий размер, чтобы измерять пик определенных частей кода. (Внесено Хуоном Уилсоном в bpo-40630).

набор текста

В PEP 593 появился тип typing.Annotated для украшения существующих типов контекстно-специфическими метаданными и новый параметр include_extras для typing.get_type_hints() для доступа к метаданным во время выполнения. (При участии Тилля Вароко и Константина Кашина).

unicodedata

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

venv

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

xml

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

Оптимизации

  • Оптимизирована идиома присвоения временной переменной в осмыслениях. Теперь 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).

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

    Ранее цикл оценки байткода прерывался на каждой инструкции, пока основной поток не обработает сигналы. (Внесено Виктором Стиннером в bpo-40010).

  • Оптимизация модуля subprocess на FreeBSD с помощью closefrom(). (Вклад Эда Маста, Конрада Мейера, Кайла Эванса, Кубилая Кочака и Виктора Стиннера в bpo-38061).

  • PyLong_FromDouble() теперь работает в 1,87 раза быстрее для значений, укладывающихся в long. (Внесено Сергеем Федосеевым в bpo-37986).

  • Ряд встроенных модулей Python (range, tuple, set, frozenset, list, dict) теперь ускоряется за счет использования протокола PEP 590 vectorcall. (Вклад Донгхи На, Марка Шеннона, Йеруна Демейера и Петра Викторина в bpo-37207).

  • Оптимизация difference_update() для случая, когда другое множество намного больше базового. (Предложено Евгением Капуном с кодом, предоставленным Микеле Орру в bpo-8425).

  • Небольшой аллокатор объектов Python (obmalloc.c) теперь позволяет (не более чем) одной пустой арене оставаться доступной для немедленного повторного использования, не возвращая ее в ОС. Это предотвращает трэшинг в простых циклах, где арена может быть создана и уничтожена заново на каждой итерации. (Внесено Тимом Питерсом в bpo-37257).

  • floor division операции float теперь имеет лучшую производительность. Также обновлено сообщение ZeroDivisionError для этой операции. (Внесено Донгхи На в bpo-39434).

  • Декодирование коротких ASCII-строк с помощью кодеков UTF-8 и ascii теперь происходит примерно на 15% быстрее. (Внесено Инадой Наоки в 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 processor под управлением 64-битных сборок macOS, найденных по адресу python.org.

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

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

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

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

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

  • Использование NotImplemented в булевом контексте было отменено, так как это почти исключительно результат неправильной реализации богатого компаратора. В одной из будущих версий Python оно станет TypeError. (Внесено Джошем Розенбергом в bpo-35712).

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

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

  • Утратил силу метод split() из _tkinter.TkappType в пользу метода splitlist(), который имеет более последовательное и предсказуемое поведение. (Внесено Сергеем Сторчакой в bpo-38371).

  • Явная передача объектов coroutine в asyncio.wait() была устаревшей и будет удалена в версии 3.11. (Вклад Юрия Селиванова и Кайла Стэнли в bpo-34790).

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

    • b2a_hqx(), a2b_hqx()

    • rlecode_hqx(), rledecode_hqx()

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

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

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

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

  • Передача None в качестве первого аргумента в функцию shlex.split() была устаревшей. (Внесено Закери Спитцем в bpo-33262).

  • smtpd.MailmanProxy() теперь устарел, так как не может использоваться без внешнего модуля mailman. (Внесено Сэмюэлем Колвином в bpo-35800).

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

  • Параметр random в random.shuffle() был устаревшим. (Внесено Раймондом Хеттингером в bpo-40465)

Удалено

  • Ошибочная версия на 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. (Внесено Виктором Стиннером в bpo-38916).

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

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

  • Функция PyImport_Cleanup() на языке Си была удалена. Она была задокументирована как: «Опустошить таблицу модулей. Только для внутреннего использования». (Внесено Виктором Стиннером в bpo-36710).

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

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

  • Метод isAlive() из threading.Thread был удален. Он был устаревшим с версии Python 3.8. Вместо него используйте is_alive(). (Внесено Донгхи На в bpo-37804).

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

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

  • Функция PyGen_NeedsFinalizing на языке Си была удалена. Она не документировалась, не тестировалась и не использовалась нигде в CPython после внедрения PEP 442. Исправление Джоанны Нанджекье. (Внесено Джоанной Нанджекье в bpo-15088)

  • Псевдонимы base64.encodestring() и base64.decodestring(), устаревшие с Python 3.1, были удалены: вместо них используйте base64.encodebytes() и base64.decodebytes(). (Внесено Виктором Стиннером в bpo-39351).

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

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

  • Параметр encoding в json.loads() был удален. Начиная с Python 3.1, он был устаревшим и игнорировался; начиная с Python 3.8 его использование приводило к появлению DeprecationWarning. (Внесено Инадой Наоки в bpo-39377)

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

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

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

  • Метод symtable.SymbolTable.has_exec() был удален. Он был устаревшим с 2006 года, и при его вызове возвращалась только False. (Внесено Батуханом Таская в bpo-40208)

  • Символы asyncio.Task.current_task() и asyncio.Task.all_tasks() были удалены. Они были устаревшими с Python 3.7, и вы можете использовать asyncio.current_task() и asyncio.all_tasks() вместо них. (Внесено Реми Лапейром в bpo-40967)

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

Переход на Python 3.9

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

Изменения в API Python

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

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

  • Метод select.epoll.unregister() больше не игнорирует ошибку EBADF. (Внесено Виктором Стиннером в bpo-39239).

  • Параметр compresslevel в bz2.BZ2File стал только ключевым, поскольку параметр buffering был удален. (Внесено Виктором Стиннером в bpo-39357).

  • Упрощенный AST для подписки. Простые индексы будут представлены их значением, расширенные срезы - кортежами. Index(value) будет возвращать сам value, ExtSlice(slices) будет возвращать Tuple(slices, Load()). (Внесено Сергеем Сторчакой в bpo-34822).

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

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

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

  • Константные значения будущих флагов в модуле __future__ обновлены, чтобы предотвратить столкновение с флагами компилятора. Ранее PyCF_ALLOW_TOP_LEVEL_AWAIT конфликтовал с CO_FUTURE_DIVISION. (Внесено Батуханом Таская в bpo-39562)

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

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

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

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

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

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

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

    Пример:

    int
    foo_traverse(foo_struct *self, visitproc visit, void *arg) {
    // Rest of the traverse function
    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (Python issue 35810 and 40217)
        Py_VISIT(Py_TYPE(self));
    #endif
    }
    

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

    Например, если ваша функция tp_traverse включает в себя:

    base->tp_traverse(self, visit, arg)
    

    затем добавьте:

    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (bpo-35810 and bpo-40217)
        if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
            // a heap type's tp_traverse already visited 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).

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

  • Опкод LOAD_ASSERTION_ERROR был добавлен для обработки утверждения assert. Ранее оператор assert работал некорректно, если исключение AssertionError было теневым. (Внесено Закери Спитцем в bpo-34880).

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

    • COMPARE_OP для богатых сравнений

    • IS_OP для тестов «является» и «не является

    • CONTAINS_OP для тестов «в» и «не в

    • JUMP_IF_NOT_EXC_MATCH для проверки исключений в операторах „try-except“.

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

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

  • В скрипт configure добавлен параметр --with-platlibdir: имя каталога библиотек для конкретной платформы, хранящееся в новом атрибуте sys.platlibdir. Дополнительную информацию см. в атрибуте sys.platlibdir. (Внесено Яном Матейеком, Матеем Цеплом, Харалампосом Стратакисом и Виктором Стиннером в bpo-1294959).

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

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

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

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

  • Теперь Python можно собирать для Windows 10 ARM64. (Внесено Стивом Дауэром в bpo-33125).

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

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

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

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

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

  • Добавлена функция PyFrame_GetLineNumber() в ограниченный C API. (Внесено Виктором Стиннером в bpo-40421).

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

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

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

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

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

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

  • Функция PyModule_AddType() добавлена, чтобы помочь добавить тип в модуль. (Внесено Донгхи На в bpo-40024).

  • В общедоступный API добавлены функции PyObject_GC_IsTracked() и PyObject_GC_IsFinalized(), позволяющие запрашивать, отслеживаются ли объекты Python в данный момент или уже завершены сборщиком мусора соответственно. (Внесено Пабло Галиндо Сальгадо в bpo-40241).

  • Добавлена функция _PyObject_FunctionStr() для получения удобного строкового представления объекта, похожего на функцию. (Исправлено Йеруном Демейером в bpo-37645).

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

Переход на Python 3.9

  • PyInterpreterState.eval_frame (PEP 523) теперь требует нового обязательного параметра tstate (PyThreadState*). (Внесено Виктором Стиннером в bpo-38500).

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

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

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

  • Реестр Windows больше не используется для инициализации sys.path при использовании опции -E (если для PyConfig.use_environment установлено значение 0). Это важно при внедрении Python в Windows. (Внесено Закери Спитцем в bpo-8901).

  • Глобальная переменная PyStructSequence_UnnamedField теперь является константой и ссылается на константную строку. (Внесено Сергеем Сторчакой в bpo-38650).

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

  • В Си Py_UNICODE_COPY, Py_UNICODE_FILL, PyUnicode_WSTR_LENGTH, PyUnicode_FromUnicode(), PyUnicode_AsUnicode(), _PyUnicode_AsUnicode и PyUnicode_AsUnicodeAndSize() отмечены как устаревшие. Они были устаревшими в PEP 393, начиная с Python 3.3. (Внесено Инадой Наоки в bpo-36346).

  • Функция Py_FatalError() заменяется макросом, который автоматически регистрирует имя текущей функции, если не определен макрос Py_LIMITED_API. (Внесено Виктором Стиннером в 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).

Удалено

  • Исключил макросы PyFPE_START_PROTECT() и PyFPE_END_PROTECT() из pyfpe.h из ограниченного API C. (Внесено Виктором Стиннером в bpo-38835).

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

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

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

      • PyThreadState_DeleteCurrent() (Внесено Джоанной Нанджекье в bpo-37878).

      • _Py_CheckRecursionLimit

      • _Py_NewReference()

      • _Py_ForgetReference()

      • _PyTraceMalloc_NewReference()

      • _Py_GetRefTotal()

      • Механизм мусорной корзины, который никогда не работал в ограниченном 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)

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

  • Удален хук _PyRuntime.getframe и макрос _PyThreadState_GetFrame, который был псевдонимом для _PyRuntime.getframe. Они были доступны только во внутреннем API языка C. Удален также тип PyThreadFrameGetter. (Внесено Виктором Стиннером в bpo-39946).

  • Удалены следующие функции из C API. Вызывайте PyGC_Collect() явно, чтобы очистить все свободные списки. (Вклад Инады Наоки и Виктора Стиннера в bpo-37340, bpo-38896 и bpo-40428).

    • PyAsyncGen_ClearFreeLists()

    • PyContext_ClearFreeList()

    • PyDict_ClearFreeList()

    • PyFloat_ClearFreeList()

    • PyFrame_ClearFreeList()

    • PyList_ClearFreeList()

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

    • PySet_ClearFreeList(): список set free был удален в Python 3.4.

    • PyTuple_ClearFreeList()

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

  • Удалена функция _PyUnicode_ClearStaticStrings(). (Внесено Виктором Стиннером в bpo-39465).

  • Удален Py_UNICODE_MATCH. Она была устаревшей по сравнению с PEP 393 и не работает с Python 3.3. Вместо нее можно использовать функцию PyUnicode_Tailmatch(). (Внесено Инадой Наоки в 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. (Внесено Пабло Галиндо Сальгадо в bpo-39372.)

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

набор текста

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

  1. Literal теперь не дублирует параметры.

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

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

  4. Объекты Literal теперь будут вызывать исключение TypeError при сравнении равенств, если любой из их параметров не является hashable. Обратите внимание, что объявление 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) и поддержка Apple Silicon Mac

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

(Предоставлено Рональдом Оусореном и Лоуренсом Д’Анной в bpo-41100).

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

коллекции.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__, должен учитывать это изменение. Для недопустимых форм параметризации collections.abc.Callable, которые в Python 3.9.1 могли проходить молча, может быть выдана ошибка DeprecationWarning. Этот DeprecationWarning станет TypeError в Python 3.10. (Внесено Кеном Джином в bpo-42195).

urllib.parse

В предыдущих версиях Python в качестве разделителей параметров запроса можно было использовать и ;, и & в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). По соображениям безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить только один ключ-разделитель, а по умолчанию используется &. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они используют затронутые функции внутри. Более подробную информацию можно найти в соответствующей документации. (Внесено Адамом Голдшмидтом, Сентхилом Кумараном и Кеном Джином в bpo-42967).

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

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

Заметные изменения в 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.14

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

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

tarfile

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