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

Релиз

3.10.6

Дата

октября 19, 2022

Редактор

Лукаш Ланга

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

Более подробную информацию см. в changelog.

См.также

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

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

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

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

  • PEP 585, подсказка типа generics в стандартных коллекциях;

  • 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). Они дополняют существующие методы слияния словарей 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) и str.removesuffix(suffix), позволяющие легко удалить ненужный префикс или суффикс из строки. Также были добавлены соответствующие методы bytes, bytearray и collections.UserString. Полное описание см. в разделе PEP 616. (Внесено Деннисом Суини в bpo-39939).

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

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

Пример:

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

Модуль 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

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

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

Добавлены docstrings к узлам 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 теперь вызывает TyperError при вызове несовместимых методов с сокетом ssl.SSLSocket. (Внесено Идо Майклом в bpo-37404).

compileall

Добавлена новая возможность использования жестких ссылок для дублированных файлов .pyc: параметр hardlink_dupes и опция командной строки –hardlink-dupes. (Вклад внес Люмир „Frenzy“ Балхар в 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(), который отменяет все ожидающие фьючерсы, которые не начали выполняться, вместо того, чтобы ждать их завершения перед выключением исполнителя. (Внесено Кайлом Стэнли в bpo-39349).

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

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

проклятия

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

дататайм

Методы 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. (Внесено Дон Хи На в 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.) Переместите настройку отступов с вкладки Шрифт на новую вкладку 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 на обычный dict. (Внесено Инадой Наоки в 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. (Внесено Дон Хи На в 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).

Модуль socket теперь поддерживает протокол 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 для s в [0] для x в данных для s в [s + x]]

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

    (Внесено Сергеем Сторчакой в 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. (При участии Донг-Хи На, Марка Шеннона, Йеруна Демайера и Петра Викторина в 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 в булевом контексте было изжито, так как оно почти исключительно является результатом неправильных реализаций богатых компараторов. Оно будет сделано TypeError в одной из будущих версий Python. (Вклад Джоша Розенберга в 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 теперь устарели:

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

  • Классы ast slice, Index и ExtSlice считаются устаревшими и будут удалены в будущих версиях Python. Сам value следует использовать вместо Index(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() теперь ничего не дает. GIL инициализируется Py_Initialize() начиная с Python 3.7. (Внесено Виктором Стиннером в bpo-39877).

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

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

  • Модуль lib2to3 теперь выдает PendingDeprecationWarning. Python 3.9 перешел на синтаксический анализатор PEG (см. PEP 617), а Python 3.10 может включать новый синтаксис языка, который не может быть разобран синтаксическим анализатором lib2to3 LL(1). Модуль 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() вместо этого. (Вклад Донг-Хи На в 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).

  • Старый API plistlib был удален, он был устаревшим с 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).

  • Параметр buffering в 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() теперь возвращает корневой логгер при передаче имени '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() рассматривает ведущие нули как восьмеричную нотацию. Реализация glibc современной функции inet_pton() не принимает ведущие нули. (Внесено Кристианом Хаймсом в 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).

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

  • В сценарий --with-platlibdir добавлена опция configure: имя каталога библиотеки, специфичной для платформы, хранящееся в новом атрибуте 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() к ограниченному API языка C. (Внесено Виктором Стиннером в 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).

  • Добавлены функции PyObject_GC_IsTracked() и PyObject_GC_IsFinalized() в публичный API, позволяющие запрашивать, отслеживаются ли объекты 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 больше не вызываются, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и перед его выполнением (функция:c:data: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() помечены как устаревшие в C. Они были устаревшими 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. Они были доступны только во внутреннем C API. Удален также тип 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(): свободный список Unicode был удален в 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

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

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

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

коллекции.abc

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

urllib.parse

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

Вернуться на верх