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

3.9.md

782 строк · 126.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.9/whatsnew/3.9.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.989**Версия**10113.9.251213**Дата**14152 апреля 2026 года1617**Редактор**1819Łukasz Langa2021Эта статья описывает новые возможности Python 3.9 по сравнению с 3.8. Python 3.9 был выпущен 5 октября 2020 года.2223Полные сведения см. в [журнале изменений](https://python-all.ru/3.9/whatsnew/changelog.html#changelog).2425> **См. также**26>27> [**PEP 596**](https://python-all.ru/3.9/whatsnew/3.9.html) – график выпуска Python 3.92829## Итоги – основные изменения3031Новые синтаксические возможности:3233- [**PEP 584**](https://python-all.ru/3.9/whatsnew/3.9.html), добавлены операторы объединения для `dict`;34- [**PEP 585**](https://python-all.ru/3.9/whatsnew/3.9.html) – аннотации типов для обобщённых типов в стандартных коллекциях;35- [**PEP 614**](https://python-all.ru/3.9/whatsnew/3.9.html) – ослаблены грамматические ограничения на декораторы.3637Новые встроенные возможности:3839- [**PEP 616**](https://python-all.ru/3.9/whatsnew/3.9.html) – строковые методы для удаления префиксов и суффиксов.4041Новые возможности в стандартной библиотеке:4243- [**PEP 593**](https://python-all.ru/3.9/whatsnew/3.9.html) – гибкие аннотации функций и переменных;44- [`os.pidfd_open()`](https://python-all.ru/3.9/library/os.html#os.pidfd_open) добавлен, что позволяет управлять процессами без состояний гонки и сигналов.4546Улучшения интерпретатора:4748- [**PEP 573**](https://python-all.ru/3.9/whatsnew/3.9.html) – быстрый доступ к состоянию модуля из методов типов C-расширений;49- [**PEP 617**](https://python-all.ru/3.9/whatsnew/3.9.html) – CPython теперь использует новый парсер на основе PEG;50- ряд встроенных функций Python (range, tuple, set, frozenset, list, dict) теперь ускорены с помощью [**PEP 590**](https://python-all.ru/3.9/whatsnew/3.9.html) vectorcall;51- сборка мусора не блокируется на воскрешённых объектах;52- ряд модулей Python (`_abc`, [`audioop`](https://python-all.ru/3.9/library/audioop.html#module-audioop), `_bz2`, `_codecs`, `_contextvars`, `_crypt`, `_functools`, `_json`, `_locale`, [`math`](https://python-all.ru/3.9/library/math.html#module-math), [`operator`](https://python-all.ru/3.9/library/operator.html#module-operator), [`resource`](https://python-all.ru/3.9/library/resource.html#module-resource), [`time`](https://python-all.ru/3.9/library/time.html#module-time), `_weakref`) теперь используют многофазную инициализацию, определённую в PEP 489;53- ряд модулей стандартной библиотеки ([`audioop`](https://python-all.ru/3.9/library/audioop.html#module-audioop), [`ast`](https://python-all.ru/3.9/library/ast.html#module-ast), [`grp`](https://python-all.ru/3.9/library/grp.html#module-grp), `_hashlib`, [`pwd`](https://python-all.ru/3.9/library/pwd.html#module-pwd), `_posixsubprocess`, [`random`](https://python-all.ru/3.9/library/random.html#module-random), [`select`](https://python-all.ru/3.9/library/select.html#module-select), [`struct`](https://python-all.ru/3.9/library/struct.html#module-struct), [`termios`](https://python-all.ru/3.9/library/termios.html#module-termios), [`zlib`](https://python-all.ru/3.9/library/zlib.html#module-zlib)) теперь используют стабильный ABI, определённый в PEP 384.5455Новые модули библиотеки:5657- [**PEP 615**](https://python-all.ru/3.9/whatsnew/3.9.html) – база данных часовых поясов IANA теперь присутствует в стандартной библиотеке в модуле [`zoneinfo`](https://python-all.ru/3.9/library/zoneinfo.html#module-zoneinfo);58- реализация топологической сортировки графа теперь предоставляется в новом модуле [`graphlib`](https://python-all.ru/3.9/library/graphlib.html#module-graphlib).5960Изменения в процессе выпуска:6162- [**PEP 602**](https://python-all.ru/3.9/whatsnew/3.9.html) – CPython переходит на ежегодный цикл выпуска.6364## Следует проверять наличие DeprecationWarning в коде6566Когда Python 2.7 ещё поддерживался, в Python 3 было сохранено множество функций для обратной совместимости с Python 2.7. С прекращением поддержки Python 2 эти прослойки обратной совместимости были удалены или будут удалены в ближайшее время. Большинство из них в течение нескольких лет выдавали предупреждение [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning). Например, использование `collections.Mapping` вместо `collections.abc.Mapping` вызывает [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning) начиная с Python 3.3, выпущенного в 2012 году.6768Протестируйте приложение с параметром командной строки [`-W`](https://python-all.ru/3.9/using/cmdline.html#cmdoption-w) `default`, чтобы увидеть [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning) и [`PendingDeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#PendingDeprecationWarning), или даже с [`-W`](https://python-all.ru/3.9/using/cmdline.html#cmdoption-w) `error`, чтобы обрабатывать их как ошибки. [Фильтр предупреждений](https://python-all.ru/3.9/library/warnings.html#warning-filter) можно использовать для игнорирования предупреждений из стороннего кода.6970Python 3.9 – последняя версия, предоставляющая эти прослойки обратной совместимости с Python 2, чтобы дать разработчикам проектов на Python больше времени для организации удаления поддержки Python 2 и добавления поддержки Python 3.9.7172Псевдонимы [абстрактных базовых классов](https://python-all.ru/3.9/library/collections.abc.html#collections-abstract-base-classes) в модуле [`collections`](https://python-all.ru/3.9/library/collections.html#module-collections), например псевдоним `collections.Mapping` для [`collections.abc.Mapping`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Mapping), сохраняются в последнем релизе для обратной совместимости. Они будут удалены из Python 3.10.7374В более общем смысле, старайтесь запускать тесты в [режиме разработки Python](https://python-all.ru/3.9/library/devmode.html#devmode), который помогает подготовить код к совместимости со следующей версией Python.7576Примечание: в этой версии Python также были удалены некоторые ранее существовавшие устаревшие возможности. Обратитесь к разделу [Удалено](https://python-all.ru/3.9/whatsnew/3.9.html#removed-in-python-39).7778## Новые возможности7980### Операторы слияния и обновления словарей8182Операторы слияния (`|`) и обновления (`|=`) были добавлены во встроенный класс [`dict`](https://python-all.ru/3.9/library/stdtypes.html#dict). Они дополняют существующие методы слияния словарей `dict.update` и `{**d1, **d2}`.8384Пример:8586```python87>>> x = {"key1": "value1 from x", "key2": "value2 from x"}88>>> y = {"key2": "value2 from y", "key3": "value3 from y"}89>>> x | y90{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}91>>> y | x92{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}93```9495См. [**PEP 584**](https://python-all.ru/3.9/whatsnew/3.9.html) для полного описания. (Автор: Brandt Bucher в [bpo-36144](https://python-all.ru/3.9/whatsnew/3.9.html).)9697### Новые строковые методы для удаления префиксов и суффиксов9899Добавлены [`str.removeprefix(prefix)`](https://python-all.ru/3.9/library/stdtypes.html#str.removeprefix) и [`str.removesuffix(suffix)`](https://python-all.ru/3.9/library/stdtypes.html#str.removesuffix) для простого удаления ненужного префикса или суффикса из строки. Также добавлены соответствующие методы `bytes`, `bytearray` и `collections.UserString`. См. [**PEP 616**](https://python-all.ru/3.9/whatsnew/3.9.html) для полного описания. (Автор: Dennis Sweeney в [bpo-39939](https://python-all.ru/3.9/whatsnew/3.9.html).)100101### Обобщения (generics) для подсказок типов в стандартных коллекциях102103В аннотациях типов теперь можно использовать встроенные типы коллекций, такие как `list` и `dict`, в качестве обобщённых типов, вместо импорта соответствующих типов с заглавной буквы (например, `List` или `Dict`) из `typing`. Некоторые другие типы в стандартной библиотеке теперь также являются обобщёнными, например `queue.Queue`.104105Пример:106107```python108def greet_all(names: list[str]) -> None:109    for name in names:110        print("Hello", name)111```112113См. [**PEP 585**](https://python-all.ru/3.9/whatsnew/3.9.html) для подробностей. (Авторы: Guido van Rossum, Ethan Smith и Batuhan Taşkaya в [bpo-39481](https://python-all.ru/3.9/whatsnew/3.9.html).)114115### Новый парсер116117Python 3.9 использует новый парсер на основе [PEG](https://python-all.ru/3.9/whatsnew/3.9.html) вместо [LL(1)](https://python-all.ru/3.9/whatsnew/3.9.html). Производительность нового парсера примерно сравнима со старым, но формализм PEG более гибок, чем LL(1), когда речь идёт о проектировании новых возможностей языка. Мы начнём использовать эту гибкость в Python 3.10 и далее.118119Модуль [`ast`](https://python-all.ru/3.9/library/ast.html#module-ast) использует новый парсер и генерирует то же AST, что и старый парсер.120121В Python 3.10 старый парсер будет удалён, а вместе с ним и все функции, зависящие от него (прежде всего модуль [`parser`](https://python-all.ru/3.9/library/parser.html#module-parser), который давно устарел). В Python 3.9 *только* можно переключиться обратно на парсер LL(1) с помощью параметра командной строки (`-X oldparser`) или переменной окружения (`PYTHONOLDPARSER=1`).122123См. [**PEP 617**](https://python-all.ru/3.9/whatsnew/3.9.html) для подробностей. (Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в [bpo-40334](https://python-all.ru/3.9/whatsnew/3.9.html).)124125## Прочие изменения языка126127- [`__import__()`](https://python-all.ru/3.9/library/functions.html#__import__) теперь вызывает [`ImportError`](https://python-all.ru/3.9/library/exceptions.html#ImportError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError), что ранее происходило, когда относительный импорт выходил за пределы своего пакета верхнего уровня. (Автор: Ngalim Siregar в [bpo-37444](https://python-all.ru/3.9/whatsnew/3.9.html).)128- Python теперь получает абсолютный путь к имени файла сценария, указанному в командной строке (например: `python3 script.py`): атрибут `__file__` модуля [`__main__`](https://python-all.ru/3.9/library/__main__.html#module-__main__) стал абсолютным путём, а не относительным. Эти пути теперь остаются действительными после изменения текущего каталога с помощью [`os.chdir()`](https://python-all.ru/3.9/library/os.html#os.chdir). Как побочный эффект, трассировка также отображает абсолютный путь для кадров модуля [`__main__`](https://python-all.ru/3.9/library/__main__.html#module-__main__) в этом случае. (Автор: Victor Stinner в [bpo-20443](https://python-all.ru/3.9/whatsnew/3.9.html).)129- В [режиме разработки Python](https://python-all.ru/3.9/library/devmode.html#devmode) и в отладочной сборке аргументы *encoding* и *errors* теперь проверяются для операций кодирования и декодирования строк. Примеры: [`open()`](https://python-all.ru/3.9/library/functions.html#open), [`str.encode()`](https://python-all.ru/3.9/library/stdtypes.html#str.encode) и [`bytes.decode()`](https://python-all.ru/3.9/library/stdtypes.html#bytes.decode).130131  По умолчанию для максимальной производительности аргумент *errors* проверяется только при первой ошибке кодирования/декодирования, а аргумент *encoding* иногда игнорируется для пустых строк. (Автор: Victor Stinner в [bpo-37388](https://python-all.ru/3.9/whatsnew/3.9.html).)132- `"".replace("", s, n)` теперь возвращает `s` вместо пустой строки для всех ненулевых `n`. Теперь это согласовано с `"".replace("", s)`. Аналогичные изменения внесены для объектов [`bytes`](https://python-all.ru/3.9/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.9/library/stdtypes.html#bytearray). (Автор: Serhiy Storchaka в [bpo-28029](https://python-all.ru/3.9/whatsnew/3.9.html).)133- Любое допустимое выражение теперь может использоваться в качестве [декоратора](https://python-all.ru/3.9/glossary.html#term-decorator). Ранее грамматика была гораздо более ограничительной. См. [**PEP 614**](https://python-all.ru/3.9/whatsnew/3.9.html) для подробностей. (Автор: Brandt Bucher в [bpo-39702](https://python-all.ru/3.9/whatsnew/3.9.html).)134- Улучшена справка для модуля [`typing`](https://python-all.ru/3.9/library/typing.html#module-typing). Теперь докстринги отображаются для всех специальных форм и специальных обобщённых псевдонимов (например, `Union` и `List`). Использование [`help()`](https://python-all.ru/3.9/library/functions.html#help) с обобщённым псевдонимом, например `List[int]`, покажет справку для соответствующего конкретного типа (`list` в данном случае). (Автор: Serhiy Storchaka в [bpo-40257](https://python-all.ru/3.9/whatsnew/3.9.html).)135- Параллельный запуск [`aclose()`](https://python-all.ru/3.9/reference/expressions.html#agen.aclose) / [`asend()`](https://python-all.ru/3.9/reference/expressions.html#agen.asend) / [`athrow()`](https://python-all.ru/3.9/reference/expressions.html#agen.athrow) теперь запрещён, а `ag_running` теперь отражает фактический статус выполнения асинхронного генератора. (Автор: Yury Selivanov в [bpo-30773](https://python-all.ru/3.9/whatsnew/3.9.html).)136- Неожиданные ошибки при вызове метода `__iter__` больше не маскируются `TypeError` в операторе [`in`](https://python-all.ru/3.9/reference/expressions.html#in) и функциях [`contains()`](https://python-all.ru/3.9/library/operator.html#operator.contains), [`indexOf()`](https://python-all.ru/3.9/library/operator.html#operator.indexOf) и [`countOf()`](https://python-all.ru/3.9/library/operator.html#operator.countOf) модуля [`operator`](https://python-all.ru/3.9/library/operator.html#module-operator). (Автор: Serhiy Storchaka в [bpo-40824](https://python-all.ru/3.9/whatsnew/3.9.html).)137- Лямбда-выражения без скобок больше не могут быть частью выражения в предложении `if` в включениях и генераторных выражениях. См. [bpo-41848](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-43755](https://python-all.ru/3.9/whatsnew/3.9.html) для подробностей.138139## Новые модули140141### zoneinfo142143Модуль [`zoneinfo`](https://python-all.ru/3.9/library/zoneinfo.html#module-zoneinfo) добавляет поддержку базы данных часовых поясов IANA в стандартную библиотеку. Он добавляет [`zoneinfo.ZoneInfo`](https://python-all.ru/3.9/library/zoneinfo.html#zoneinfo.ZoneInfo) – конкретную реализацию [`datetime.tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), основанную на системных данных о часовых поясах.144145Пример:146147```python148>>> from zoneinfo import ZoneInfo149>>> from datetime import datetime, timedelta150151>>> # Летнее время152>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))153>>> print(dt)1542020-10-31 12:00:00-07:00155>>> dt.tzname()156'PDT'157158>>> # Стандартное время159>>> dt += timedelta(days=7)160>>> print(dt)1612020-11-07 12:00:00-08:00162>>> print(dt.tzname())163PST164```165166В качестве резервного источника данных для платформ, которые не поставляют базу IANA, модуль [`tzdata`](https://python-all.ru/3.9/whatsnew/3.9.html) был выпущен как пакет первого уровня (first-party) – распространяется через PyPI и поддерживается основной командой CPython.167168> **См. также**169>170> **[**PEP 615**](https://python-all.ru/3.9/whatsnew/3.9.html) – Поддержка базы данных часовых поясов IANA в стандартной библиотеке**171>172> PEP написан и реализован Полом Ганслом.173174### graphlib175176Добавлен новый модуль [`graphlib`](https://python-all.ru/3.9/library/graphlib.html#module-graphlib), содержащий класс [`graphlib.TopologicalSorter`](https://python-all.ru/3.9/library/graphlib.html#graphlib.TopologicalSorter) для топологической сортировки графов. (Авторы: Pablo Galindo, Tim Peters и Larry Hastings в [bpo-17005](https://python-all.ru/3.9/whatsnew/3.9.html).)177178## Улучшенные модули179180### ast181182Добавлена опция *indent* в [`dump()`](https://python-all.ru/3.9/library/ast.html#ast.dump), позволяющая создавать многострочный вывод с отступами. (Автор: Serhiy Storchaka в [bpo-37995](https://python-all.ru/3.9/whatsnew/3.9.html).)183184Добавлена функция [`ast.unparse()`](https://python-all.ru/3.9/library/ast.html#ast.unparse) в модуль [`ast`](https://python-all.ru/3.9/library/ast.html#module-ast), которую можно использовать для обратного синтаксического анализа объекта [`ast.AST`](https://python-all.ru/3.9/library/ast.html#ast.AST) и получения строки с кодом, который при разборе даст эквивалентный объект [`ast.AST`](https://python-all.ru/3.9/library/ast.html#ast.AST). (Авторы: Pablo Galindo и Batuhan Taskaya в [bpo-38870](https://python-all.ru/3.9/whatsnew/3.9.html).)185186Добавлены строки документации к узлам AST, содержащие сигнатуру ASDL, используемую для создания этого узла. (Автор: Batuhan Taskaya в [bpo-39638](https://python-all.ru/3.9/whatsnew/3.9.html).)187188### asyncio189190Из-за серьёзных проблем безопасности параметр *reuse\_address* функции [`asyncio.loop.create_datagram_endpoint()`](https://python-all.ru/3.9/library/asyncio-eventloop.html#asyncio.loop.create_datagram_endpoint) больше не поддерживается. Это связано с поведением опции сокета `SO_REUSEADDR` в UDP. Подробнее см. документацию `loop.create_datagram_endpoint()`. (Авторы: Kyle Stanley, Antoine Pitrou и Yury Selivanov в [bpo-37228](https://python-all.ru/3.9/whatsnew/3.9.html).)191192Добавлена новая [корутина](https://python-all.ru/3.9/glossary.html#term-coroutine) [`shutdown_default_executor()`](https://python-all.ru/3.9/library/asyncio-eventloop.html#asyncio.loop.shutdown_default_executor), которая планирует завершение работы исполнителя по умолчанию, ожидая завершения закрытия [`ThreadPoolExecutor`](https://python-all.ru/3.9/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor). Также [`asyncio.run()`](https://python-all.ru/3.9/library/asyncio-task.html#asyncio.run) обновлена для использования новой [корутины](https://python-all.ru/3.9/glossary.html#term-coroutine). (Предложено Кайлом Стэнли в [bpo-34037](https://python-all.ru/3.9/whatsnew/3.9.html).)193194Добавлена [`asyncio.PidfdChildWatcher`](https://python-all.ru/3.9/library/asyncio-policy.html#asyncio.PidfdChildWatcher), реализация наблюдателя за дочерними процессами для Linux, которая опрашивает файловые дескрипторы процессов. ([bpo-38692](https://python-all.ru/3.9/whatsnew/3.9.html))195196Добавлена новая [корутина](https://python-all.ru/3.9/glossary.html#term-coroutine) [`asyncio.to_thread()`](https://python-all.ru/3.9/library/asyncio-task.html#asyncio.to_thread). В основном используется для выполнения функций, связанных с вводом-выводом, в отдельном потоке, чтобы не блокировать цикл событий, и по сути работает как высокоуровневая версия [`run_in_executor()`](https://python-all.ru/3.9/library/asyncio-eventloop.html#asyncio.loop.run_in_executor), которая может напрямую принимать именованные аргументы. (Авторы: Kyle Stanley и Yury Selivanov в [bpo-32309](https://python-all.ru/3.9/whatsnew/3.9.html).)197198При отмене задачи из-за тайм-аута [`asyncio.wait_for()`](https://python-all.ru/3.9/library/asyncio-task.html#asyncio.wait_for) теперь будет ждать завершения отмены также и в случае, когда *timeout* \<= 0, как и при положительных значениях тайм-аута. (Автор: Elvis Pranskevichus в [bpo-32751](https://python-all.ru/3.9/whatsnew/3.9.html).)199200[`asyncio`](https://python-all.ru/3.9/library/asyncio.html#module-asyncio) теперь вызывает `TyperError` при вызове несовместимых методов с сокетом [`ssl.SSLSocket`](https://python-all.ru/3.9/library/ssl.html#ssl.SSLSocket). (Автор: Ido Michael в [bpo-37404](https://python-all.ru/3.9/whatsnew/3.9.html).)201202### compileall203204Добавлена новая возможность использовать жёсткие ссылки для дублирующихся файлов `.pyc`: параметр *hardlink\_dupes* и опция командной строки –hardlink-dupes. (Автор: Lumír ‘Frenzy’ Balhar в [bpo-40495](https://python-all.ru/3.9/whatsnew/3.9.html).)205206Добавлены новые опции для управления путями в результирующих файлах `.pyc`: параметры *stripdir*, *prependdir*, *limit\_sl\_dest* и опции командной строки -s, -p, -e. Добавлена возможность указывать опцию для уровня оптимизации несколько раз. (Автор: Lumír ‘Frenzy’ Balhar в [bpo-38112](https://python-all.ru/3.9/whatsnew/3.9.html).)207208### concurrent.futures209210Добавлен новый параметр *cancel\_futures* в [`concurrent.futures.Executor.shutdown()`](https://python-all.ru/3.9/library/concurrent.futures.html#concurrent.futures.Executor.shutdown), который отменяет все ожидающие выполнения future, которые ещё не начали выполняться, вместо ожидания их завершения перед остановкой исполнителя. (Автор: Kyle Stanley в [bpo-39349](https://python-all.ru/3.9/whatsnew/3.9.html).)211212Удалены потоки-демоны из [`ThreadPoolExecutor`](https://python-all.ru/3.9/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) и [`ProcessPoolExecutor`](https://python-all.ru/3.9/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor). Это улучшает совместимость с под-интерпретаторами и предсказуемость процессов их завершения. (Автор: Kyle Stanley в [bpo-39812](https://python-all.ru/3.9/whatsnew/3.9.html).)213214Рабочие процессы в [`ProcessPoolExecutor`](https://python-all.ru/3.9/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor) теперь создаются по требованию, только когда нет свободных рабочих процессов для повторного использования. Это оптимизирует накладные расходы при запуске и уменьшает количество потерянного процессорного времени на простаивающие рабочие процессы. (Автор: Kyle Stanley в [bpo-39207](https://python-all.ru/3.9/whatsnew/3.9.html).)215216### curses217218Добавлены функции [`curses.get_escdelay()`](https://python-all.ru/3.9/library/curses.html#curses.get_escdelay), [`curses.set_escdelay()`](https://python-all.ru/3.9/library/curses.html#curses.set_escdelay), [`curses.get_tabsize()`](https://python-all.ru/3.9/library/curses.html#curses.get_tabsize) и [`curses.set_tabsize()`](https://python-all.ru/3.9/library/curses.html#curses.set_tabsize). (Автор: Anthony Sottile в [bpo-38312](https://python-all.ru/3.9/whatsnew/3.9.html).)219220### datetime221222Методы [`isocalendar()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.isocalendar) из [`datetime.date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) и [`isocalendar()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.isocalendar) из [`datetime.datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) теперь возвращают [`namedtuple()`](https://python-all.ru/3.9/library/collections.html#collections.namedtuple) вместо [`tuple`](https://python-all.ru/3.9/library/stdtypes.html#tuple). (Автор: Dong-hee Na в [bpo-24416](https://python-all.ru/3.9/whatsnew/3.9.html).)223224### distutils225226Команда **upload** теперь создаёт хеш-дайджесты SHA2-256 и Blake2b-256. Она пропускает MD5 на платформах, которые блокируют дайджест MD5. (Автор: Christian Heimes в [bpo-40698](https://python-all.ru/3.9/whatsnew/3.9.html).)227228### fcntl229230Добавлены константы `F_OFD_GETLK`, `F_OFD_SETLK` и `F_OFD_SETLKW`. (Автор: Dong-hee Na в [bpo-38602](https://python-all.ru/3.9/whatsnew/3.9.html).)231232### ftplib233234[`FTP`](https://python-all.ru/3.9/library/ftplib.html#ftplib.FTP) и [`FTP_TLS`](https://python-all.ru/3.9/library/ftplib.html#ftplib.FTP_TLS) теперь вызывают [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Dong-hee Na, [bpo-39259](https://python-all.ru/3.9/whatsnew/3.9.html).)235236### gc237238Когда сборщик мусора выполняет сборку, в ходе которой некоторые объекты воскресают (они становятся доступны извне изолированных циклов после выполнения финализаторов), сборка всех объектов, которые всё ещё недоступны, не блокируется. (Авторы: Pablo Galindo и Tim Peters в [bpo-38379](https://python-all.ru/3.9/whatsnew/3.9.html).)239240Добавлена новая функция [`gc.is_finalized()`](https://python-all.ru/3.9/library/gc.html#gc.is_finalized) для проверки, был ли объект финализирован сборщиком мусора. (Автор: Pablo Galindo в [bpo-39322](https://python-all.ru/3.9/whatsnew/3.9.html).)241242### hashlib243244Модуль [`hashlib`](https://python-all.ru/3.9/library/hashlib.html#module-hashlib) теперь может использовать хеши SHA3 и SHAKE XOF из OpenSSL при их наличии. (Автор: Christian Heimes в [bpo-37630](https://python-all.ru/3.9/whatsnew/3.9.html).)245246Встроенные хеш-модули теперь можно отключить с помощью `./configure --without-builtin-hashlib-hashes` или выборочно включить, например, `./configure --with-builtin-hashlib-hashes=sha3,blake2`, чтобы принудительно использовать реализацию на основе OpenSSL. (Автор: Christian Heimes в [bpo-40479](https://python-all.ru/3.9/whatsnew/3.9.html))247248### http249250Коды состояния HTTP `103 EARLY_HINTS`, `418 IM_A_TEAPOT` и `425 TOO_EARLY` добавлены в [`http.HTTPStatus`](https://python-all.ru/3.9/library/http.html#http.HTTPStatus). (Авторы: Dong-hee Na в [bpo-39509](https://python-all.ru/3.9/whatsnew/3.9.html) и Ross Rhodes в [bpo-39507](https://python-all.ru/3.9/whatsnew/3.9.html).)251252### IDLE и idlelib253254Добавлена опция для отключения мигания курсора. (Автор: Zackery Spytz в [bpo-4603](https://python-all.ru/3.9/whatsnew/3.9.html).)255256Клавиша Escape теперь закрывает окна автодополнения IDLE. (Автор: Johnny Najera в [bpo-38944](https://python-all.ru/3.9/whatsnew/3.9.html).)257258Добавлены ключевые слова в список завершения имён модулей. (Автор: Terry J. Reedy в [bpo-37765](https://python-all.ru/3.9/whatsnew/3.9.html).)259260Новое в корректирующих выпусках 3.9261262IDLE теперь вызывает [`sys.excepthook()`](https://python-all.ru/3.9/library/sys.html#sys.excepthook) (при запуске без «-n»). Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в [bpo-43008](https://python-all.ru/3.9/whatsnew/3.9.html).)263264Приведённые выше изменения были перенесены в корректирующие выпуски 3.8.265266Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в [bpo-40468](https://python-all.ru/3.9/whatsnew/3.9.html).) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в [bpo-33962](https://python-all.ru/3.9/whatsnew/3.9.html).)267268Применять подсветку синтаксиса к файлам *.pyi*. (Предложено Alex Waygood и Terry Jan Reedy в [bpo-45447](https://python-all.ru/3.9/whatsnew/3.9.html).)269270### imaplib271272[`IMAP4`](https://python-all.ru/3.9/library/imaplib.html#imaplib.IMAP4) и [`IMAP4_SSL`](https://python-all.ru/3.9/library/imaplib.html#imaplib.IMAP4_SSL) теперь имеют необязательный параметр *таймаут* в своих конструкторах. Кроме того, метод [`open()`](https://python-all.ru/3.9/library/imaplib.html#imaplib.IMAP4.open) теперь имеет необязательный параметр *таймаут* в рамках этого изменения. Изменение также затронуло переопределённые методы [`IMAP4_SSL`](https://python-all.ru/3.9/library/imaplib.html#imaplib.IMAP4_SSL) и [`IMAP4_stream`](https://python-all.ru/3.9/library/imaplib.html#imaplib.IMAP4_stream). (Автор: Dong-hee Na в [bpo-38615](https://python-all.ru/3.9/whatsnew/3.9.html).)273274Добавлен [`imaplib.IMAP4.unselect()`](https://python-all.ru/3.9/library/imaplib.html#imaplib.IMAP4.unselect). [`imaplib.IMAP4.unselect()`](https://python-all.ru/3.9/library/imaplib.html#imaplib.IMAP4.unselect) освобождает ресурсы сервера, связанные с выбранным почтовым ящиком, и возвращает сервер в аутентифицированное состояние. Эта команда выполняет те же действия, что и [`imaplib.IMAP4.close()`](https://python-all.ru/3.9/library/imaplib.html#imaplib.IMAP4.close), за исключением того, что никакие сообщения не удаляются навсегда из текущего выбранного почтового ящика. (Автор: Dong-hee Na в [bpo-40375](https://python-all.ru/3.9/whatsnew/3.9.html).)275276### importlib277278Для улучшения согласованности с операторами import [`importlib.util.resolve_name()`](https://python-all.ru/3.9/library/importlib.html#importlib.util.resolve_name) теперь вызывает [`ImportError`](https://python-all.ru/3.9/library/exceptions.html#ImportError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) при попытке недопустимого относительного импорта. (Автор: Ngalim Siregar в [bpo-37444](https://python-all.ru/3.9/whatsnew/3.9.html).)279280Загрузчики импорта, которые предоставляют неизменяемые объекты модулей, теперь могут предоставлять неизменяемые пакеты в дополнение к отдельным модулям. (Автор: Dino Viehland в [bpo-39336](https://python-all.ru/3.9/whatsnew/3.9.html).)281282Добавлена функция [`importlib.resources.files()`](https://python-all.ru/3.9/library/importlib.html#importlib.resources.files) с поддержкой подкаталогов в данных пакета, что соответствует обратному порту в `importlib_resources` версии 1.5. (Автор: Jason R. Coombs в [bpo-39791](https://python-all.ru/3.9/whatsnew/3.9.html).)283284Обновлён `importlib.metadata` из `importlib_metadata` версии 1.6.1.285286### inspect287288[`inspect.BoundArguments.arguments`](https://python-all.ru/3.9/library/inspect.html#inspect.BoundArguments.arguments) изменён с `OrderedDict` на обычный dict. (Автор: Inada Naoki в [bpo-36350](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-39775](https://python-all.ru/3.9/whatsnew/3.9.html).)289290### ipaddress291292[`ipaddress`](https://python-all.ru/3.9/library/ipaddress.html#module-ipaddress) теперь поддерживает адреса IPv6 с областью действия (IPv6-адрес с суффиксом `%<scope_id>`).293294Адреса IPv6 с областью действия можно разобрать с помощью [`ipaddress.IPv6Address`](https://python-all.ru/3.9/library/ipaddress.html#ipaddress.IPv6Address). Если присутствует, идентификатор зоны области действия доступен через атрибут [`scope_id`](https://python-all.ru/3.9/library/ipaddress.html#ipaddress.IPv6Address.scope_id). (Автор: Oleksandr Pavliuk в [bpo-34788](https://python-all.ru/3.9/whatsnew/3.9.html).)295296Начиная с Python 3.9.5 модуль [`ipaddress`](https://python-all.ru/3.9/library/ipaddress.html#module-ipaddress) больше не принимает ведущие нули в строках IPv4-адресов. (Автор: Christian Heimes в [bpo-36384](https://python-all.ru/3.9/whatsnew/3.9.html)).297298### math299300Расширена функция [`math.gcd()`](https://python-all.ru/3.9/library/math.html#math.gcd) для обработки нескольких аргументов. Ранее она поддерживала только два аргумента. (Автор: Serhiy Storchaka в [bpo-39648](https://python-all.ru/3.9/whatsnew/3.9.html).)301302Добавлена [`math.lcm()`](https://python-all.ru/3.9/library/math.html#math.lcm): возвращает наименьшее общее кратное указанных аргументов. (Авторы: Mark Dickinson, Ananthakrishnan и Serhiy Storchaka в [bpo-39479](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-39648](https://python-all.ru/3.9/whatsnew/3.9.html).)303304Добавлена [`math.nextafter()`](https://python-all.ru/3.9/library/math.html#math.nextafter): возвращает следующее значение с плавающей запятой после *x* по направлению к *y*. (Автор: Victor Stinner в [bpo-39288](https://python-all.ru/3.9/whatsnew/3.9.html).)305306Добавлена [`math.ulp()`](https://python-all.ru/3.9/library/math.html#math.ulp): возвращает значение младшего значащего бита числа с плавающей запятой. (Автор: Victor Stinner в [bpo-39310](https://python-all.ru/3.9/whatsnew/3.9.html).)307308### multiprocessing309310Класс [`multiprocessing.SimpleQueue`](https://python-all.ru/3.9/library/multiprocessing.html#multiprocessing.SimpleQueue) теперь имеет новый метод [`close()`](https://python-all.ru/3.9/library/multiprocessing.html#multiprocessing.SimpleQueue.close) для явного закрытия очереди. (Автор: Victor Stinner в [bpo-30966](https://python-all.ru/3.9/whatsnew/3.9.html).)311312### nntplib313314[`NNTP`](https://python-all.ru/3.9/library/nntplib.html#nntplib.NNTP) и [`NNTP_SSL`](https://python-all.ru/3.9/library/nntplib.html#nntplib.NNTP_SSL) теперь вызывают [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Dong-hee Na, [bpo-39259](https://python-all.ru/3.9/whatsnew/3.9.html).)315316### os317318Добавлены [`CLD_KILLED`](https://python-all.ru/3.9/library/os.html#os.CLD_KILLED) и [`CLD_STOPPED`](https://python-all.ru/3.9/library/os.html#os.CLD_STOPPED) для `si_code`. (Автор: Dong-hee Na, [bpo-38493](https://python-all.ru/3.9/whatsnew/3.9.html).)319320Добавлены специфичные для Linux [`os.pidfd_open()`](https://python-all.ru/3.9/library/os.html#os.pidfd_open) ([bpo-38692](https://python-all.ru/3.9/whatsnew/3.9.html)) и [`os.P_PIDFD`](https://python-all.ru/3.9/library/os.html#os.P_PIDFD) ([bpo-38713](https://python-all.ru/3.9/whatsnew/3.9.html)) для управления процессами с помощью файловых дескрипторов.321322Функция [`os.unsetenv()`](https://python-all.ru/3.9/library/os.html#os.unsetenv) теперь также доступна в Windows. (Автор: Victor Stinner в [bpo-39413](https://python-all.ru/3.9/whatsnew/3.9.html).)323324Функции [`os.putenv()`](https://python-all.ru/3.9/library/os.html#os.putenv) и [`os.unsetenv()`](https://python-all.ru/3.9/library/os.html#os.unsetenv) теперь всегда доступны. (Автор: Victor Stinner в [bpo-39395](https://python-all.ru/3.9/whatsnew/3.9.html).)325326Добавлена функция [`os.waitstatus_to_exitcode()`](https://python-all.ru/3.9/library/os.html#os.waitstatus_to_exitcode): преобразует статус ожидания в код завершения. (Автор: Victor Stinner в [bpo-40094](https://python-all.ru/3.9/whatsnew/3.9.html).)327328Начиная с версии 3.9.20, [`os.mkdir()`](https://python-all.ru/3.9/library/os.html#os.mkdir) и [`os.makedirs()`](https://python-all.ru/3.9/library/os.html#os.makedirs) в Windows теперь поддерживают передачу значения `0o700` для параметра *mode*, чтобы применить контроль доступа к новой директории. Это неявно затрагивает [`tempfile.mkdtemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkdtemp) и является мерой по смягчению последствий CVE-2024-4030. Другие значения *mode* по-прежнему игнорируются. (Предложено Steve Dower в [gh-118486](https://python-all.ru/3.9/whatsnew/3.9.html).)329330### pathlib331332Добавлен [`pathlib.Path.readlink()`](https://python-all.ru/3.9/library/pathlib.html#pathlib.Path.readlink), который работает аналогично [`os.readlink()`](https://python-all.ru/3.9/library/os.html#os.readlink). (Автор: Girts Folkmanis в [bpo-30618](https://python-all.ru/3.9/whatsnew/3.9.html))333334### pdb335336В Windows [`Pdb`](https://python-all.ru/3.9/library/pdb.html#pdb.Pdb) теперь поддерживает `~/.pdbrc`. (Авторы: Tim Hopper и Dan Lidral-Porter в [bpo-20523](https://python-all.ru/3.9/whatsnew/3.9.html).)337338### poplib339340[`POP3`](https://python-all.ru/3.9/library/poplib.html#poplib.POP3) и [`POP3_SSL`](https://python-all.ru/3.9/library/poplib.html#poplib.POP3_SSL) теперь вызывают [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Dong-hee Na, [bpo-39259](https://python-all.ru/3.9/whatsnew/3.9.html).)341342### pprint343344[`pprint`](https://python-all.ru/3.9/library/pprint.html#module-pprint) теперь может красиво печатать [`types.SimpleNamespace`](https://python-all.ru/3.9/library/types.html#types.SimpleNamespace). (Автор: Carl Bordum Hansen в [bpo-37376](https://python-all.ru/3.9/whatsnew/3.9.html).)345346### pydoc347348Строка документации теперь отображается не только для классов, функций, методов и т.д., но и для любого объекта, имеющего собственный атрибут `__doc__`. (Предложено Serhiy Storchaka в [bpo-40257](https://python-all.ru/3.9/whatsnew/3.9.html).)349350### random351352Добавлен новый метод `random.Random.randbytes`: генерирует случайные байты. (Автор: Victor Stinner в [bpo-40286](https://python-all.ru/3.9/whatsnew/3.9.html).)353354### signal355356Добавлен специфичный для Linux [`signal.pidfd_send_signal()`](https://python-all.ru/3.9/library/signal.html#signal.pidfd_send_signal) для отправки сигналов процессу с помощью файлового дескриптора вместо pid. ([bpo-38712](https://python-all.ru/3.9/whatsnew/3.9.html))357358### smtplib359360[`SMTP`](https://python-all.ru/3.9/library/smtplib.html#smtplib.SMTP) и [`SMTP_SSL`](https://python-all.ru/3.9/library/smtplib.html#smtplib.SMTP_SSL) теперь вызывают [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Dong-hee Na, [bpo-39259](https://python-all.ru/3.9/whatsnew/3.9.html).)361362Конструктор [`LMTP`](https://python-all.ru/3.9/library/smtplib.html#smtplib.LMTP) теперь имеет необязательный параметр *тайм-аут*. (Автор: Dong-hee Na, [bpo-39329](https://python-all.ru/3.9/whatsnew/3.9.html).)363364### socket365366Модуль [`socket`](https://python-all.ru/3.9/library/socket.html#module-socket) теперь экспортирует константу [`CAN_RAW_JOIN_FILTERS`](https://python-all.ru/3.9/library/socket.html#socket.CAN_RAW_JOIN_FILTERS) в Linux 4.1 и выше. (Авторы: Stefan Tatschner и Zackery Spytz в [bpo-25780](https://python-all.ru/3.9/whatsnew/3.9.html).)367368Модуль socket теперь поддерживает протокол [`CAN_J1939`](https://python-all.ru/3.9/library/socket.html#socket.CAN_J1939) на платформах, которые его поддерживают. (Автор: Karl Ding в [bpo-40291](https://python-all.ru/3.9/whatsnew/3.9.html).)369370Модуль socket теперь содержит функции [`socket.send_fds()`](https://python-all.ru/3.9/library/socket.html#socket.send_fds) и [`socket.recv_fds()`](https://python-all.ru/3.9/library/socket.html#socket.recv_fds). (Авторы: Joannah Nanjekye, Shinya Okano и Victor Stinner, [bpo-28724](https://python-all.ru/3.9/whatsnew/3.9.html).)371372### time373374На AIX [`thread_time()`](https://python-all.ru/3.9/library/time.html#time.thread_time) теперь реализована с помощью `thread_cputime()`, которая имеет наносекундное разрешение, вместо `clock_gettime(CLOCK_THREAD_CPUTIME_ID)` с разрешением 10 мс. (Автор: Batuhan Taskaya, [bpo-40192](https://python-all.ru/3.9/whatsnew/3.9.html))375376### sys377378Добавлен новый атрибут [`sys.platlibdir`](https://python-all.ru/3.9/library/sys.html#sys.platlibdir): имя каталога библиотек, зависящего от платформы. Он используется для построения пути к стандартной библиотеке и путям к установленным модулям расширения. На большинстве платформ он равен `"lib"`. На Fedora и SuSE на 64-битных платформах он равен `"lib64"`. (Авторы: Jan Matějek, Matěj Cepl, Charalampos Stratakis и Victor Stinner, [bpo-1294959](https://python-all.ru/3.9/whatsnew/3.9.html).)379380Ранее [`sys.stderr`](https://python-all.ru/3.9/library/sys.html#sys.stderr) использовал блочную буферизацию в неинтерактивном режиме. Теперь `stderr` по умолчанию всегда использует построчную буферизацию. (Автор: Jendrik Seipp, [bpo-13601](https://python-all.ru/3.9/whatsnew/3.9.html).)381382### tempfile383384Начиная с версии 3.9.20 в Windows, режим по умолчанию `0o700`, используемый [`tempfile.mkdtemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkdtemp), теперь ограничивает доступ к новой директории из-за изменений в [`os.mkdir()`](https://python-all.ru/3.9/library/os.html#os.mkdir). Это мера по смягчению последствий CVE-2024-4030. (Предложено Steve Dower в [gh-118486](https://python-all.ru/3.9/whatsnew/3.9.html).)385386### tracemalloc387388Добавлен [`tracemalloc.reset_peak()`](https://python-all.ru/3.9/library/tracemalloc.html#tracemalloc.reset_peak) для установки пикового размера отслеживаемых блоков памяти равным текущему размеру, чтобы измерять пик для определённых участков кода. (Автор: Huon Wilson, [bpo-40630](https://python-all.ru/3.9/whatsnew/3.9.html).)389390### typing391392[**PEP 593**](https://python-all.ru/3.9/whatsnew/3.9.html) представил тип [`typing.Annotated`](https://python-all.ru/3.9/library/typing.html#typing.Annotated) для декорирования существующих типов контекстно-зависимыми метаданными и новый параметр `include_extras` для [`typing.get_type_hints()`](https://python-all.ru/3.9/library/typing.html#typing.get_type_hints) доступа к метаданным во время выполнения. (Авторы: Till Varoquaux и Konstantin Kashin.)393394### unicodedata395396База данных Unicode обновлена до версии 13.0.0. ([bpo-39926](https://python-all.ru/3.9/whatsnew/3.9.html)).397398### venv399400Сценарии активации, предоставляемые [`venv`](https://python-all.ru/3.9/library/venv.html#module-venv), теперь все единообразно задают настройку приглашения, всегда используя значение, указанное `__VENV_PROMPT__`. Ранее некоторые сценарии безусловно использовали `__VENV_PROMPT__`, другие только если оно было установлено (что было по умолчанию), а один использовал `__VENV_NAME__` вместо. (Автор: Brett Cannon, [bpo-37663](https://python-all.ru/3.9/whatsnew/3.9.html).)401402### xml403404Пробельные символы внутри атрибутов теперь сохраняются при сериализации [`xml.etree.ElementTree`](https://python-all.ru/3.9/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) в XML-файл. Символы конца строки больше не нормализуются в 'n'. Это результат обсуждения интерпретации раздела 2.11 спецификации XML. (Автор: Mefistotelis, [bpo-39011](https://python-all.ru/3.9/whatsnew/3.9.html).)405406## Оптимизации407408- Оптимизирован идиом для присваивания временной переменной в генераторах. Теперь `for y in [expr]` в генераторах работает так же быстро, как простое присваивание `y = expr`. Например:409410  > sums = \[s for s in \[0\] for x in data for s in \[s + x\]\]411412  В отличие от оператора `:=`, этот идиом не выносит переменную во внешнюю область видимости.413414  (Автор: Serhiy Storchaka, [bpo-32856](https://python-all.ru/3.9/whatsnew/3.9.html).)415- Оптимизирована обработка сигналов в многопоточных приложениях. Если сигнал получает поток, отличный от главного, цикл выполнения байт-кода больше не прерывается на каждой инструкции для проверки ожидающих сигналов, которые не могут быть обработаны. Только главный поток главного интерпретатора может обрабатывать сигналы.416417  Ранее цикл выполнения байт-кода прерывался на каждой инструкции до тех пор, пока главный поток не обработает сигналы. (Автор: Victor Stinner, [bpo-40010](https://python-all.ru/3.9/whatsnew/3.9.html).)418- Оптимизирован модуль [`subprocess`](https://python-all.ru/3.9/library/subprocess.html#module-subprocess) на FreeBSD с использованием `closefrom()`. (Авторы: Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak и Victor Stinner, [bpo-38061](https://python-all.ru/3.9/whatsnew/3.9.html).)419- [`PyLong_FromDouble()`](https://python-all.ru/3.9/c-api/long.html#c.PyLong_FromDouble) теперь работает до 1.87x быстрее для значений, которые помещаются в `long`. (Автор: Sergey Fedoseev, [bpo-37986](https://python-all.ru/3.9/whatsnew/3.9.html).)420- Некоторые встроенные функции Python ([`range`](https://python-all.ru/3.9/library/stdtypes.html#range), [`tuple`](https://python-all.ru/3.9/library/stdtypes.html#tuple), [`set`](https://python-all.ru/3.9/library/stdtypes.html#set), [`frozenset`](https://python-all.ru/3.9/library/stdtypes.html#frozenset), [`list`](https://python-all.ru/3.9/library/stdtypes.html#list), [`dict`](https://python-all.ru/3.9/library/stdtypes.html#dict)) теперь ускорены за счёт использования [**PEP 590**](https://python-all.ru/3.9/whatsnew/3.9.html) протокола vectorcall. (Авторы: Dong-hee Na, Mark Shannon, Jeroen Demeyer и Petr Viktorin, [bpo-37207](https://python-all.ru/3.9/whatsnew/3.9.html).)421- Оптимизирован `difference_update()` для случая, когда другое множество значительно больше базового. (Предложено Evgeny Kapun, код от Michele Orrù, [bpo-8425](https://python-all.ru/3.9/whatsnew/3.9.html).)422- Аллокатор малых объектов Python (`obmalloc.c`) теперь разрешает (не более) одной пустой арене оставаться доступной для немедленного повторного использования, не возвращая её ОС. Это предотвращает «трешинг» в простых циклах, где арена могла бы создаваться и уничтожаться заново на каждой итерации. (Автор: Tim Peters, [bpo-37257](https://python-all.ru/3.9/whatsnew/3.9.html).)423- [Целочисленное деление](https://python-all.ru/3.9/glossary.html#term-floor-division) для операций с числами с плавающей запятой теперь работает быстрее. Кроме того, обновлено сообщение [`ZeroDivisionError`](https://python-all.ru/3.9/library/exceptions.html#ZeroDivisionError) для этой операции. (Автор: Dong-hee Na, [bpo-39434](https://python-all.ru/3.9/whatsnew/3.9.html).)424- Декодирование коротких ASCII-строк с помощью кодировок UTF-8 и ascii теперь примерно на 15% быстрее. (Автор: Inada Naoki, [bpo-37348](https://python-all.ru/3.9/whatsnew/3.9.html).)425426Вот сводка улучшений производительности от Python 3.4 до Python 3.9:427428```text429Python version                       3.4     3.5     3.6     3.7     3.8    3.9430--------------                       ---     ---     ---     ---     ---    ---431432Variable and attribute read access:433    read_local                       7.1     7.1     5.4     5.1     3.9    3.9434    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5435    read_global                     15.5    19.0    14.3    13.6     7.6    7.8436    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8437    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9438    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9439    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3440    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5441    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7442    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1443444Variable and attribute write access:445    write_local                      8.7     9.3     5.5     5.3     4.3    4.3446    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8447    write_global                    19.7    21.2    18.0    18.0    15.8   16.7448    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8449    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4450    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8451452Data structure read access:453    read_list                       24.2    24.5    20.8    20.8    19.0   19.5454    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2455    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4456    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5457458Data structure write access:459    write_list                      27.1    28.5    22.5    21.6    20.0   20.0460    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7461    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4462    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5463464Stack (or queue) operations:465    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6466    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2467    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4468469Timing loop:470    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3471```472473Эти результаты были получены с помощью сценария тестирования доступа к переменным по адресу: `Tools/scripts/var_access_benchmark.py`. Сценарий отображает время в наносекундах. Тесты проводились на процессоре [Intel® Core™ i7-4960HQ](https://python-all.ru/3.9/whatsnew/3.9.html) под управлением 64-битных сборок macOS, доступных на [python.org](https://python-all.ru/3.9/whatsnew/3.9.html).474475## Устарело476477- Команда `bdist_msi` в distutils теперь устарела, используйте вместо неё `bdist_wheel` (пакеты wheel). (Автор: Hugo van Kemenade, [bpo-39586](https://python-all.ru/3.9/whatsnew/3.9.html).)478- В настоящее время [`math.factorial()`](https://python-all.ru/3.9/library/math.html#math.factorial) принимает экземпляры [`float`](https://python-all.ru/3.9/library/functions.html#float) с неотрицательными целочисленными значениями (например, `5.0`). Для нецелых и отрицательных чисел с плавающей запятой возбуждается [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Сейчас это поведение устарело. В будущих версиях Python для всех чисел с плавающей запятой будет возбуждаться [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError). (Автор: Serhiy Storchaka в [bpo-37315](https://python-all.ru/3.9/whatsnew/3.9.html).)479- Модули [`parser`](https://python-all.ru/3.9/library/parser.html#module-parser) и [`symbol`](https://python-all.ru/3.9/library/symbol.html#module-symbol) устарели и будут удалены в будущих версиях Python. В большинстве случаев пользователи могут задействовать этап генерации и компиляции абстрактного синтаксического дерева (AST) с помощью модуля [`ast`](https://python-all.ru/3.9/library/ast.html#module-ast).480- Функции публичного C API [`PyParser_SimpleParseStringFlags()`](https://python-all.ru/3.9/c-api/veryhigh.html#c.PyParser_SimpleParseStringFlags), [`PyParser_SimpleParseStringFlagsFilename()`](https://python-all.ru/3.9/c-api/veryhigh.html#c.PyParser_SimpleParseStringFlagsFilename), [`PyParser_SimpleParseFileFlags()`](https://python-all.ru/3.9/c-api/veryhigh.html#c.PyParser_SimpleParseFileFlags) и `PyNode_Compile()` устарели и будут удалены в Python 3.10 вместе со старым парсером.481- Использование [`NotImplemented`](https://python-all.ru/3.9/library/constants.html#NotImplemented) в логическом контексте объявлено устаревшим, поскольку почти всегда является результатом неправильной реализации расширенных операторов сравнения. В одной из будущих версий Python оно будет преобразовано в [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError). (Автор: Josh Rosenberg в [bpo-35712](https://python-all.ru/3.9/whatsnew/3.9.html).)482- Модуль [`random`](https://python-all.ru/3.9/library/random.html#module-random) в настоящее время принимает любой хешируемый тип в качестве возможного значения зерна. К сожалению, для некоторых из этих типов хеш-значение не гарантированно детерминировано. После Python 3.9 модуль будет ограничивать свои зерна типами [`None`](https://python-all.ru/3.9/library/constants.html#None), [`int`](https://python-all.ru/3.9/library/functions.html#int), [`float`](https://python-all.ru/3.9/library/functions.html#float), [`str`](https://python-all.ru/3.9/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.9/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.9/library/stdtypes.html#bytearray).483- Открытие файла [`GzipFile`](https://python-all.ru/3.9/library/gzip.html#gzip.GzipFile) для записи без указания аргумента *mode* объявлено устаревшим. В будущих версиях Python он всегда будет открываться для чтения по умолчанию. Укажите аргумент *mode*, чтобы открыть его для записи и отключить предупреждение. (Автор: Serhiy Storchaka в [bpo-28286](https://python-all.ru/3.9/whatsnew/3.9.html).)484- Метод `split()` класса `_tkinter.TkappType` объявлен устаревшим в пользу метода `splitlist()`, обладающего более последовательным и предсказуемым поведением. (Предложено Serhiy Storchaka в [bpo-38371](https://python-all.ru/3.9/whatsnew/3.9.html).)485- Явная передача объектов-корутин в [`asyncio.wait()`](https://python-all.ru/3.9/library/asyncio-task.html#asyncio.wait) объявлена устаревшей и будет удалена в версии 3.11. (Авторы: Yury Selivanov и Kyle Stanley в [bpo-34790](https://python-all.ru/3.9/whatsnew/3.9.html).)486- Стандарты binhex4 и hexbin4 теперь устарели. Модуль [`binhex`](https://python-all.ru/3.9/library/binhex.html#module-binhex) и следующие функции [`binascii`](https://python-all.ru/3.9/library/binascii.html#module-binascii) теперь устарели:487488  - [`b2a_hqx()`](https://python-all.ru/3.9/library/binascii.html#binascii.b2a_hqx), [`a2b_hqx()`](https://python-all.ru/3.9/library/binascii.html#binascii.a2b_hqx)489  - [`rlecode_hqx()`](https://python-all.ru/3.9/library/binascii.html#binascii.rlecode_hqx), [`rledecode_hqx()`](https://python-all.ru/3.9/library/binascii.html#binascii.rledecode_hqx)490491  (Автор: Victor Stinner в [bpo-39353](https://python-all.ru/3.9/whatsnew/3.9.html).)492- Классы [`ast`](https://python-all.ru/3.9/library/ast.html#module-ast): `slice`, `Index` и `ExtSlice` считаются устаревшими и будут удалены в будущих версиях Python. Вместо `Index(value)` следует использовать сам `value`. Вместо `ExtSlice(slices)` следует использовать `Tuple(slices, Load())`. (Автор: Serhiy Storchaka в [bpo-34822](https://python-all.ru/3.9/whatsnew/3.9.html).)493- Классы [`ast`](https://python-all.ru/3.9/library/ast.html#module-ast) `Suite`, `Param`, `AugLoad` и `AugStore` считаются устаревшими и будут удалены в будущих версиях Python. Они не создавались парсером и не принимались генератором кода в Python 3. (Авторы: Batuhan Taskaya в [bpo-39639](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-39969](https://python-all.ru/3.9/whatsnew/3.9.html) и Serhiy Storchaka в [bpo-39988](https://python-all.ru/3.9/whatsnew/3.9.html).)494- Функции [`PyEval_InitThreads()`](https://python-all.ru/3.9/c-api/init.html#c.PyEval_InitThreads) и [`PyEval_ThreadsInitialized()`](https://python-all.ru/3.9/c-api/init.html#c.PyEval_ThreadsInitialized) теперь устарели и будут удалены в Python 3.11. Вызов [`PyEval_InitThreads()`](https://python-all.ru/3.9/c-api/init.html#c.PyEval_InitThreads) теперь ничего не делает. [GIL](https://python-all.ru/3.9/glossary.html#term-gil) инициализируется с помощью [`Py_Initialize()`](https://python-all.ru/3.9/c-api/init.html#c.Py_Initialize) начиная с Python 3.7. (Автор: Victor Stinner в [bpo-39877](https://python-all.ru/3.9/whatsnew/3.9.html).)495- Передача `None` в качестве первого аргумента функции [`shlex.split()`](https://python-all.ru/3.9/library/shlex.html#shlex.split) объявлена устаревшей. (Автор: Zackery Spytz в [bpo-33262](https://python-all.ru/3.9/whatsnew/3.9.html).)496- [`smtpd.MailmanProxy()`](https://python-all.ru/3.9/library/smtpd.html#smtpd.MailmanProxy) теперь устарел, так как непригоден к использованию без внешнего модуля `mailman`. (Автор: Samuel Colvin в [bpo-35800](https://python-all.ru/3.9/whatsnew/3.9.html).)497- Модуль [`lib2to3`](https://python-all.ru/3.9/library/2to3.html#module-lib2to3) теперь генерирует [`PendingDeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#PendingDeprecationWarning). Python 3.9 перешёл на PEG-парсер (см. [**PEP 617**](https://python-all.ru/3.9/whatsnew/3.9.html)), и Python 3.10 может включать новый синтаксис языка, который не поддаётся разбору LL(1)-парсером lib2to3. Модуль `lib2to3` может быть удалён из стандартной библиотеки в одной из будущих версий Python. Рассмотрите сторонние альтернативы, такие как [LibCST](https://python-all.ru/3.9/whatsnew/3.9.html) или [parso](https://python-all.ru/3.9/whatsnew/3.9.html). (Автор: Carl Meyer в [bpo-40360](https://python-all.ru/3.9/whatsnew/3.9.html).)498- Параметр *random* функции [`random.shuffle()`](https://python-all.ru/3.9/library/random.html#random.shuffle) объявлен устаревшим. (Автор: Raymond Hettinger в [bpo-40465](https://python-all.ru/3.9/whatsnew/3.9.html))499500## Удалено501502- Ошибочная версия по адресу `unittest.mock.__version__` удалена.503- [`nntplib.NNTP`](https://python-all.ru/3.9/library/nntplib.html#nntplib.NNTP): методы `xpath()` и `xgtitle()` были удалены. Эти методы устарели начиная с Python 3.3. Как правило, эти расширения не поддерживаются или не включены администраторами NNTP-серверов. Для `xgtitle()` используйте [`nntplib.NNTP.descriptions()`](https://python-all.ru/3.9/library/nntplib.html#nntplib.NNTP.descriptions) или [`nntplib.NNTP.description()`](https://python-all.ru/3.9/library/nntplib.html#nntplib.NNTP.description). (Автор: Dong-hee Na, [bpo-39366](https://python-all.ru/3.9/whatsnew/3.9.html).)504- [`array.array`](https://python-all.ru/3.9/library/array.html#array.array): методы `tostring()` и `fromstring()` удалены. Они были псевдонимами для `tobytes()` и `frombytes()`, устаревших начиная с Python 3.2. (Автор: Victor Stinner в [bpo-38916](https://python-all.ru/3.9/whatsnew/3.9.html).)505- Незадокументированная функция `sys.callstats()` удалена. Начиная с Python 3.7 она была устаревшей и всегда возвращала [`None`](https://python-all.ru/3.9/library/constants.html#None). Она требовала специальной опции сборки `CALL_PROFILE`, которая уже была удалена в Python 3.7. (Автор: Victor Stinner в [bpo-37414](https://python-all.ru/3.9/whatsnew/3.9.html).)506- Функции `sys.getcheckinterval()` и `sys.setcheckinterval()` удалены. Они были устаревшими начиная с Python 3.2. Используйте вместо них [`sys.getswitchinterval()`](https://python-all.ru/3.9/library/sys.html#sys.getswitchinterval) и [`sys.setswitchinterval()`](https://python-all.ru/3.9/library/sys.html#sys.setswitchinterval). (Автор: Victor Stinner в [bpo-37392](https://python-all.ru/3.9/whatsnew/3.9.html).)507- C-функция `PyImport_Cleanup()` удалена. Она была задокументирована как: «Очистить таблицу модулей. Только для внутреннего использования.» (Автор: Victor Stinner в [bpo-36710](https://python-all.ru/3.9/whatsnew/3.9.html).)508- Модули `_dummy_thread` и `dummy_threading` удалены. Эти модули были устаревшими начиная с Python 3.7, который требует поддержки потоков. (Автор: Victor Stinner в [bpo-37312](https://python-all.ru/3.9/whatsnew/3.9.html).)509- Псевдонимы `aifc.openfp()` для `aifc.open()`, `sunau.openfp()` для `sunau.open()` и `wave.openfp()` для [`wave.open()`](https://python-all.ru/3.9/library/wave.html#wave.open) удалены. Они были устаревшими начиная с Python 3.7. (Автор: Victor Stinner в [bpo-37320](https://python-all.ru/3.9/whatsnew/3.9.html).)510- Метод `isAlive()` из [`threading.Thread`](https://python-all.ru/3.9/library/threading.html#threading.Thread) был удалён. Он признан устаревшим начиная с Python 3.8. Используйте [`is_alive()`](https://python-all.ru/3.9/library/threading.html#threading.Thread.is_alive) вместо него. (Автор – Dong-hee Na в [bpo-37804](https://python-all.ru/3.9/whatsnew/3.9.html).)511- Методы `getchildren()` и `getiterator()` классов [`ElementTree`](https://python-all.ru/3.9/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) и [`Element`](https://python-all.ru/3.9/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) в модуле [`ElementTree`](https://python-all.ru/3.9/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) удалены. Они были устаревшими начиная с Python 3.2. Используйте `iter(x)` или `list(x)` вместо `x.getchildren()` и `x.iter()` или `list(x.iter())` вместо `x.getiterator()`. (Автор: Serhiy Storchaka в [bpo-36543](https://python-all.ru/3.9/whatsnew/3.9.html).)512- Старый API [`plistlib`](https://python-all.ru/3.9/library/plistlib.html#module-plistlib) удалён, он был устаревшим начиная с Python 3.4. Используйте функции [`load()`](https://python-all.ru/3.9/library/plistlib.html#plistlib.load), [`loads()`](https://python-all.ru/3.9/library/plistlib.html#plistlib.loads), [`dump()`](https://python-all.ru/3.9/library/plistlib.html#plistlib.dump) и [`dumps()`](https://python-all.ru/3.9/library/plistlib.html#plistlib.dumps). Кроме того, удалён параметр *use\_builtin\_types*; вместо него всегда используются стандартные объекты [`bytes`](https://python-all.ru/3.9/library/stdtypes.html#bytes). (Автор: Jon Janzen в [bpo-36409](https://python-all.ru/3.9/whatsnew/3.9.html).)513- C-функция `PyGen_NeedsFinalizing` удалена. Она не была задокументирована, не тестировалась и нигде не использовалась в CPython после реализации [**PEP 442**](https://python-all.ru/3.9/whatsnew/3.9.html). Патч от Joannah Nanjekye. (Автор: Joannah Nanjekye в [bpo-15088](https://python-all.ru/3.9/whatsnew/3.9.html))514- `base64.encodestring()` и `base64.decodestring()`, псевдонимы, устаревшие начиная с Python 3.1, удалены: используйте [`base64.encodebytes()`](https://python-all.ru/3.9/library/base64.html#base64.encodebytes) и [`base64.decodebytes()`](https://python-all.ru/3.9/library/base64.html#base64.decodebytes). (Автор: Victor Stinner в [bpo-39351](https://python-all.ru/3.9/whatsnew/3.9.html).)515- Функция `fractions.gcd()` удалена, она была устаревшей начиная с Python 3.5 ([bpo-22486](https://python-all.ru/3.9/whatsnew/3.9.html)): используйте [`math.gcd()`](https://python-all.ru/3.9/library/math.html#math.gcd). (Автор: Victor Stinner в [bpo-39350](https://python-all.ru/3.9/whatsnew/3.9.html).)516- Параметр *buffering* функции [`bz2.BZ2File`](https://python-all.ru/3.9/library/bz2.html#bz2.BZ2File) удалён. Начиная с Python 3.0 он игнорировался, а его использование вызывало [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning). Передавайте открытый файловый объект, чтобы управлять тем, как файл открывается. (Автор: Victor Stinner в [bpo-39357](https://python-all.ru/3.9/whatsnew/3.9.html).)517- Параметр *encoding* функции [`json.loads()`](https://python-all.ru/3.9/library/json.html#json.loads) был удалён. Начиная с Python 3.1 он считался устаревшим и игнорировался; его использование вызывало [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning), начиная с Python 3.8. (Автор: Inada Naoki в [bpo-39377](https://python-all.ru/3.9/whatsnew/3.9.html))518- Операторы `with (await asyncio.lock):` и `with (yield from asyncio.lock):` больше не поддерживаются, используйте вместо них `async with lock`. То же самое верно для `asyncio.Condition` и `asyncio.Semaphore`. (Автор: Andrew Svetlov в [bpo-34793](https://python-all.ru/3.9/whatsnew/3.9.html).)519- Функция `sys.getcounts()`, параметр командной строки `-X showalloccount` и поле `show_alloc_count` C-структуры [`PyConfig`](https://python-all.ru/3.9/c-api/init_config.html#c.PyConfig) были удалены. Они требовали специальной сборки Python с определённым макросом `COUNT_ALLOCS`. (Автор: Victor Stinner в [bpo-39489](https://python-all.ru/3.9/whatsnew/3.9.html).)520- Атрибут `_field_types` класса [`typing.NamedTuple`](https://python-all.ru/3.9/library/typing.html#typing.NamedTuple) был удалён. Он был устаревшим с Python 3.8. Используйте вместо него атрибут `__annotations__`. (Автор: Serhiy Storchaka в [bpo-40182](https://python-all.ru/3.9/whatsnew/3.9.html).)521- Метод `symtable.SymbolTable.has_exec()` был удалён. Он был устаревшим с 2006 года и при вызове просто возвращал `False`. (Автор: Batuhan Taskaya в [bpo-40208](https://python-all.ru/3.9/whatsnew/3.9.html))522- `asyncio.Task.current_task()` и `asyncio.Task.all_tasks()` были удалены. Они были устаревшими с Python 3.7, и вы можете использовать вместо них [`asyncio.current_task()`](https://python-all.ru/3.9/library/asyncio-task.html#asyncio.current_task) и [`asyncio.all_tasks()`](https://python-all.ru/3.9/library/asyncio-task.html#asyncio.all_tasks). (Автор: Rémi Lapeyre в [bpo-40967](https://python-all.ru/3.9/whatsnew/3.9.html))523- Метод `unescape()` в классе [`html.parser.HTMLParser`](https://python-all.ru/3.9/library/html.parser.html#html.parser.HTMLParser) был удалён (он был устаревшим с Python 3.4). Для преобразования символьных ссылок в соответствующие символы Юникода следует использовать [`html.unescape()`](https://python-all.ru/3.9/library/html.html#html.unescape).524525## Перенос на Python 3.9526527В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.528529### Изменения в Python API530531- [`__import__()`](https://python-all.ru/3.9/library/functions.html#__import__) и [`importlib.util.resolve_name()`](https://python-all.ru/3.9/library/importlib.html#importlib.util.resolve_name) теперь вызывают [`ImportError`](https://python-all.ru/3.9/library/exceptions.html#ImportError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Код, который перехватывает конкретный тип исключения и должен поддерживать как Python 3.9, так и более ранние версии, должен перехватывать оба с помощью `except (ImportError, ValueError):`.532- Скрипты активации [`venv`](https://python-all.ru/3.9/library/venv.html#module-venv) больше не обрабатывают особым образом случай, когда `__VENV_PROMPT__` установлено в `""`.533- Метод [`select.epoll.unregister()`](https://python-all.ru/3.9/library/select.html#select.epoll.unregister) больше не игнорирует ошибку [`EBADF`](https://python-all.ru/3.9/library/errno.html#errno.EBADF). (Автор: Victor Stinner в [bpo-39239](https://python-all.ru/3.9/whatsnew/3.9.html).)534- Параметр *compresslevel* функции [`bz2.BZ2File`](https://python-all.ru/3.9/library/bz2.html#bz2.BZ2File) стал только ключевым (keyword-only), поскольку параметр *buffering* был удалён. (Автор: Victor Stinner в [bpo-39357](https://python-all.ru/3.9/whatsnew/3.9.html).)535- Упрощённое AST для операций индексации. Простые индексы будут представлены своим значением, расширенные срезы – кортежами. `Index(value)` будет возвращать сам `value`, `ExtSlice(slices)` будет возвращать `Tuple(slices, Load())`. (Автор: Serhiy Storchaka в [bpo-34822](https://python-all.ru/3.9/whatsnew/3.9.html).)536- Модуль [`importlib`](https://python-all.ru/3.9/library/importlib.html#module-importlib) теперь игнорирует переменную окружения [`PYTHONCASEOK`](https://python-all.ru/3.9/using/cmdline.html#envvar-PYTHONCASEOK) при использовании параметров командной строки [`-E`](https://python-all.ru/3.9/using/cmdline.html#cmdoption-e) или [`-I`](https://python-all.ru/3.9/using/cmdline.html#id2).537- Параметр *encoding* был добавлен в классы [`ftplib.FTP`](https://python-all.ru/3.9/library/ftplib.html#ftplib.FTP) и [`ftplib.FTP_TLS`](https://python-all.ru/3.9/library/ftplib.html#ftplib.FTP_TLS) как только ключевой (keyword-only), а кодировка по умолчанию изменена с Latin-1 на UTF-8 в соответствии с [**RFC 2640**](https://python-all.ru/3.9/whatsnew/3.9.html).538- [`asyncio.loop.shutdown_default_executor()`](https://python-all.ru/3.9/library/asyncio-eventloop.html#asyncio.loop.shutdown_default_executor) был добавлен в [`AbstractEventLoop`](https://python-all.ru/3.9/library/asyncio-eventloop.html#asyncio.AbstractEventLoop), что означает, что альтернативные циклы событий, наследующие от него, должны иметь этот определённый метод. (Автор: Kyle Stanley в [bpo-34037](https://python-all.ru/3.9/whatsnew/3.9.html).)539- Константные значения флагов future в модуле [`__future__`](https://python-all.ru/3.9/library/__future__.html#module-__future__) обновлены, чтобы избежать пересечения с флагами компилятора. Ранее `PyCF_ALLOW_TOP_LEVEL_AWAIT` конфликтовал с `CO_FUTURE_DIVISION`. (Автор: Batuhan Taskaya в [bpo-39562](https://python-all.ru/3.9/whatsnew/3.9.html))540- `array('u')` теперь использует в качестве C-типа `wchar_t` вместо `Py_UNICODE`. Это изменение не влияет на его поведение, поскольку `Py_UNICODE` является псевдонимом `wchar_t` начиная с Python 3.3. (Автор: Inada Naoki в [bpo-34538](https://python-all.ru/3.9/whatsnew/3.9.html).)541- API [`logging.getLogger()`](https://python-all.ru/3.9/library/logging.html#logging.getLogger) теперь возвращает корневой логгер при передаче имени `'root'`, тогда как ранее возвращался некорневой логгер с именем `'root'`. Это может повлиять на случаи, когда код явно требует некорневой логгер с именем `'root'` или создаёт логгер с помощью `logging.getLogger(__name__)` в некотором модуле верхнего уровня с именем `'root.py'`. (Автор: Vinay Sajip в [bpo-37742](https://python-all.ru/3.9/whatsnew/3.9.html).)542- Обработка деления в [`PurePath`](https://python-all.ru/3.9/library/pathlib.html#pathlib.PurePath) теперь возвращает `NotImplemented` вместо возбуждения [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError), если передано что-то, не являющееся экземпляром `str` или [`PurePath`](https://python-all.ru/3.9/library/pathlib.html#pathlib.PurePath). Это позволяет создавать совместимые классы, не наследующие от упомянутых типов. (Автор: Roger Aiudi в [bpo-34775](https://python-all.ru/3.9/whatsnew/3.9.html)).543- Начиная с Python 3.9.5 модуль [`ipaddress`](https://python-all.ru/3.9/library/ipaddress.html#module-ipaddress) больше не принимает ведущие нули в строках IPv4-адресов. Ведущие нули неоднозначны и некоторыми библиотеками интерпретируются как восьмеричная запись. Например, устаревшая функция [`socket.inet_aton()`](https://python-all.ru/3.9/library/socket.html#socket.inet_aton) трактует ведущие нули как восьмеричную запись. Реализация glibc современного [`inet_pton()`](https://python-all.ru/3.9/library/socket.html#socket.inet_pton) не принимает никаких ведущих нулей. (Автор: Christian Heimes в [bpo-36384](https://python-all.ru/3.9/whatsnew/3.9.html)).544- [`codecs.lookup()`](https://python-all.ru/3.9/library/codecs.html#codecs.lookup) теперь нормализует имя кодировки так же, как `encodings.normalize_encoding()`, за исключением того, что [`codecs.lookup()`](https://python-all.ru/3.9/library/codecs.html#codecs.lookup) также приводит имя к нижнему регистру. Например, имя кодировки `"latex+latin1"` теперь нормализуется в `"latex_latin1"`. (Автор: Jordon Xu в [bpo-37751](https://python-all.ru/3.9/whatsnew/3.9.html).)545546### Изменения в C API547548- Экземпляры типов, выделяемых в куче (например, созданные с помощью [`PyType_FromSpec()`](https://python-all.ru/3.9/c-api/type.html#c.PyType_FromSpec) и подобных API), хранят ссылку на свой объект-тип начиная с Python 3.8. Как указано в разделе «Changes in the C API» Python 3.8, в подавляющем большинстве случаев это не должно иметь побочных эффектов, но для типов, имеющих пользовательскую функцию [`tp_traverse`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_traverse), убедитесь, что все пользовательские функции `tp_traverse` типов, выделяемых в куче, посещают объект-тип.549550  > Пример:551  >552  > ```c553  > int554  > foo_traverse(foo_struct *self, visitproc visit, void *arg) {555  > // Остальная часть функции traverse556  > #if PY_VERSION_HEX >= 0x03090000557  >     // Это не требовалось до Python 3.9 (Python issue 35810 и 40217)558  >     Py_VISIT(Py_TYPE(self));559  > #endif560  > }561  > ```562563  Если функция обхода делегирует вызов `tp_traverse` своего базового класса (или другого типа), убедитесь, что `Py_TYPE(self)` посещается только один раз. Обратите внимание: только типы, размещаемые в куче, должны посещать тип в `tp_traverse`.564565  > Например, если ваша функция `tp_traverse` содержит:566  >567  > ```c568  > base->tp_traverse(self, visit, arg)569  > ```570  >571  > то добавьте:572  >573  > ```c574  > #if PY_VERSION_HEX >= 0x03090000575  >     // Это не требовалось до Python 3.9 (Python issue 35810 и 40217)576  >     if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {577  >         // tp_traverse типа‑кучи уже посетил Py_TYPE(self)578  >     } else {579  >         Py_VISIT(Py_TYPE(self));580  >     }581  > #else582  > ```583584  (См. [bpo-35810](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-40217](https://python-all.ru/3.9/whatsnew/3.9.html) для получения дополнительной информации.)585- Функции `PyEval_CallObject`, `PyEval_CallFunction`, `PyEval_CallMethod` и `PyEval_CallObjectWithKeywords` устарели. Используйте вместо них [`PyObject_Call()`](https://python-all.ru/3.9/c-api/call.html#c.PyObject_Call) и его варианты. (Подробнее см. в [bpo-29548](https://python-all.ru/3.9/whatsnew/3.9.html).)586587### Изменения байткода CPython588589- Код операции [`LOAD_ASSERTION_ERROR`](https://python-all.ru/3.9/library/dis.html#opcode-LOAD_ASSERTION_ERROR) был добавлен для обработки оператора [`assert`](https://python-all.ru/3.9/reference/simple_stmts.html#assert). Ранее оператор assert работал некорректно, если исключение [`AssertionError`](https://python-all.ru/3.9/library/exceptions.html#AssertionError) было скрыто. (Автор: Zackery Spytz в [bpo-34880](https://python-all.ru/3.9/whatsnew/3.9.html).)590- Код операции [`COMPARE_OP`](https://python-all.ru/3.9/library/dis.html#opcode-COMPARE_OP) был разделён на четыре отдельные инструкции:591592  - `COMPARE_OP` для сравнений с богатой семантикой (rich comparisons)593  - `IS_OP` для проверок «is» и «is not»594  - `CONTAINS_OP` для проверок ‘in’ и ‘not in’595  - `JUMP_IF_NOT_EXC_MATCH` для проверки исключений в конструкциях ‘try-except’596597  (Автор: Mark Shannon в [bpo-39156](https://python-all.ru/3.9/whatsnew/3.9.html).)598599## Изменения сборки600601- Добавлена опция `--with-platlibdir` в скрипт `configure`: имя платформо-зависимого каталога библиотек, хранящееся в новом атрибуте [`sys.platlibdir`](https://python-all.ru/3.9/library/sys.html#sys.platlibdir). См. атрибут [`sys.platlibdir`](https://python-all.ru/3.9/library/sys.html#sys.platlibdir) для получения дополнительной информации. (Авторы: Jan Matějek, Matěj Cepl, Charalampos Stratakis и Victor Stinner в [bpo-1294959](https://python-all.ru/3.9/whatsnew/3.9.html).)602- Специальный макрос сборки `COUNT_ALLOCS` удалён. (Автор: Victor Stinner в [bpo-39489](https://python-all.ru/3.9/whatsnew/3.9.html).)603- На платформах, отличных от Windows, функции `setenv()` и `unsetenv()` теперь необходимы для сборки Python. (Автор: Victor Stinner в [bpo-39395](https://python-all.ru/3.9/whatsnew/3.9.html).)604- На платформах, отличных от Windows, создание установщиков `bdist_wininst` теперь официально не поддерживается. (Подробнее см. [bpo-10945](https://python-all.ru/3.9/whatsnew/3.9.html).)605- При сборке Python на macOS из исходного кода, `_tkinter` теперь компонуется с несистемными фреймворками Tcl и Tk, если они установлены в `/Library/Frameworks`, как это было в более старых версиях macOS. Если явно указан macOS SDK, с помощью `--enable-universalsdk=` или `-isysroot`, поиск ведется только в самом SDK. Поведение по умолчанию по-прежнему можно переопределить с помощью `--with-tcltk-includes` и `--with-tcltk-libs`. (Автор: Ned Deily в [bpo-34956](https://python-all.ru/3.9/whatsnew/3.9.html).)606- Python теперь можно собрать для Windows 10 ARM64. (Автор: Steve Dower в [bpo-33125](https://python-all.ru/3.9/whatsnew/3.9.html).)607- Некоторые отдельные тесты теперь пропускаются при использовании `--pgo`. Указанные тесты значительно увеличивали время выполнения задачи PGO и, вероятно, не способствовали улучшению оптимизации конечного исполняемого файла. Это ускоряет выполнение задачи примерно в 15 раз. Запуск полного набора модульных тестов выполняется медленно. Это изменение может привести к немного менее оптимизированной сборке, поскольку будет выполняться меньше ветвей кода. Если вы готовы ждать сборки дольше, прежнее поведение можно восстановить с помощью `./configure [..] PROFILE_TASK="-m test --pgo-extended"`. Мы не даем никаких гарантий относительно того, какой набор задач PGO дает более быструю сборку. Заинтересованным пользователям следует запускать собственные соответствующие тесты производительности, так как результаты могут зависеть от среды, рабочей нагрузки и цепочки инструментов компилятора. (Подробнее см. [bpo-36044](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-37707](https://python-all.ru/3.9/whatsnew/3.9.html).)608609## Изменения C API610611### Новые возможности612613- [**PEP 573**](https://python-all.ru/3.9/whatsnew/3.9.html): Добавлены [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.9/c-api/type.html#c.PyType_FromModuleAndSpec) для связывания модуля с классом; [`PyType_GetModule()`](https://python-all.ru/3.9/c-api/type.html#c.PyType_GetModule) и [`PyType_GetModuleState()`](https://python-all.ru/3.9/c-api/type.html#c.PyType_GetModuleState) для получения модуля и его состояния; и [`PyCMethod`](https://python-all.ru/3.9/c-api/structures.html#c.PyCMethod) и `METH_METHOD` для предоставления методу доступа к классу, в котором он был определен. (Авторы: Marcel Plch и Petr Viktorin в [bpo-38787](https://python-all.ru/3.9/whatsnew/3.9.html).)614- Добавлена функция [`PyFrame_GetCode()`](https://python-all.ru/3.9/c-api/reflection.html#c.PyFrame_GetCode): получение кода фрейма. Добавлена функция [`PyFrame_GetBack()`](https://python-all.ru/3.9/c-api/reflection.html#c.PyFrame_GetBack): получение следующего внешнего фрейма. (Автор: Victor Stinner в [bpo-40421](https://python-all.ru/3.9/whatsnew/3.9.html).)615- Добавлен [`PyFrame_GetLineNumber()`](https://python-all.ru/3.9/c-api/reflection.html#c.PyFrame_GetLineNumber) в ограниченный C API. (Автор: Victor Stinner в [bpo-40421](https://python-all.ru/3.9/whatsnew/3.9.html).)616- Добавлены функции [`PyThreadState_GetInterpreter()`](https://python-all.ru/3.9/c-api/init.html#c.PyThreadState_GetInterpreter) и [`PyInterpreterState_Get()`](https://python-all.ru/3.9/c-api/init.html#c.PyInterpreterState_Get) для получения интерпретатора. Добавлена функция [`PyThreadState_GetFrame()`](https://python-all.ru/3.9/c-api/init.html#c.PyThreadState_GetFrame) для получения текущего фрейма состояния потока Python. Добавлена функция [`PyThreadState_GetID()`](https://python-all.ru/3.9/c-api/init.html#c.PyThreadState_GetID): получение уникального идентификатора состояния потока Python. (Автор: Victor Stinner в [bpo-39947](https://python-all.ru/3.9/whatsnew/3.9.html).)617- Добавлена новая публичная функция [`PyObject_CallNoArgs()`](https://python-all.ru/3.9/c-api/call.html#c.PyObject_CallNoArgs) в C API, которая вызывает вызываемый объект Python без аргументов. Это наиболее эффективный способ вызова вызываемого объекта Python без аргументов. (Автор: Victor Stinner в [bpo-37194](https://python-all.ru/3.9/whatsnew/3.9.html).)618- Изменения в ограниченном C API (если определён макрос `Py_LIMITED_API`):619620  - Предоставить [`Py_EnterRecursiveCall()`](https://python-all.ru/3.9/c-api/exceptions.html#c.Py_EnterRecursiveCall) и [`Py_LeaveRecursiveCall()`](https://python-all.ru/3.9/c-api/exceptions.html#c.Py_LeaveRecursiveCall) как обычные функции для ограниченного API. Ранее они были определены как макросы, но эти макросы не компилировались с ограниченным C API, который не может получить доступ к полю `PyThreadState.recursion_depth` (структура является непрозрачной в ограниченном C API).621  - `PyObject_INIT()` и `PyObject_INIT_VAR()` становятся обычными «непрозрачными» функциями для скрытия деталей реализации.622623  (Автор: Victor Stinner в [bpo-38644](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-39542](https://python-all.ru/3.9/whatsnew/3.9.html).)624- Добавлена функция [`PyModule_AddType()`](https://python-all.ru/3.9/c-api/module.html#c.PyModule_AddType), упрощающая добавление типа в модуль. (Автор – Dong-hee Na в [bpo-40024](https://python-all.ru/3.9/whatsnew/3.9.html).)625- Добавлены функции [`PyObject_GC_IsTracked()`](https://python-all.ru/3.9/c-api/gcsupport.html#c.PyObject_GC_IsTracked) и [`PyObject_GC_IsFinalized()`](https://python-all.ru/3.9/c-api/gcsupport.html#c.PyObject_GC_IsFinalized) в публичный API, позволяющие запрашивать, отслеживаются ли в данный момент объекты Python или уже финализированы сборщиком мусора, соответственно. (Автор: Pablo Galindo Salgado в [bpo-40241](https://python-all.ru/3.9/whatsnew/3.9.html).)626- Добавлен `_PyObject_FunctionStr()` для получения удобочитаемого строкового представления объекта, подобного функции. (Патч от Jeroen Demeyer в [bpo-37645](https://python-all.ru/3.9/whatsnew/3.9.html).)627- Добавлен [`PyObject_CallOneArg()`](https://python-all.ru/3.9/c-api/call.html#c.PyObject_CallOneArg) для вызова объекта с одним позиционным аргументом. (Патч от Jeroen Demeyer в [bpo-37483](https://python-all.ru/3.9/whatsnew/3.9.html).)628629### Перенос на Python 3.9630631- `PyInterpreterState.eval_frame` ([**PEP 523**](https://python-all.ru/3.9/whatsnew/3.9.html)) теперь требует новый обязательный параметр *tstate* (`PyThreadState*`). (Автор: Victor Stinner в [bpo-38500](https://python-all.ru/3.9/whatsnew/3.9.html).)632- Модули расширения: функции [`m_traverse`](https://python-all.ru/3.9/c-api/module.html#c.PyModuleDef.m_traverse), [`m_clear`](https://python-all.ru/3.9/c-api/module.html#c.PyModuleDef.m_clear) и [`m_free`](https://python-all.ru/3.9/c-api/module.html#c.PyModuleDef.m_free) из [`PyModuleDef`](https://python-all.ru/3.9/c-api/module.html#c.PyModuleDef) больше не вызываются, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и до его выполнения (функция [`Py_mod_exec`](https://python-all.ru/3.9/c-api/module.html#c.Py_mod_exec)). Точнее, эти функции не вызываются, если [`m_size`](https://python-all.ru/3.9/c-api/module.html#c.PyModuleDef.m_size) больше 0, а состояние модуля (возвращаемое [`PyModule_GetState()`](https://python-all.ru/3.9/c-api/module.html#c.PyModule_GetState)) равно `NULL`.633634  Модули расширения без состояния модуля (`m_size <= 0`) не затрагиваются.635- Если [`Py_AddPendingCall()`](https://python-all.ru/3.9/c-api/init.html#c.Py_AddPendingCall) вызывается в подынтерпретаторе, функция теперь планируется к вызову из подынтерпретатора, а не вызывается из основного интерпретатора. Каждый подынтерпретатор теперь имеет свой собственный список запланированных вызовов. (Автор: Victor Stinner в [bpo-39984](https://python-all.ru/3.9/whatsnew/3.9.html).)636- Реестр Windows больше не используется для инициализации [`sys.path`](https://python-all.ru/3.9/library/sys.html#sys.path) при использовании опции `-E` (если [`PyConfig.use_environment`](https://python-all.ru/3.9/c-api/init_config.html#c.PyConfig.use_environment) установлено в `0`). Это важно при встраивании Python в Windows. (Автор: Zackery Spytz в [bpo-8901](https://python-all.ru/3.9/whatsnew/3.9.html).)637- Глобальная переменная [`PyStructSequence_UnnamedField`](https://python-all.ru/3.9/c-api/tuple.html#c.PyStructSequence_UnnamedField) теперь является константой и ссылается на строковую константу. (Автор: Serhiy Storchaka в [bpo-38650](https://python-all.ru/3.9/whatsnew/3.9.html).)638- Структура `PyGC_Head` теперь непрозрачна. Она определяется только во внутреннем C API (`pycore_gc.h`). (Автор: Victor Stinner в [bpo-40241](https://python-all.ru/3.9/whatsnew/3.9.html).)639- `Py_UNICODE_COPY`, `Py_UNICODE_FILL`, `PyUnicode_WSTR_LENGTH`, [`PyUnicode_FromUnicode()`](https://python-all.ru/3.9/c-api/unicode.html#c.PyUnicode_FromUnicode), [`PyUnicode_AsUnicode()`](https://python-all.ru/3.9/c-api/unicode.html#c.PyUnicode_AsUnicode), `_PyUnicode_AsUnicode` и [`PyUnicode_AsUnicodeAndSize()`](https://python-all.ru/3.9/c-api/unicode.html#c.PyUnicode_AsUnicodeAndSize) помечены как устаревшие в C. Они устарели [**PEP 393**](https://python-all.ru/3.9/whatsnew/3.9.html) начиная с Python 3.3. (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.9/whatsnew/3.9.html).)640- Функция [`Py_FatalError()`](https://python-all.ru/3.9/c-api/sys.html#c.Py_FatalError) заменена макросом, который автоматически записывает имя текущей функции, если не определён макрос `Py_LIMITED_API`. (Автор: Victor Stinner в [bpo-39882](https://python-all.ru/3.9/whatsnew/3.9.html).)641- Протокол vectorcall теперь требует, чтобы вызывающая сторона передавала только строки в качестве имён ключевых аргументов. (См. [bpo-37540](https://python-all.ru/3.9/whatsnew/3.9.html) для получения дополнительной информации.)642- Детали реализации ряда макросов и функций теперь скрыты:643644  - Макрос [`PyObject_IS_GC()`](https://python-all.ru/3.9/c-api/gcsupport.html#c.PyObject_IS_GC) преобразован в функцию.645  - Макрос `PyObject_NEW()` становится псевдонимом макроса [`PyObject_New()`](https://python-all.ru/3.9/c-api/allocation.html#c.PyObject_New), а макрос `PyObject_NEW_VAR()` становится псевдонимом макроса [`PyObject_NewVar()`](https://python-all.ru/3.9/c-api/allocation.html#c.PyObject_NewVar). Они больше не обращаются напрямую к элементу [`PyTypeObject.tp_basicsize`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_basicsize).646  - Макрос `PyObject_GET_WEAKREFS_LISTPTR()` преобразован в функцию: макрос напрямую обращался к элементу [`PyTypeObject.tp_weaklistoffset`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset).647  - Макрос [`PyObject_CheckBuffer()`](https://python-all.ru/3.9/c-api/buffer.html#c.PyObject_CheckBuffer) преобразован в функцию: макрос напрямую обращался к элементу [`PyTypeObject.tp_as_buffer`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_as_buffer).648  - [`PyIndex_Check()`](https://python-all.ru/3.9/c-api/number.html#c.PyIndex_Check) теперь всегда объявляется как непрозрачная функция для скрытия деталей реализации: удалён макрос `PyIndex_Check()`. Макрос напрямую обращался к элементу [`PyTypeObject.tp_as_number`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_as_number).649650  (См. [bpo-40170](https://python-all.ru/3.9/whatsnew/3.9.html) для получения дополнительных сведений.)651652### Удалено653654- Макросы `PyFPE_START_PROTECT()` и `PyFPE_END_PROTECT()` из `pyfpe.h` исключены из ограниченного C API. (Автор: Victor Stinner в [bpo-38835](https://python-all.ru/3.9/whatsnew/3.9.html).)655- Слот `tp_print` структуры [PyTypeObject](https://python-all.ru/3.9/c-api/typeobj.html#type-structs) удалён. Он использовался для печати объектов в файлы в Python 2.7 и ранее. Начиная с Python 3.0, он игнорируется и не используется. (Автор: Jeroen Demeyer в [bpo-36974](https://python-all.ru/3.9/whatsnew/3.9.html).)656- Изменения в ограниченном C API (если определён макрос `Py_LIMITED_API`):657658  - Из ограниченного C API исключены следующие функции:659660    - `PyThreadState_DeleteCurrent()` (Автор: Joannah Nanjekye в [bpo-37878](https://python-all.ru/3.9/whatsnew/3.9.html).)661    - `_Py_CheckRecursionLimit`662    - `_Py_NewReference()`663    - `_Py_ForgetReference()`664    - `_PyTraceMalloc_NewReference()`665    - `_Py_GetRefTotal()`666    - Механизм trashcan, который никогда не работал в ограниченном C API.667    - `PyTrash_UNWIND_LEVEL`668    - `Py_TRASHCAN_BEGIN_CONDITION`669    - `Py_TRASHCAN_BEGIN`670    - `Py_TRASHCAN_END`671    - `Py_TRASHCAN_SAFE_BEGIN`672    - `Py_TRASHCAN_SAFE_END`673  - Следующие функции и определения перемещены во внутренний C API:674675    - `_PyDebug_PrintTotalRefs()`676    - `_Py_PrintReferences()`677    - `_Py_PrintReferenceAddresses()`678    - `_Py_tracemalloc_config`679    - `_Py_AddToAllObjects()` (специфично для сборки `Py_TRACE_REFS`)680681  (Автор: Victor Stinner в [bpo-38644](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-39542](https://python-all.ru/3.9/whatsnew/3.9.html).)682- Удалены хук `_PyRuntime.getframe` и макрос `_PyThreadState_GetFrame`, который был псевдонимом `_PyRuntime.getframe`. Они были доступны только через внутренний C API. Также удалён тип `PyThreadFrameGetter`. (Автор: Victor Stinner в [bpo-39946](https://python-all.ru/3.9/whatsnew/3.9.html).)683- Из C API удалены следующие функции. Явно вызывайте `PyGC_Collect()` для очистки всех свободных списков. (Авторы: Inada Naoki и Victor Stinner в [bpo-37340](https://python-all.ru/3.9/whatsnew/3.9.html), [bpo-38896](https://python-all.ru/3.9/whatsnew/3.9.html) и [bpo-40428](https://python-all.ru/3.9/whatsnew/3.9.html).)684685  - `PyAsyncGen_ClearFreeLists()`686  - `PyContext_ClearFreeList()`687  - `PyDict_ClearFreeList()`688  - `PyFloat_ClearFreeList()`689  - `PyFrame_ClearFreeList()`690  - `PyList_ClearFreeList()`691  - `PyMethod_ClearFreeList()` и `PyCFunction_ClearFreeList()`: свободные списки объектов связанных методов удалены.692  - `PySet_ClearFreeList()`: свободный список множеств удалён в Python 3.4.693  - `PyTuple_ClearFreeList()`694  - `PyUnicode_ClearFreeList()`: свободный список Unicode удалён в Python 3.3.695- Удалена функция `_PyUnicode_ClearStaticStrings()`. (Автор: Victor Stinner в [bpo-39465](https://python-all.ru/3.9/whatsnew/3.9.html).)696- Удалён `Py_UNICODE_MATCH`. Он был объявлен устаревшим с помощью [**PEP 393**](https://python-all.ru/3.9/whatsnew/3.9.html) и перестал работать с Python 3.3. Вместо него можно использовать функцию [`PyUnicode_Tailmatch()`](https://python-all.ru/3.9/c-api/unicode.html#c.PyUnicode_Tailmatch). (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.9/whatsnew/3.9.html).)697- Очищены заголовочные файлы от интерфейсов, определённых, но не имеющих реализации. Удаляемые символы публичного API: `_PyBytes_InsertThousandsGroupingLocale`, `_PyBytes_InsertThousandsGrouping`, `_Py_InitializeFromArgs`, `_Py_InitializeFromWideArgs`, `_PyFloat_Repr`, `_PyFloat_Digits`, `_PyFloat_DigitsInit`, `PyFrame_ExtendStack`, `_PyAIterWrapper_Type`, `PyNullImporter_Type`, `PyCmpWrapper_Type`, `PySortWrapper_Type`, `PyNoArgsFunction`. (Автор: Pablo Galindo Salgado в [bpo-39372](https://python-all.ru/3.9/whatsnew/3.9.html).)698699## Заметные изменения в Python 3.9.1700701### typing702703Поведение [`typing.Literal`](https://python-all.ru/3.9/library/typing.html#typing.Literal) было изменено в соответствии с [**PEP 586**](https://python-all.ru/3.9/whatsnew/3.9.html) и для соответствия поведению статических анализаторов типов, описанному в PEP.7047051. `Literal` теперь удаляет дубликаты параметров.7062. Проверки равенства между объектами `Literal` теперь не зависят от порядка.7073. Сравнения `Literal` теперь учитывают типы. Например, `Literal[0] == Literal[False]` ранее давало `True`. Теперь это `False`. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.7084. Объекты `Literal` теперь будут вызывать исключение [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError) при сравнении на равенство, если любой из их параметров не является [хэшируемым](https://python-all.ru/3.9/glossary.html#term-hashable). Обратите внимание, что объявление `Literal` с изменяемыми параметрами не вызовет ошибку:709710   ```python711   >>> from typing import Literal712   >>> Literal[{0}]713   >>> Literal[{0}] == Literal[{False}]714   Traceback (most recent call last):715     File "<stdin>", line 1, in <module>716   TypeError: unhashable type: 'set'717   ```718719(Предложено Юрием Карабасом в [bpo-42345](https://python-all.ru/3.9/whatsnew/3.9.html).)720721### Поддержка macOS 11.0 (Big Sur) и Mac на Apple Silicon722723Начиная с версии 3.9.1, Python полностью поддерживает сборку и работу на macOS 11.0 (Big Sur) и на Mac с Apple Silicon (на базе архитектуры `ARM64`). Теперь доступна новая универсальная конфигурация сборки, `universal2`, которая позволяет изначально поддерживать как `ARM64`, так и `Intel 64` в одном наборе исполняемых файлов. Также теперь можно создавать двоичные файлы на текущих версиях macOS для развёртывания на более старых версиях macOS (проверено до 10.9), при этом некоторые функции и возможности новых ОС становятся условно доступными в зависимости от версии ОС, используемой во время выполнения («weaklinking»).724725(Авторы: Ronald Oussoren и Lawrence D’Anna в [bpo-41100](https://python-all.ru/3.9/whatsnew/3.9.html).)726727## Заметные изменения в Python 3.9.2728729### collections.abc730731[`collections.abc.Callable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Callable) обобщённый тип теперь упрощает параметры типов, аналогично тому, как это делает [`typing.Callable`](https://python-all.ru/3.9/library/typing.html#typing.Callable). Это означает, что `collections.abc.Callable[[int, str], str]` будет иметь `__args__` из `(int, str, str)`; ранее это было `([int, str], str)`. Чтобы обеспечить это изменение, [`types.GenericAlias`](https://python-all.ru/3.9/library/types.html#types.GenericAlias) теперь может быть унаследован, и подкласс будет возвращён при индексации типа [`collections.abc.Callable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Callable). Код, который обращается к аргументам через [`typing.get_args()`](https://python-all.ru/3.9/library/typing.html#typing.get_args) или `__args__`, должен учитывать это изменение. [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning) может быть вызвано для некорректных форм параметризации [`collections.abc.Callable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Callable), которые могли проходить незаметно в Python 3.9.1. Это [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning) станет [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError) в Python 3.10. (Предложено Ken Jin в [bpo-42195](https://python-all.ru/3.9/whatsnew/3.9.html).)732733### urllib.parse734735Более ранние версии Python допускали использование как `;`, так и `&` в качестве разделителей параметров запроса в [`urllib.parse.parse_qs()`](https://python-all.ru/3.9/library/urllib.parse.html#urllib.parse.parse_qs) и [`urllib.parse.parse_qsl()`](https://python-all.ru/3.9/library/urllib.parse.html#urllib.parse.parse_qsl). Из соображений безопасности и для соответствия новым рекомендациям W3C это поведение было изменено: теперь разрешён только один ключ-разделитель, `&` по умолчанию. Это изменение также затрагивает [`cgi.parse()`](https://python-all.ru/3.9/library/cgi.html#cgi.parse) и [`cgi.parse_multipart()`](https://python-all.ru/3.9/library/cgi.html#cgi.parse_multipart), поскольку они внутренне используют затронутые функции. Дополнительные сведения см. в их документации. (Авторы: Adam Goldschmidt, Senthil Kumaran и Ken Jin в [bpo-42967](https://python-all.ru/3.9/whatsnew/3.9.html).)736737## Заметные изменения в Python 3.9.3738739Исправление безопасности изменяет поведение [`ftplib.FTP`](https://python-all.ru/3.9/library/ftplib.html#ftplib.FTP): теперь не доверяется IPv4-адресу, отправленному удалённым сервером при настройке пассивного канала данных. Вместо этого используется IP-адрес FTP-сервера. Для нестандартного кода, которому требуется старое поведение, задайте атрибут `trust_server_pasv_ipv4_address` экземпляра FTP равным `True`. (См. [bpo-43285](https://python-all.ru/3.9/whatsnew/3.9.html))740741## Заметные изменения в Python 3.9.5742743### urllib.parse744745The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates [**RFC 3986**](https://python-all.ru/3.9/whatsnew/3.9.html), ASCII newline `\n`, `\r` and tab `\t` characters are stripped from the URL by the parser in [`urllib.parse`](https://python-all.ru/3.9/library/urllib.parse.html#module-urllib.parse) preventing such attacks. The removal characters are controlled by a new module level variable `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (See [bpo-43882](https://python-all.ru/3.9/whatsnew/3.9.html))746747## Заметная функция безопасности в 3.9.14748749Преобразование между [`int`](https://python-all.ru/3.9/library/functions.html#int) и [`str`](https://python-all.ru/3.9/library/stdtypes.html#str) в системах счисления, отличных от 2 (двоичной), 4, 8 (восьмеричной), 16 (шестнадцатеричной) или 32, например, 10 (десятичной), теперь вызывает [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError), если количество цифр в строковом представлении превышает предельное значение, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это мера смягчения последствий для [CVE-2020-10735](https://python-all.ru/3.9/whatsnew/3.9.html). Этот предел можно настроить или отключить с помощью переменной окружения, флага командной строки или [`sys`](https://python-all.ru/3.9/library/sys.html#module-sys) API. См. документацию [ограничение длины преобразования целых чисел в строку](https://python-all.ru/3.9/library/stdtypes.html#int-max-str-digits). Значение по умолчанию – 4300 цифр в строковом представлении.750751## Значительные изменения в версии 3.9.17752753### tarfile754755- Методы извлечения в [`tarfile`](https://python-all.ru/3.9/library/tarfile.html#module-tarfile) и [`shutil.unpack_archive()`](https://python-all.ru/3.9/library/shutil.html#shutil.unpack_archive) получили новый аргумент *filter*, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. [Extraction filters](https://python-all.ru/3.9/library/tarfile.html#tarfile-extraction-filter). В Python 3.12 использование без аргумента *filter* вызовет [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning). В Python 3.14 значение по умолчанию будет изменено на `'data'`. (Автор: Petr Viktorin в [**PEP 706**](https://python-all.ru/3.9/whatsnew/3.9.html).)756757## Значительные изменения в версии 3.9.20758759### ipaddress760761- Исправлено поведение `is_global` и `is_private` в `IPv4Address`, `IPv6Address`, `IPv4Network` и `IPv6Network`.762763### email764765- Заголовки с символами новой строки внутри теперь заключаются в кавычки при выводе.766767  [`generator`](https://python-all.ru/3.9/library/email.generator.html#module-email.generator) теперь будет отказываться сериализовать (записывать) заголовки, которые неправильно свёрнуты или разделены, так что они будут распознаны как несколько заголовков или объединены с соседними данными. Если необходимо отключить эту защиту, установите [`verify_generated_headers`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.verify_generated_headers). (Авторы: Bas Bloemsaat и Petr Viktorin в [gh-121650](https://python-all.ru/3.9/whatsnew/3.9.html).)768- [`email.utils.getaddresses()`](https://python-all.ru/3.9/library/email.utils.html#email.utils.getaddresses) и [`email.utils.parseaddr()`](https://python-all.ru/3.9/library/email.utils.html#email.utils.parseaddr) теперь возвращают `('', '')` 2-кортежи в большем количестве случаев, когда встречаются недопустимые адреса электронной почты, вместо потенциально неточных значений. В эти две функции добавлен необязательный параметр *strict*: используйте `strict=False` для получения старого поведения, принимающего некорректные входные данные. `getattr(email.utils, 'supports_strict_parsing', False)` можно использовать для проверки доступности параметра *strict*. (Авторы: Thomas Dwyer и Victor Stinner для [gh-102988](https://python-all.ru/3.9/whatsnew/3.9.html), улучшение исправления CVE-2023-27043.)769770## Значительные изменения в версии 3.9.23771772### os.path773774- Параметр *strict* был перенесён в [`os.path.realpath()`](https://python-all.ru/3.9/library/os.path.html#os.path.realpath), чтобы `tarfile` мог использовать его для устранения уязвимостей. В частности, если *strict* установлен в [`os.path.ALLOW_MISSING`](https://python-all.ru/3.9/library/os.path.html#os.path.ALLOW_MISSING), ошибки, отличные от [`FileNotFoundError`](https://python-all.ru/3.9/library/exceptions.html#FileNotFoundError), будут возбуждаться повторно; результирующий путь может отсутствовать, но в нём не будет символических ссылок. (Автор Petr Viktorin для CVE 2025-4517.)775776### tarfile777778- [`data_filter()`](https://python-all.ru/3.9/library/tarfile.html#tarfile.data_filter) теперь нормализует цели символьных ссылок, чтобы избежать атак обхода пути. (Автор: Petr Viktorin в [gh-127987](https://python-all.ru/3.9/whatsnew/3.9.html) и CVE 2025-4138.)779- [`extractall()`](https://python-all.ru/3.9/library/tarfile.html#tarfile.TarFile.extractall) теперь пропускает исправление атрибутов каталога, когда каталог был удалён или заменён файлом другого типа. (Автор: Petr Viktorin в [gh-127987](https://python-all.ru/3.9/whatsnew/3.9.html) и CVE 2024-12718.)780- [`extract()`](https://python-all.ru/3.9/library/tarfile.html#tarfile.TarFile.extract) и [`extractall()`](https://python-all.ru/3.9/library/tarfile.html#tarfile.TarFile.extractall) теперь (заново) применяют фильтр извлечения при замене ссылки (жёсткой или символьной) копией другого члена архива, а также при исправлении атрибутов каталога. Первый вызывает новое исключение [`LinkFallbackError`](https://python-all.ru/3.9/library/tarfile.html#tarfile.LinkFallbackError). (Автор: Petr Viktorin, CVE 2025-4330 и CVE 2024-12718.)781- [`extract()`](https://python-all.ru/3.9/library/tarfile.html#tarfile.TarFile.extract) и [`extractall()`](https://python-all.ru/3.9/library/tarfile.html#tarfile.TarFile.extractall) больше не извлекают отклонённые члены, когда [`errorlevel()`](https://python-all.ru/3.9/library/tarfile.html#tarfile.TarFile.errorlevel) равен нулю. (Авторы: Matt Prodani и Petr Viktorin в [gh-112887](https://python-all.ru/3.9/whatsnew/3.9.html) и CVE 2025-4435.)782