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

3.9.md

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

1> **Источник:** https://python-all.ru/3.12/whatsnew/3.9.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.989**Редактор:**1011Łukasz Langa1213В этой статье описываются новые возможности Python 3.9 по сравнению с 3.8. Python 3.9 был выпущен 5 октября 2020 года. Подробнее см. в [списке изменений](https://python-all.ru/3.12/whatsnew/changelog.html#changelog).1415> **См. также**16>17> [**PEP 596**](https://python-all.ru/3.12/whatsnew/3.9.html) – график выпуска Python 3.91819## Итоги – основные изменения2021Новые синтаксические возможности:2223- [**PEP 584**](https://python-all.ru/3.12/whatsnew/3.9.html), добавлены операторы объединения для `dict`;24- [**PEP 585**](https://python-all.ru/3.12/whatsnew/3.9.html) – аннотации типов для обобщённых типов в стандартных коллекциях;25- [**PEP 614**](https://python-all.ru/3.12/whatsnew/3.9.html) – ослаблены грамматические ограничения на декораторы.2627Новые встроенные возможности:2829- [**PEP 616**](https://python-all.ru/3.12/whatsnew/3.9.html) – строковые методы для удаления префиксов и суффиксов.3031Новые возможности в стандартной библиотеке:3233- [**PEP 593**](https://python-all.ru/3.12/whatsnew/3.9.html) – гибкие аннотации функций и переменных;34- [`os.pidfd_open()`](https://python-all.ru/3.12/library/os.html#os.pidfd_open) добавлен, что позволяет управлять процессами без состояний гонки и сигналов.3536Улучшения интерпретатора:3738- [**PEP 573**](https://python-all.ru/3.12/whatsnew/3.9.html) – быстрый доступ к состоянию модуля из методов типов C-расширений;39- [**PEP 617**](https://python-all.ru/3.12/whatsnew/3.9.html) – CPython теперь использует новый парсер на основе PEG;40- ряд встроенных функций Python (range, tuple, set, frozenset, list, dict) теперь ускорены с помощью [**PEP 590**](https://python-all.ru/3.12/whatsnew/3.9.html) vectorcall;41- сборка мусора не блокируется на воскрешённых объектах;42- ряд модулей Python (`_abc`, [`audioop`](https://python-all.ru/3.12/library/audioop.html#module-audioop), `_bz2`, `_codecs`, `_contextvars`, `_crypt`, `_functools`, `_json`, `_locale`, [`math`](https://python-all.ru/3.12/library/math.html#module-math), [`operator`](https://python-all.ru/3.12/library/operator.html#module-operator), [`resource`](https://python-all.ru/3.12/library/resource.html#module-resource), [`time`](https://python-all.ru/3.12/library/time.html#module-time), `_weakref`) теперь используют многофазную инициализацию, определённую в PEP 489;43- ряд модулей стандартной библиотеки ([`audioop`](https://python-all.ru/3.12/library/audioop.html#module-audioop), [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast), [`grp`](https://python-all.ru/3.12/library/grp.html#module-grp), `_hashlib`, [`pwd`](https://python-all.ru/3.12/library/pwd.html#module-pwd), `_posixsubprocess`, [`random`](https://python-all.ru/3.12/library/random.html#module-random), [`select`](https://python-all.ru/3.12/library/select.html#module-select), [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct), [`termios`](https://python-all.ru/3.12/library/termios.html#module-termios), [`zlib`](https://python-all.ru/3.12/library/zlib.html#module-zlib)) теперь используют стабильный ABI, определённый в PEP 384.4445Новые модули библиотеки:4647- [**PEP 615**](https://python-all.ru/3.12/whatsnew/3.9.html) – база данных часовых поясов IANA теперь присутствует в стандартной библиотеке в модуле [`zoneinfo`](https://python-all.ru/3.12/library/zoneinfo.html#module-zoneinfo);48- реализация топологической сортировки графа теперь предоставляется в новом модуле [`graphlib`](https://python-all.ru/3.12/library/graphlib.html#module-graphlib).4950Изменения в процессе выпуска:5152- [**PEP 602**](https://python-all.ru/3.12/whatsnew/3.9.html) – CPython переходит на ежегодный цикл выпуска.5354## Следует проверять наличие DeprecationWarning в коде5556Когда Python 2.7 ещё поддерживался, в Python 3 было сохранено множество функций для обратной совместимости с Python 2.7. С прекращением поддержки Python 2 эти прослойки обратной совместимости были удалены или будут удалены в ближайшее время. Большинство из них в течение нескольких лет выдавали предупреждение [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning). Например, использование `collections.Mapping` вместо `collections.abc.Mapping` вызывает [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning) начиная с Python 3.3, выпущенного в 2012 году.5758Протестируйте приложение с параметром командной строки [`-W`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-W) `default`, чтобы увидеть [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning) и [`PendingDeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#PendingDeprecationWarning), или даже с [`-W`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-W) `error`, чтобы обрабатывать их как ошибки. [Фильтр предупреждений](https://python-all.ru/3.12/library/warnings.html#warning-filter) можно использовать для игнорирования предупреждений из стороннего кода.5960Python 3.9 – последняя версия, предоставляющая эти прослойки обратной совместимости с Python 2, чтобы дать разработчикам проектов на Python больше времени для организации удаления поддержки Python 2 и добавления поддержки Python 3.9.6162Псевдонимы [абстрактных базовых классов](https://python-all.ru/3.12/library/collections.abc.html#collections-abstract-base-classes) в модуле [`collections`](https://python-all.ru/3.12/library/collections.html#module-collections), например псевдоним `collections.Mapping` для [`collections.abc.Mapping`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Mapping), сохраняются в последнем релизе для обратной совместимости. Они будут удалены из Python 3.10.6364В более общем смысле, старайтесь запускать тесты в [режиме разработки Python](https://python-all.ru/3.12/library/devmode.html#devmode), который помогает подготовить код к совместимости со следующей версией Python.6566Примечание: в этой версии Python также были удалены некоторые ранее существовавшие устаревшие возможности. Обратитесь к разделу [Удалено](https://python-all.ru/3.12/whatsnew/3.9.html#removed-in-python-39).6768## Новые возможности6970### Операторы слияния и обновления словарей7172Операторы слияния (`|`) и обновления (`|=`) были добавлены во встроенный класс [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict). Они дополняют существующие методы слияния словарей `dict.update` и `{**d1, **d2}`.7374Пример:7576```python77>>> x = {"key1": "value1 from x", "key2": "value2 from x"}78>>> y = {"key2": "value2 from y", "key3": "value3 from y"}79>>> x | y80{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}81>>> y | x82{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}83```8485См. [**PEP 584**](https://python-all.ru/3.12/whatsnew/3.9.html) для полного описания. (Автор: Brandt Bucher в [bpo-36144](https://python-all.ru/3.12/whatsnew/3.9.html).)8687### Новые строковые методы для удаления префиксов и суффиксов8889Добавлены [`str.removeprefix(prefix)`](https://python-all.ru/3.12/library/stdtypes.html#str.removeprefix) и [`str.removesuffix(suffix)`](https://python-all.ru/3.12/library/stdtypes.html#str.removesuffix) для простого удаления ненужного префикса или суффикса из строки. Также добавлены соответствующие методы `bytes`, `bytearray` и `collections.UserString`. См. [**PEP 616**](https://python-all.ru/3.12/whatsnew/3.9.html) для полного описания. (Автор: Dennis Sweeney в [bpo-39939](https://python-all.ru/3.12/whatsnew/3.9.html).)9091### Обобщения (generics) для подсказок типов в стандартных коллекциях9293В аннотациях типов теперь можно использовать встроенные типы коллекций, такие как `list` и `dict`, в качестве обобщённых типов, вместо импорта соответствующих типов с заглавной буквы (например, `List` или `Dict`) из `typing`. Некоторые другие типы в стандартной библиотеке теперь также являются обобщёнными, например `queue.Queue`.9495Пример:9697```python98def greet_all(names: list[str]) -> None:99    for name in names:100        print("Hello", name)101```102103См. [**PEP 585**](https://python-all.ru/3.12/whatsnew/3.9.html) для подробностей. (Авторы: Guido van Rossum, Ethan Smith и Batuhan Taşkaya в [bpo-39481](https://python-all.ru/3.12/whatsnew/3.9.html).)104105### Новый парсер106107Python 3.9 использует новый парсер на основе [PEG](https://python-all.ru/3.12/whatsnew/3.9.html) вместо [LL(1)](https://python-all.ru/3.12/whatsnew/3.9.html). Производительность нового парсера примерно сравнима со старым, но формализм PEG более гибок, чем LL(1), когда речь идёт о проектировании новых возможностей языка. Мы начнём использовать эту гибкость в Python 3.10 и далее.108109Модуль [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast) использует новый парсер и генерирует то же AST, что и старый парсер.110111В Python 3.10 старый парсер будет удалён, а вместе с ним и все функции, зависящие от него (прежде всего модуль `parser`, который давно устарел). В Python 3.9 *только* можно переключиться обратно на парсер LL(1) с помощью параметра командной строки (`-X oldparser`) или переменной окружения (`PYTHONOLDPARSER=1`).112113См. [**PEP 617**](https://python-all.ru/3.12/whatsnew/3.9.html) для подробностей. (Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в [bpo-40334](https://python-all.ru/3.12/whatsnew/3.9.html).)114115## Прочие изменения языка116117- [`__import__()`](https://python-all.ru/3.12/library/functions.html#import__) теперь вызывает [`ImportError`](https://python-all.ru/3.12/library/exceptions.html#ImportError) вместо [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), что ранее происходило, когда относительный импорт выходил за пределы своего пакета верхнего уровня. (Автор: Ngalim Siregar в [bpo-37444](https://python-all.ru/3.12/whatsnew/3.9.html).)118- Python теперь получает абсолютный путь к имени файла сценария, указанному в командной строке (например: `python3 script.py`): атрибут `__file__` модуля [`__main__`](https://python-all.ru/3.12/library/__main__.html#module-__main__) стал абсолютным путём, а не относительным. Эти пути теперь остаются действительными после изменения текущего каталога с помощью [`os.chdir()`](https://python-all.ru/3.12/library/os.html#os.chdir). Как побочный эффект, трассировка также отображает абсолютный путь для кадров модуля [`__main__`](https://python-all.ru/3.12/library/__main__.html#module-__main__) в этом случае. (Автор: Victor Stinner в [bpo-20443](https://python-all.ru/3.12/whatsnew/3.9.html).)119- В [режиме разработки Python](https://python-all.ru/3.12/library/devmode.html#devmode) и в [отладочной сборке](https://python-all.ru/3.12/using/configure.html#debug-build) теперь проверяются аргументы *encoding* и *errors* для операций кодирования и декодирования строк. Примеры: [`open()`](https://python-all.ru/3.12/library/functions.html#open), [`str.encode()`](https://python-all.ru/3.12/library/stdtypes.html#str.encode) и [`bytes.decode()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.decode).120121  По умолчанию для максимальной производительности аргумент *errors* проверяется только при первой ошибке кодирования/декодирования, а аргумент *encoding* иногда игнорируется для пустых строк. (Автор: Victor Stinner в [bpo-37388](https://python-all.ru/3.12/whatsnew/3.9.html).)122- `"".replace("", s, n)` теперь возвращает `s` вместо пустой строки для всех ненулевых `n`. Теперь это согласовано с `"".replace("", s)`. Аналогичные изменения внесены для объектов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray). (Автор: Serhiy Storchaka в [bpo-28029](https://python-all.ru/3.12/whatsnew/3.9.html).)123- Любое допустимое выражение теперь может использоваться в качестве [декоратора](https://python-all.ru/3.12/glossary.html#term-decorator). Ранее грамматика была гораздо более ограничительной. См. [**PEP 614**](https://python-all.ru/3.12/whatsnew/3.9.html) для подробностей. (Автор: Brandt Bucher в [bpo-39702](https://python-all.ru/3.12/whatsnew/3.9.html).)124- Улучшена справка для модуля [`typing`](https://python-all.ru/3.12/library/typing.html#module-typing). Теперь докстринги отображаются для всех специальных форм и специальных обобщённых псевдонимов (например, `Union` и `List`). Использование [`help()`](https://python-all.ru/3.12/library/functions.html#help) с обобщённым псевдонимом, например `List[int]`, покажет справку для соответствующего конкретного типа (`list` в данном случае). (Автор: Serhiy Storchaka в [bpo-40257](https://python-all.ru/3.12/whatsnew/3.9.html).)125- Параллельный запуск [`aclose()`](https://python-all.ru/3.12/reference/expressions.html#agen.aclose) / [`asend()`](https://python-all.ru/3.12/reference/expressions.html#agen.asend) / [`athrow()`](https://python-all.ru/3.12/reference/expressions.html#agen.athrow) теперь запрещён, а `ag_running` теперь отражает фактический статус выполнения асинхронного генератора. (Автор: Yury Selivanov в [bpo-30773](https://python-all.ru/3.12/whatsnew/3.9.html).)126- Неожиданные ошибки при вызове метода `__iter__` больше не маскируются `TypeError` в операторе [`in`](https://python-all.ru/3.12/reference/expressions.html#in) и функциях [`contains()`](https://python-all.ru/3.12/library/operator.html#operator.contains), [`indexOf()`](https://python-all.ru/3.12/library/operator.html#operator.indexOf) и [`countOf()`](https://python-all.ru/3.12/library/operator.html#operator.countOf) модуля [`operator`](https://python-all.ru/3.12/library/operator.html#module-operator). (Автор: Serhiy Storchaka в [bpo-40824](https://python-all.ru/3.12/whatsnew/3.9.html).)127- Лямбда-выражения без скобок больше не могут быть частью выражения в предложении `if` в включениях и генераторных выражениях. См. [bpo-41848](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-43755](https://python-all.ru/3.12/whatsnew/3.9.html) для подробностей.128129## Новые модули130131### zoneinfo132133Модуль [`zoneinfo`](https://python-all.ru/3.12/library/zoneinfo.html#module-zoneinfo) добавляет поддержку базы данных часовых поясов IANA в стандартную библиотеку. Он добавляет [`zoneinfo.ZoneInfo`](https://python-all.ru/3.12/library/zoneinfo.html#zoneinfo.ZoneInfo) – конкретную реализацию [`datetime.tzinfo`](https://python-all.ru/3.12/library/datetime.html#datetime.tzinfo), основанную на системных данных о часовых поясах.134135Пример:136137```python138>>> from zoneinfo import ZoneInfo139>>> from datetime import datetime, timedelta140141>>> # Летнее время142>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))143>>> print(dt)1442020-10-31 12:00:00-07:00145>>> dt.tzname()146'PDT'147148>>> # Стандартное время149>>> dt += timedelta(days=7)150>>> print(dt)1512020-11-07 12:00:00-08:00152>>> print(dt.tzname())153PST154```155156В качестве резервного источника данных для платформ, не поставляющих базу данных IANA, модуль [tzdata](https://python-all.ru/3.12/whatsnew/3.9.html) был выпущен как пакет первого уровня – распространяется через PyPI и поддерживается основной командой CPython.157158> **См. также**159>160> **[**PEP 615**](https://python-all.ru/3.12/whatsnew/3.9.html) – Поддержка базы данных часовых поясов IANA в стандартной библиотеке**161>162> PEP написан и реализован Полом Ганслом.163164### graphlib165166Добавлен новый модуль [`graphlib`](https://python-all.ru/3.12/library/graphlib.html#module-graphlib), содержащий класс [`graphlib.TopologicalSorter`](https://python-all.ru/3.12/library/graphlib.html#graphlib.TopologicalSorter) для топологической сортировки графов. (Авторы: Pablo Galindo, Tim Peters и Larry Hastings в [bpo-17005](https://python-all.ru/3.12/whatsnew/3.9.html).)167168## Улучшенные модули169170### ast171172Добавлена опция *indent* в [`dump()`](https://python-all.ru/3.12/library/ast.html#ast.dump), позволяющая создавать многострочный вывод с отступами. (Автор: Serhiy Storchaka в [bpo-37995](https://python-all.ru/3.12/whatsnew/3.9.html).)173174Добавлена функция [`ast.unparse()`](https://python-all.ru/3.12/library/ast.html#ast.unparse) в модуль [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast), которую можно использовать для обратного синтаксического анализа объекта [`ast.AST`](https://python-all.ru/3.12/library/ast.html#ast.AST) и получения строки с кодом, который при разборе даст эквивалентный объект [`ast.AST`](https://python-all.ru/3.12/library/ast.html#ast.AST). (Авторы: Pablo Galindo и Batuhan Taskaya в [bpo-38870](https://python-all.ru/3.12/whatsnew/3.9.html).)175176Добавлены строки документации к узлам AST, содержащие сигнатуру ASDL, используемую для создания этого узла. (Автор: Batuhan Taskaya в [bpo-39638](https://python-all.ru/3.12/whatsnew/3.9.html).)177178### asyncio179180Из-за серьёзных проблем безопасности параметр *reuse\_address* функции [`asyncio.loop.create_datagram_endpoint()`](https://python-all.ru/3.12/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.12/whatsnew/3.9.html).)181182Добавлена новая [корутина](https://python-all.ru/3.12/glossary.html#term-coroutine) [`shutdown_default_executor()`](https://python-all.ru/3.12/library/asyncio-eventloop.html#asyncio.loop.shutdown_default_executor), которая планирует завершение работы исполнителя по умолчанию, ожидая завершения закрытия [`ThreadPoolExecutor`](https://python-all.ru/3.12/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor). Также [`asyncio.run()`](https://python-all.ru/3.12/library/asyncio-runner.html#asyncio.run) обновлена для использования новой [корутины](https://python-all.ru/3.12/glossary.html#term-coroutine). (Предложено Кайлом Стэнли в [bpo-34037](https://python-all.ru/3.12/whatsnew/3.9.html).)183184Добавлена [`asyncio.PidfdChildWatcher`](https://python-all.ru/3.12/library/asyncio-policy.html#asyncio.PidfdChildWatcher), реализация наблюдателя за дочерними процессами для Linux, которая опрашивает файловые дескрипторы процессов. ([bpo-38692](https://python-all.ru/3.12/whatsnew/3.9.html))185186Добавлена новая [корутина](https://python-all.ru/3.12/glossary.html#term-coroutine) [`asyncio.to_thread()`](https://python-all.ru/3.12/library/asyncio-task.html#asyncio.to_thread). В основном используется для выполнения функций, связанных с вводом-выводом, в отдельном потоке, чтобы не блокировать цикл событий, и по сути работает как высокоуровневая версия [`run_in_executor()`](https://python-all.ru/3.12/library/asyncio-eventloop.html#asyncio.loop.run_in_executor), которая может напрямую принимать именованные аргументы. (Авторы: Kyle Stanley и Yury Selivanov в [bpo-32309](https://python-all.ru/3.12/whatsnew/3.9.html).)187188При отмене задачи из-за тайм-аута [`asyncio.wait_for()`](https://python-all.ru/3.12/library/asyncio-task.html#asyncio.wait_for) теперь будет ждать завершения отмены также и в случае, когда *timeout* \<= 0, как и при положительных значениях тайм-аута. (Автор: Elvis Pranskevichus в [bpo-32751](https://python-all.ru/3.12/whatsnew/3.9.html).)189190[`asyncio`](https://python-all.ru/3.12/library/asyncio.html#module-asyncio) теперь вызывает [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) при вызове несовместимых методов с сокетом [`ssl.SSLSocket`](https://python-all.ru/3.12/library/ssl.html#ssl.SSLSocket). (Автор: Ido Michael в [bpo-37404](https://python-all.ru/3.12/whatsnew/3.9.html).)191192### compileall193194Добавлена новая возможность использовать жёсткие ссылки для дублирующихся файлов `.pyc`: параметр *hardlink\_dupes* и опция командной строки –hardlink-dupes. (Автор: Lumír ‘Frenzy’ Balhar в [bpo-40495](https://python-all.ru/3.12/whatsnew/3.9.html).)195196Добавлены новые опции для управления путями в результирующих файлах `.pyc`: параметры *stripdir*, *prependdir*, *limit\_sl\_dest* и опции командной строки -s, -p, -e. Добавлена возможность указывать опцию для уровня оптимизации несколько раз. (Автор: Lumír ‘Frenzy’ Balhar в [bpo-38112](https://python-all.ru/3.12/whatsnew/3.9.html).)197198### concurrent.futures199200Добавлен новый параметр *cancel\_futures* в [`concurrent.futures.Executor.shutdown()`](https://python-all.ru/3.12/library/concurrent.futures.html#concurrent.futures.Executor.shutdown), который отменяет все ожидающие выполнения future, которые ещё не начали выполняться, вместо ожидания их завершения перед остановкой исполнителя. (Автор: Kyle Stanley в [bpo-39349](https://python-all.ru/3.12/whatsnew/3.9.html).)201202Удалены потоки-демоны из [`ThreadPoolExecutor`](https://python-all.ru/3.12/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) и [`ProcessPoolExecutor`](https://python-all.ru/3.12/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor). Это улучшает совместимость с под-интерпретаторами и предсказуемость процессов их завершения. (Автор: Kyle Stanley в [bpo-39812](https://python-all.ru/3.12/whatsnew/3.9.html).)203204Рабочие процессы в [`ProcessPoolExecutor`](https://python-all.ru/3.12/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor) теперь создаются по требованию, только когда нет свободных рабочих процессов для повторного использования. Это оптимизирует накладные расходы при запуске и уменьшает количество потерянного процессорного времени на простаивающие рабочие процессы. (Автор: Kyle Stanley в [bpo-39207](https://python-all.ru/3.12/whatsnew/3.9.html).)205206### curses207208Добавлены функции [`curses.get_escdelay()`](https://python-all.ru/3.12/library/curses.html#curses.get_escdelay), [`curses.set_escdelay()`](https://python-all.ru/3.12/library/curses.html#curses.set_escdelay), [`curses.get_tabsize()`](https://python-all.ru/3.12/library/curses.html#curses.get_tabsize) и [`curses.set_tabsize()`](https://python-all.ru/3.12/library/curses.html#curses.set_tabsize). (Автор: Anthony Sottile в [bpo-38312](https://python-all.ru/3.12/whatsnew/3.9.html).)209210### datetime211212Методы [`isocalendar()`](https://python-all.ru/3.12/library/datetime.html#datetime.date.isocalendar) класса [`datetime.date`](https://python-all.ru/3.12/library/datetime.html#datetime.date) и [`isocalendar()`](https://python-all.ru/3.12/library/datetime.html#datetime.datetime.isocalendar) класса [`datetime.datetime`](https://python-all.ru/3.12/library/datetime.html#datetime.datetime) теперь возвращают [`namedtuple()`](https://python-all.ru/3.12/library/collections.html#collections.namedtuple) вместо [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple). (Автор: Donghee Na в [bpo-24416](https://python-all.ru/3.12/whatsnew/3.9.html).)213214### distutils215216Команда **upload** теперь создаёт хеш-дайджесты SHA2-256 и Blake2b-256. Она пропускает MD5 на платформах, которые блокируют дайджест MD5. (Автор: Christian Heimes в [bpo-40698](https://python-all.ru/3.12/whatsnew/3.9.html).)217218### fcntl219220Добавлены константы `F_OFD_GETLK`, `F_OFD_SETLK` и `F_OFD_SETLKW`. (Автор: Donghee Na в [bpo-38602](https://python-all.ru/3.12/whatsnew/3.9.html).)221222### ftplib223224[`FTP`](https://python-all.ru/3.12/library/ftplib.html#ftplib.FTP) и [`FTP_TLS`](https://python-all.ru/3.12/library/ftplib.html#ftplib.FTP_TLS) теперь вызывают исключение [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в [bpo-39259](https://python-all.ru/3.12/whatsnew/3.9.html).)225226### gc227228Когда сборщик мусора выполняет сборку, в ходе которой некоторые объекты воскресают (они становятся доступны извне изолированных циклов после выполнения финализаторов), сборка всех объектов, которые всё ещё недоступны, не блокируется. (Авторы: Pablo Galindo и Tim Peters в [bpo-38379](https://python-all.ru/3.12/whatsnew/3.9.html).)229230Добавлена новая функция [`gc.is_finalized()`](https://python-all.ru/3.12/library/gc.html#gc.is_finalized) для проверки, был ли объект финализирован сборщиком мусора. (Автор: Pablo Galindo в [bpo-39322](https://python-all.ru/3.12/whatsnew/3.9.html).)231232### hashlib233234Модуль [`hashlib`](https://python-all.ru/3.12/library/hashlib.html#module-hashlib) теперь может использовать хеши SHA3 и SHAKE XOF из OpenSSL при их наличии. (Автор: Christian Heimes в [bpo-37630](https://python-all.ru/3.12/whatsnew/3.9.html).)235236Встроенные хеш-модули теперь можно отключить с помощью `./configure --without-builtin-hashlib-hashes` или выборочно включить, например, `./configure --with-builtin-hashlib-hashes=sha3,blake2`, чтобы принудительно использовать реализацию на основе OpenSSL. (Автор: Christian Heimes в [bpo-40479](https://python-all.ru/3.12/whatsnew/3.9.html))237238### http239240Коды состояния HTTP `103 EARLY_HINTS`, `418 IM_A_TEAPOT` и `425 TOO_EARLY` добавлены в [`http.HTTPStatus`](https://python-all.ru/3.12/library/http.html#http.HTTPStatus). (Авторы: Donghee Na в [bpo-39509](https://python-all.ru/3.12/whatsnew/3.9.html) и Ross Rhodes в [bpo-39507](https://python-all.ru/3.12/whatsnew/3.9.html).)241242### IDLE и idlelib243244Добавлена опция для отключения мигания курсора. (Автор: Zackery Spytz в [bpo-4603](https://python-all.ru/3.12/whatsnew/3.9.html).)245246Клавиша Escape теперь закрывает окна автодополнения IDLE. (Автор: Johnny Najera в [bpo-38944](https://python-all.ru/3.12/whatsnew/3.9.html).)247248Добавлены ключевые слова в список завершения имён модулей. (Автор: Terry J. Reedy в [bpo-37765](https://python-all.ru/3.12/whatsnew/3.9.html).)249250Новое в корректирующих выпусках 3.9251252IDLE теперь вызывает [`sys.excepthook()`](https://python-all.ru/3.12/library/sys.html#sys.excepthook) (при запуске без «-n»). Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в [bpo-43008](https://python-all.ru/3.12/whatsnew/3.9.html).)253254Приведённые выше изменения были перенесены в корректирующие выпуски 3.8.255256Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в [bpo-40468](https://python-all.ru/3.12/whatsnew/3.9.html).) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в [bpo-33962](https://python-all.ru/3.12/whatsnew/3.9.html).)257258Применять подсветку синтаксиса для файлов `.pyi`. (Авторы: Alex Waygood и Terry Jan Reedy, [bpo-45447](https://python-all.ru/3.12/whatsnew/3.9.html).)259260### imaplib261262[`IMAP4`](https://python-all.ru/3.12/library/imaplib.html#imaplib.IMAP4) и [`IMAP4_SSL`](https://python-all.ru/3.12/library/imaplib.html#imaplib.IMAP4_SSL) теперь имеют необязательный параметр *тайм-аут* для своих конструкторов. Кроме того, метод [`open()`](https://python-all.ru/3.12/library/imaplib.html#imaplib.IMAP4.open) теперь имеет необязательный параметр *тайм-аут*. Переопределённые методы [`IMAP4_SSL`](https://python-all.ru/3.12/library/imaplib.html#imaplib.IMAP4_SSL) и [`IMAP4_stream`](https://python-all.ru/3.12/library/imaplib.html#imaplib.IMAP4_stream) были применены к этому изменению. (Автор: Donghee Na в [bpo-38615](https://python-all.ru/3.12/whatsnew/3.9.html).)263264Добавлен [`imaplib.IMAP4.unselect()`](https://python-all.ru/3.12/library/imaplib.html#imaplib.IMAP4.unselect). [`imaplib.IMAP4.unselect()`](https://python-all.ru/3.12/library/imaplib.html#imaplib.IMAP4.unselect) освобождает ресурсы сервера, связанные с выбранным почтовым ящиком, и возвращает сервер в состояние аутентификации. Эта команда выполняет те же действия, что и [`imaplib.IMAP4.close()`](https://python-all.ru/3.12/library/imaplib.html#imaplib.IMAP4.close), за исключением того, что никакие сообщения не удаляются безвозвратно из текущего выбранного почтового ящика. (Автор: Donghee Na в [bpo-40375](https://python-all.ru/3.12/whatsnew/3.9.html).)265266### importlib267268Для улучшения согласованности с операторами import [`importlib.util.resolve_name()`](https://python-all.ru/3.12/library/importlib.html#importlib.util.resolve_name) теперь вызывает [`ImportError`](https://python-all.ru/3.12/library/exceptions.html#ImportError) вместо [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) при попытке недопустимого относительного импорта. (Автор: Ngalim Siregar в [bpo-37444](https://python-all.ru/3.12/whatsnew/3.9.html).)269270Загрузчики импорта, которые предоставляют неизменяемые объекты модулей, теперь могут предоставлять неизменяемые пакеты в дополнение к отдельным модулям. (Автор: Dino Viehland в [bpo-39336](https://python-all.ru/3.12/whatsnew/3.9.html).)271272Добавлена функция [`importlib.resources.files()`](https://python-all.ru/3.12/library/importlib.resources.html#importlib.resources.files) с поддержкой подкаталогов в данных пакета, что соответствует обратному порту в `importlib_resources` версии 1.5. (Автор: Jason R. Coombs в [bpo-39791](https://python-all.ru/3.12/whatsnew/3.9.html).)273274Обновлён `importlib.metadata` из `importlib_metadata` версии 1.6.1.275276### inspect277278[`inspect.BoundArguments.arguments`](https://python-all.ru/3.12/library/inspect.html#inspect.BoundArguments.arguments) изменён с `OrderedDict` на обычный dict. (Автор: Inada Naoki в [bpo-36350](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-39775](https://python-all.ru/3.12/whatsnew/3.9.html).)279280### ipaddress281282[`ipaddress`](https://python-all.ru/3.12/library/ipaddress.html#module-ipaddress) теперь поддерживает адреса IPv6 с областью действия (IPv6-адрес с суффиксом `%<scope_id>`).283284Адреса IPv6 с областью действия можно разобрать с помощью [`ipaddress.IPv6Address`](https://python-all.ru/3.12/library/ipaddress.html#ipaddress.IPv6Address). Если присутствует, идентификатор зоны области действия доступен через атрибут [`scope_id`](https://python-all.ru/3.12/library/ipaddress.html#ipaddress.IPv6Address.scope_id). (Автор: Oleksandr Pavliuk в [bpo-34788](https://python-all.ru/3.12/whatsnew/3.9.html).)285286Начиная с Python 3.9.5 модуль [`ipaddress`](https://python-all.ru/3.12/library/ipaddress.html#module-ipaddress) больше не принимает ведущие нули в строках IPv4-адресов. (Автор: Christian Heimes в [bpo-36384](https://python-all.ru/3.12/whatsnew/3.9.html)).287288### math289290Расширена функция [`math.gcd()`](https://python-all.ru/3.12/library/math.html#math.gcd) для обработки нескольких аргументов. Ранее она поддерживала только два аргумента. (Автор: Serhiy Storchaka в [bpo-39648](https://python-all.ru/3.12/whatsnew/3.9.html).)291292Добавлена [`math.lcm()`](https://python-all.ru/3.12/library/math.html#math.lcm): возвращает наименьшее общее кратное указанных аргументов. (Авторы: Mark Dickinson, Ananthakrishnan и Serhiy Storchaka в [bpo-39479](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-39648](https://python-all.ru/3.12/whatsnew/3.9.html).)293294Добавлена [`math.nextafter()`](https://python-all.ru/3.12/library/math.html#math.nextafter): возвращает следующее значение с плавающей запятой после *x* по направлению к *y*. (Автор: Victor Stinner в [bpo-39288](https://python-all.ru/3.12/whatsnew/3.9.html).)295296Добавлена [`math.ulp()`](https://python-all.ru/3.12/library/math.html#math.ulp): возвращает значение младшего значащего бита числа с плавающей запятой. (Автор: Victor Stinner в [bpo-39310](https://python-all.ru/3.12/whatsnew/3.9.html).)297298### multiprocessing299300Класс [`multiprocessing.SimpleQueue`](https://python-all.ru/3.12/library/multiprocessing.html#multiprocessing.SimpleQueue) теперь имеет новый метод [`close()`](https://python-all.ru/3.12/library/multiprocessing.html#multiprocessing.SimpleQueue.close) для явного закрытия очереди. (Автор: Victor Stinner в [bpo-30966](https://python-all.ru/3.12/whatsnew/3.9.html).)301302### nntplib303304[`NNTP`](https://python-all.ru/3.12/library/nntplib.html#nntplib.NNTP) и [`NNTP_SSL`](https://python-all.ru/3.12/library/nntplib.html#nntplib.NNTP_SSL) теперь вызывают исключение [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в [bpo-39259](https://python-all.ru/3.12/whatsnew/3.9.html).)305306### os307308Добавлены [`CLD_KILLED`](https://python-all.ru/3.12/library/os.html#os.CLD_KILLED) и [`CLD_STOPPED`](https://python-all.ru/3.12/library/os.html#os.CLD_STOPPED) для `si_code`. (Автор: Donghee Na в [bpo-38493](https://python-all.ru/3.12/whatsnew/3.9.html).)309310Добавлены специфичные для Linux [`os.pidfd_open()`](https://python-all.ru/3.12/library/os.html#os.pidfd_open) ([bpo-38692](https://python-all.ru/3.12/whatsnew/3.9.html)) и [`os.P_PIDFD`](https://python-all.ru/3.12/library/os.html#os.P_PIDFD) ([bpo-38713](https://python-all.ru/3.12/whatsnew/3.9.html)) для управления процессами с помощью файловых дескрипторов.311312Функция [`os.unsetenv()`](https://python-all.ru/3.12/library/os.html#os.unsetenv) теперь также доступна в Windows. (Автор: Victor Stinner в [bpo-39413](https://python-all.ru/3.12/whatsnew/3.9.html).)313314Функции [`os.putenv()`](https://python-all.ru/3.12/library/os.html#os.putenv) и [`os.unsetenv()`](https://python-all.ru/3.12/library/os.html#os.unsetenv) теперь всегда доступны. (Автор: Victor Stinner в [bpo-39395](https://python-all.ru/3.12/whatsnew/3.9.html).)315316Добавлена функция [`os.waitstatus_to_exitcode()`](https://python-all.ru/3.12/library/os.html#os.waitstatus_to_exitcode): преобразует статус ожидания в код завершения. (Автор: Victor Stinner в [bpo-40094](https://python-all.ru/3.12/whatsnew/3.9.html).)317318### pathlib319320Добавлен [`pathlib.Path.readlink()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.readlink), который работает аналогично [`os.readlink()`](https://python-all.ru/3.12/library/os.html#os.readlink). (Автор: Girts Folkmanis в [bpo-30618](https://python-all.ru/3.12/whatsnew/3.9.html))321322### pdb323324В Windows [`Pdb`](https://python-all.ru/3.12/library/pdb.html#pdb.Pdb) теперь поддерживает `~/.pdbrc`. (Авторы: Tim Hopper и Dan Lidral-Porter в [bpo-20523](https://python-all.ru/3.12/whatsnew/3.9.html).)325326### poplib327328[`POP3`](https://python-all.ru/3.12/library/poplib.html#poplib.POP3) и [`POP3_SSL`](https://python-all.ru/3.12/library/poplib.html#poplib.POP3_SSL) теперь вызывают исключение [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в [bpo-39259](https://python-all.ru/3.12/whatsnew/3.9.html).)329330### pprint331332[`pprint`](https://python-all.ru/3.12/library/pprint.html#module-pprint) теперь может красиво печатать [`types.SimpleNamespace`](https://python-all.ru/3.12/library/types.html#types.SimpleNamespace). (Автор: Carl Bordum Hansen в [bpo-37376](https://python-all.ru/3.12/whatsnew/3.9.html).)333334### pydoc335336Строка документации теперь отображается не только для классов, функций, методов и т.д., но и для любого объекта, у которого есть собственный атрибут [`__doc__`](https://python-all.ru/3.12/library/stdtypes.html#definition.__doc__). (Автор: Serhiy Storchaka в [bpo-40257](https://python-all.ru/3.12/whatsnew/3.9.html).)337338### random339340Добавлен новый метод `random.Random.randbytes`: генерирует случайные байты. (Автор: Victor Stinner в [bpo-40286](https://python-all.ru/3.12/whatsnew/3.9.html).)341342### signal343344Добавлен специфичный для Linux [`signal.pidfd_send_signal()`](https://python-all.ru/3.12/library/signal.html#signal.pidfd_send_signal) для отправки сигналов процессу с помощью файлового дескриптора вместо pid. ([bpo-38712](https://python-all.ru/3.12/whatsnew/3.9.html))345346### smtplib347348[`SMTP`](https://python-all.ru/3.12/library/smtplib.html#smtplib.SMTP) и [`SMTP_SSL`](https://python-all.ru/3.12/library/smtplib.html#smtplib.SMTP_SSL) теперь вызывают исключение [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в [bpo-39259](https://python-all.ru/3.12/whatsnew/3.9.html).)349350Конструктор [`LMTP`](https://python-all.ru/3.12/library/smtplib.html#smtplib.LMTP) теперь имеет необязательный параметр *timeout*. (Автор: Donghee Na в [bpo-39329](https://python-all.ru/3.12/whatsnew/3.9.html).)351352### socket353354Модуль [`socket`](https://python-all.ru/3.12/library/socket.html#module-socket) теперь экспортирует константу [`CAN_RAW_JOIN_FILTERS`](https://python-all.ru/3.12/library/socket.html#socket.CAN_RAW_JOIN_FILTERS) в Linux 4.1 и выше. (Авторы: Stefan Tatschner и Zackery Spytz в [bpo-25780](https://python-all.ru/3.12/whatsnew/3.9.html).)355356Модуль socket теперь поддерживает протокол [`CAN_J1939`](https://python-all.ru/3.12/library/socket.html#socket.CAN_J1939) на платформах, которые его поддерживают. (Автор: Karl Ding в [bpo-40291](https://python-all.ru/3.12/whatsnew/3.9.html).)357358Модуль socket теперь содержит функции [`socket.send_fds()`](https://python-all.ru/3.12/library/socket.html#socket.send_fds) и [`socket.recv_fds()`](https://python-all.ru/3.12/library/socket.html#socket.recv_fds). (Авторы: Joannah Nanjekye, Shinya Okano и Victor Stinner, [bpo-28724](https://python-all.ru/3.12/whatsnew/3.9.html).)359360### time361362На AIX [`thread_time()`](https://python-all.ru/3.12/library/time.html#time.thread_time) теперь реализован с помощью `thread_cputime()`, имеющего наносекундное разрешение, вместо `clock_gettime(CLOCK_THREAD_CPUTIME_ID)` с разрешением 10 миллисекунд. (Автор: Batuhan Taskaya, [bpo-40192](https://python-all.ru/3.12/whatsnew/3.9.html))363364### sys365366Добавлен новый атрибут [`sys.platlibdir`](https://python-all.ru/3.12/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.12/whatsnew/3.9.html).)367368Ранее [`sys.stderr`](https://python-all.ru/3.12/library/sys.html#sys.stderr) использовал блочную буферизацию в неинтерактивном режиме. Теперь `stderr` по умолчанию всегда использует построчную буферизацию. (Автор: Jendrik Seipp, [bpo-13601](https://python-all.ru/3.12/whatsnew/3.9.html).)369370### tracemalloc371372Добавлен [`tracemalloc.reset_peak()`](https://python-all.ru/3.12/library/tracemalloc.html#tracemalloc.reset_peak) для установки пикового размера отслеживаемых блоков памяти равным текущему размеру, чтобы измерять пик для определённых участков кода. (Автор: Huon Wilson, [bpo-40630](https://python-all.ru/3.12/whatsnew/3.9.html).)373374### typing375376[**PEP 593**](https://python-all.ru/3.12/whatsnew/3.9.html) представил тип [`typing.Annotated`](https://python-all.ru/3.12/library/typing.html#typing.Annotated) для декорирования существующих типов контекстно-зависимыми метаданными и новый параметр `include_extras` для [`typing.get_type_hints()`](https://python-all.ru/3.12/library/typing.html#typing.get_type_hints) доступа к метаданным во время выполнения. (Авторы: Till Varoquaux и Konstantin Kashin.)377378### unicodedata379380База данных Unicode обновлена до версии 13.0.0. ([bpo-39926](https://python-all.ru/3.12/whatsnew/3.9.html)).381382### venv383384Сценарии активации, предоставляемые [`venv`](https://python-all.ru/3.12/library/venv.html#module-venv), теперь все единообразно задают настройку приглашения, всегда используя значение, указанное `__VENV_PROMPT__`. Ранее некоторые сценарии безусловно использовали `__VENV_PROMPT__`, другие только если оно было установлено (что было по умолчанию), а один использовал `__VENV_NAME__` вместо. (Автор: Brett Cannon, [bpo-37663](https://python-all.ru/3.12/whatsnew/3.9.html).)385386### xml387388Пробельные символы внутри атрибутов теперь сохраняются при сериализации [`xml.etree.ElementTree`](https://python-all.ru/3.12/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) в XML-файл. Символы конца строки больше не нормализуются в 'n'. Это результат обсуждения интерпретации раздела 2.11 спецификации XML. (Автор: Mefistotelis, [bpo-39011](https://python-all.ru/3.12/whatsnew/3.9.html).)389390## Оптимизации391392- Оптимизирован идиом для присваивания временной переменной в генераторах. Теперь `for y in [expr]` в генераторах работает так же быстро, как простое присваивание `y = expr`. Например:393394  > sums = \[s for s in \[0\] for x in data for s in \[s + x\]\]395396  В отличие от оператора `:=`, этот идиом не выносит переменную во внешнюю область видимости.397398  (Автор: Serhiy Storchaka, [bpo-32856](https://python-all.ru/3.12/whatsnew/3.9.html).)399- Оптимизирована обработка сигналов в многопоточных приложениях. Если сигнал получает поток, отличный от главного, цикл выполнения байт-кода больше не прерывается на каждой инструкции для проверки ожидающих сигналов, которые не могут быть обработаны. Только главный поток главного интерпретатора может обрабатывать сигналы.400401  Ранее цикл выполнения байт-кода прерывался на каждой инструкции до тех пор, пока главный поток не обработает сигналы. (Автор: Victor Stinner, [bpo-40010](https://python-all.ru/3.12/whatsnew/3.9.html).)402- Оптимизирован модуль [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess) на FreeBSD с использованием `closefrom()`. (Авторы: Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak и Victor Stinner, [bpo-38061](https://python-all.ru/3.12/whatsnew/3.9.html).)403- [`PyLong_FromDouble()`](https://python-all.ru/3.12/c-api/long.html#c.PyLong_FromDouble) теперь до 1.87x быстрее для значений, помещающихся в long. (Автор: Sergey Fedoseev, [bpo-37986](https://python-all.ru/3.12/whatsnew/3.9.html).)404- Ряд встроенных функций Python ([`range`](https://python-all.ru/3.12/library/stdtypes.html#range), [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple), [`set`](https://python-all.ru/3.12/library/stdtypes.html#set), [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset), [`list`](https://python-all.ru/3.12/library/stdtypes.html#list), [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict)) теперь ускорены за счёт использования протокола vectorcall [**PEP 590**](https://python-all.ru/3.12/whatsnew/3.9.html). (Авторы: Donghee Na, Mark Shannon, Jeroen Demeyer и Petr Viktorin, [bpo-37207](https://python-all.ru/3.12/whatsnew/3.9.html).)405- Оптимизирован `difference_update()` для случая, когда другое множество значительно больше базового. (Предложено Evgeny Kapun, код от Michele Orrù, [bpo-8425](https://python-all.ru/3.12/whatsnew/3.9.html).)406- Аллокатор малых объектов Python (`obmalloc.c`) теперь разрешает (не более) одной пустой арене оставаться доступной для немедленного повторного использования, не возвращая её ОС. Это предотвращает «трешинг» в простых циклах, где арена могла бы создаваться и уничтожаться заново на каждой итерации. (Автор: Tim Peters, [bpo-37257](https://python-all.ru/3.12/whatsnew/3.9.html).)407- [Целочисленное деление](https://python-all.ru/3.12/glossary.html#term-floor-division) с плавающей запятой теперь работает быстрее. Также обновлено сообщение [`ZeroDivisionError`](https://python-all.ru/3.12/library/exceptions.html#ZeroDivisionError) для этой операции. (Автор: Donghee Na, [bpo-39434](https://python-all.ru/3.12/whatsnew/3.9.html).)408- Декодирование коротких ASCII-строк с помощью кодировок UTF-8 и ascii теперь примерно на 15% быстрее. (Автор: Inada Naoki, [bpo-37348](https://python-all.ru/3.12/whatsnew/3.9.html).)409410Вот сводка улучшений производительности от Python 3.4 до Python 3.9:411412```text413Python version                       3.4     3.5     3.6     3.7     3.8    3.9414--------------                       ---     ---     ---     ---     ---    ---415416Variable and attribute read access:417    read_local                       7.1     7.1     5.4     5.1     3.9    3.9418    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5419    read_global                     15.5    19.0    14.3    13.6     7.6    7.8420    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8421    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9422    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9423    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3424    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5425    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7426    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1427428Variable and attribute write access:429    write_local                      8.7     9.3     5.5     5.3     4.3    4.3430    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8431    write_global                    19.7    21.2    18.0    18.0    15.8   16.7432    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8433    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4434    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8435436Data structure read access:437    read_list                       24.2    24.5    20.8    20.8    19.0   19.5438    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2439    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4440    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5441442Data structure write access:443    write_list                      27.1    28.5    22.5    21.6    20.0   20.0444    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7445    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4446    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5447448Stack (or queue) operations:449    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6450    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2451    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4452453Timing loop:454    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3455```456457Эти результаты были получены с помощью сценария тестирования доступа к переменным по адресу: `Tools/scripts/var_access_benchmark.py`. Сценарий отображает время в наносекундах. Тесты проводились на процессоре [Intel® Core™ i7-4960HQ](https://python-all.ru/3.12/whatsnew/3.9.html) под управлением 64-битных сборок macOS, доступных на [python.org](https://python-all.ru/3.12/whatsnew/3.9.html).458459## Устарело460461- Команда `bdist_msi` в distutils теперь устарела, используйте вместо неё `bdist_wheel` (пакеты wheel). (Автор: Hugo van Kemenade, [bpo-39586](https://python-all.ru/3.12/whatsnew/3.9.html).)462- В настоящее время [`math.factorial()`](https://python-all.ru/3.12/library/math.html#math.factorial) принимает экземпляры [`float`](https://python-all.ru/3.12/library/functions.html#float) с неотрицательными целочисленными значениями (например, `5.0`). Для нецелых и отрицательных чисел с плавающей запятой возбуждается [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError). Сейчас это поведение устарело. В будущих версиях Python для всех чисел с плавающей запятой будет возбуждаться [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError). (Автор: Serhiy Storchaka в [bpo-37315](https://python-all.ru/3.12/whatsnew/3.9.html).)463- Модули `parser` и `symbol` устарели и будут удалены в будущих версиях Python. В большинстве случаев пользователи могут задействовать этап генерации и компиляции абстрактного синтаксического дерева (AST) с помощью модуля [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast).464- Функции публичного C API `PyParser_SimpleParseStringFlags()`, `PyParser_SimpleParseStringFlagsFilename()`, `PyParser_SimpleParseFileFlags()` и `PyNode_Compile()` устарели и будут удалены в Python 3.10 вместе со старым парсером.465- Использование [`NotImplemented`](https://python-all.ru/3.12/library/constants.html#NotImplemented) в логическом контексте объявлено устаревшим, поскольку почти всегда является результатом неправильной реализации расширенных операторов сравнения. В одной из будущих версий Python оно будет преобразовано в [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError). (Автор: Josh Rosenberg в [bpo-35712](https://python-all.ru/3.12/whatsnew/3.9.html).)466- Модуль [`random`](https://python-all.ru/3.12/library/random.html#module-random) в настоящее время принимает любой хешируемый тип в качестве возможного значения зерна. К сожалению, для некоторых из этих типов хеш-значение не гарантированно детерминировано. После Python 3.9 модуль будет ограничивать свои зерна типами [`None`](https://python-all.ru/3.12/library/constants.html#None), [`int`](https://python-all.ru/3.12/library/functions.html#int), [`float`](https://python-all.ru/3.12/library/functions.html#float), [`str`](https://python-all.ru/3.12/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray).467- Открытие файла [`GzipFile`](https://python-all.ru/3.12/library/gzip.html#gzip.GzipFile) для записи без указания аргумента *mode* объявлено устаревшим. В будущих версиях Python он всегда будет открываться для чтения по умолчанию. Укажите аргумент *mode*, чтобы открыть его для записи и отключить предупреждение. (Автор: Serhiy Storchaka в [bpo-28286](https://python-all.ru/3.12/whatsnew/3.9.html).)468- Метод `split()` класса `_tkinter.TkappType` объявлен устаревшим в пользу метода `splitlist()`, который обладает более последовательным и предсказуемым поведением. (Автор: Serhiy Storchaka в [bpo-38371](https://python-all.ru/3.12/whatsnew/3.9.html).)469- Явная передача объектов-корутин в [`asyncio.wait()`](https://python-all.ru/3.12/library/asyncio-task.html#asyncio.wait) объявлена устаревшей и будет удалена в версии 3.11. (Авторы: Yury Selivanov и Kyle Stanley в [bpo-34790](https://python-all.ru/3.12/whatsnew/3.9.html).)470- Стандарты binhex4 и hexbin4 теперь устарели. Модуль `binhex` и следующие функции [`binascii`](https://python-all.ru/3.12/library/binascii.html#module-binascii) теперь устарели:471472  - `b2a_hqx()`, `a2b_hqx()`473  - `rlecode_hqx()`, `rledecode_hqx()`474475  (Автор: Victor Stinner в [bpo-39353](https://python-all.ru/3.12/whatsnew/3.9.html).)476- Классы [`ast`](https://python-all.ru/3.12/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.12/whatsnew/3.9.html).)477- Классы [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast) `Suite`, `Param`, `AugLoad` и `AugStore` считаются устаревшими и будут удалены в будущих версиях Python. Они не создавались парсером и не принимались генератором кода в Python 3. (Авторы: Batuhan Taskaya в [bpo-39639](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-39969](https://python-all.ru/3.12/whatsnew/3.9.html) и Serhiy Storchaka в [bpo-39988](https://python-all.ru/3.12/whatsnew/3.9.html).)478- Функции `PyEval_InitThreads()` и `PyEval_ThreadsInitialized()` теперь устарели и будут удалены в Python 3.11. Вызов `PyEval_InitThreads()` теперь ничего не делает. [GIL](https://python-all.ru/3.12/glossary.html#term-GIL) инициализируется с помощью [`Py_Initialize()`](https://python-all.ru/3.12/c-api/init.html#c.Py_Initialize) начиная с Python 3.7. (Автор: Victor Stinner в [bpo-39877](https://python-all.ru/3.12/whatsnew/3.9.html).)479- Передача `None` в качестве первого аргумента функции [`shlex.split()`](https://python-all.ru/3.12/library/shlex.html#shlex.split) объявлена устаревшей. (Автор: Zackery Spytz в [bpo-33262](https://python-all.ru/3.12/whatsnew/3.9.html).)480- `smtpd.MailmanProxy()` теперь устарел, так как непригоден к использованию без внешнего модуля `mailman`. (Автор: Samuel Colvin в [bpo-35800](https://python-all.ru/3.12/whatsnew/3.9.html).)481- Модуль [`lib2to3`](https://python-all.ru/3.12/library/2to3.html#module-lib2to3) теперь генерирует [`PendingDeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#PendingDeprecationWarning). Python 3.9 перешёл на PEG-парсер (см. [**PEP 617**](https://python-all.ru/3.12/whatsnew/3.9.html)), и Python 3.10 может включать новый синтаксис языка, который не поддаётся разбору LL(1)-парсером lib2to3. Модуль `lib2to3` может быть удалён из стандартной библиотеки в одной из будущих версий Python. Рассмотрите сторонние альтернативы, такие как [LibCST](https://python-all.ru/3.12/whatsnew/3.9.html) или [parso](https://python-all.ru/3.12/whatsnew/3.9.html). (Автор: Carl Meyer в [bpo-40360](https://python-all.ru/3.12/whatsnew/3.9.html).)482- Параметр *random* функции [`random.shuffle()`](https://python-all.ru/3.12/library/random.html#random.shuffle) объявлен устаревшим. (Автор: Raymond Hettinger в [bpo-40465](https://python-all.ru/3.12/whatsnew/3.9.html))483484## Удалено485486- Ошибочная версия по адресу `unittest.mock.__version__` удалена.487- [`nntplib.NNTP`](https://python-all.ru/3.12/library/nntplib.html#nntplib.NNTP): методы `xpath()` и `xgtitle()` удалены. Эти методы устарели начиная с Python 3.3. Как правило, эти расширения не поддерживаются или не включены администраторами NNTP-серверов. Для `xgtitle()` используйте [`nntplib.NNTP.descriptions()`](https://python-all.ru/3.12/library/nntplib.html#nntplib.NNTP.descriptions) или [`nntplib.NNTP.description()`](https://python-all.ru/3.12/library/nntplib.html#nntplib.NNTP.description). (Автор: Donghee Na в [bpo-39366](https://python-all.ru/3.12/whatsnew/3.9.html).)488- [`array.array`](https://python-all.ru/3.12/library/array.html#array.array): методы `tostring()` и `fromstring()` удалены. Они были псевдонимами для `tobytes()` и `frombytes()`, устаревших начиная с Python 3.2. (Автор: Victor Stinner в [bpo-38916](https://python-all.ru/3.12/whatsnew/3.9.html).)489- Незадокументированная функция `sys.callstats()` удалена. Начиная с Python 3.7 она была устаревшей и всегда возвращала [`None`](https://python-all.ru/3.12/library/constants.html#None). Она требовала специальной опции сборки `CALL_PROFILE`, которая уже была удалена в Python 3.7. (Автор: Victor Stinner в [bpo-37414](https://python-all.ru/3.12/whatsnew/3.9.html).)490- Функции `sys.getcheckinterval()` и `sys.setcheckinterval()` удалены. Они были устаревшими начиная с Python 3.2. Используйте вместо них [`sys.getswitchinterval()`](https://python-all.ru/3.12/library/sys.html#sys.getswitchinterval) и [`sys.setswitchinterval()`](https://python-all.ru/3.12/library/sys.html#sys.setswitchinterval). (Автор: Victor Stinner в [bpo-37392](https://python-all.ru/3.12/whatsnew/3.9.html).)491- C-функция `PyImport_Cleanup()` удалена. Она была задокументирована как: «Очистить таблицу модулей. Только для внутреннего использования.» (Автор: Victor Stinner в [bpo-36710](https://python-all.ru/3.12/whatsnew/3.9.html).)492- Модули `_dummy_thread` и `dummy_threading` удалены. Эти модули были устаревшими начиная с Python 3.7, который требует поддержки потоков. (Автор: Victor Stinner в [bpo-37312](https://python-all.ru/3.12/whatsnew/3.9.html).)493- Псевдонимы `aifc.openfp()` для `aifc.open()`, `sunau.openfp()` для `sunau.open()` и `wave.openfp()` для [`wave.open()`](https://python-all.ru/3.12/library/wave.html#wave.open) удалены. Они были устаревшими начиная с Python 3.7. (Автор: Victor Stinner в [bpo-37320](https://python-all.ru/3.12/whatsnew/3.9.html).)494- Метод `isAlive()` класса [`threading.Thread`](https://python-all.ru/3.12/library/threading.html#threading.Thread) удалён. Он был устаревшим начиная с Python 3.8. Используйте вместо него [`is_alive()`](https://python-all.ru/3.12/library/threading.html#threading.Thread.is_alive). (Автор: Donghee Na в [bpo-37804](https://python-all.ru/3.12/whatsnew/3.9.html).)495- Методы `getchildren()` и `getiterator()` классов [`ElementTree`](https://python-all.ru/3.12/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) и [`Element`](https://python-all.ru/3.12/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) в модуле [`ElementTree`](https://python-all.ru/3.12/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.12/whatsnew/3.9.html).)496- Старый API [`plistlib`](https://python-all.ru/3.12/library/plistlib.html#module-plistlib) удалён, он был устаревшим начиная с Python 3.4. Используйте функции [`load()`](https://python-all.ru/3.12/library/plistlib.html#plistlib.load), [`loads()`](https://python-all.ru/3.12/library/plistlib.html#plistlib.loads), [`dump()`](https://python-all.ru/3.12/library/plistlib.html#plistlib.dump) и [`dumps()`](https://python-all.ru/3.12/library/plistlib.html#plistlib.dumps). Кроме того, удалён параметр *use\_builtin\_types*; вместо него всегда используются стандартные объекты [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes). (Автор: Jon Janzen в [bpo-36409](https://python-all.ru/3.12/whatsnew/3.9.html).)497- C-функция `PyGen_NeedsFinalizing` удалена. Она не была задокументирована, не тестировалась и нигде не использовалась в CPython после реализации [**PEP 442**](https://python-all.ru/3.12/whatsnew/3.9.html). Патч от Joannah Nanjekye. (Автор: Joannah Nanjekye в [bpo-15088](https://python-all.ru/3.12/whatsnew/3.9.html))498- `base64.encodestring()` и `base64.decodestring()`, псевдонимы, устаревшие начиная с Python 3.1, удалены: используйте [`base64.encodebytes()`](https://python-all.ru/3.12/library/base64.html#base64.encodebytes) и [`base64.decodebytes()`](https://python-all.ru/3.12/library/base64.html#base64.decodebytes). (Автор: Victor Stinner в [bpo-39351](https://python-all.ru/3.12/whatsnew/3.9.html).)499- Функция `fractions.gcd()` удалена, она была устаревшей начиная с Python 3.5 ([bpo-22486](https://python-all.ru/3.12/whatsnew/3.9.html)): используйте [`math.gcd()`](https://python-all.ru/3.12/library/math.html#math.gcd). (Автор: Victor Stinner в [bpo-39350](https://python-all.ru/3.12/whatsnew/3.9.html).)500- Параметр *buffering* функции [`bz2.BZ2File`](https://python-all.ru/3.12/library/bz2.html#bz2.BZ2File) удалён. Начиная с Python 3.0 он игнорировался, а его использование вызывало [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning). Передавайте открытый файловый объект, чтобы управлять тем, как файл открывается. (Автор: Victor Stinner в [bpo-39357](https://python-all.ru/3.12/whatsnew/3.9.html).)501- Параметр *encoding* функции [`json.loads()`](https://python-all.ru/3.12/library/json.html#json.loads) был удалён. Начиная с Python 3.1 он считался устаревшим и игнорировался; его использование вызывало [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning), начиная с Python 3.8. (Автор: Inada Naoki в [bpo-39377](https://python-all.ru/3.12/whatsnew/3.9.html))502- Операторы `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.12/whatsnew/3.9.html).)503- Функция `sys.getcounts()`, параметр командной строки `-X showalloccount` и поле `show_alloc_count` C-структуры [`PyConfig`](https://python-all.ru/3.12/c-api/init_config.html#c.PyConfig) были удалены. Они требовали специальной сборки Python с определённым макросом `COUNT_ALLOCS`. (Автор: Victor Stinner в [bpo-39489](https://python-all.ru/3.12/whatsnew/3.9.html).)504- Атрибут `_field_types` класса [`typing.NamedTuple`](https://python-all.ru/3.12/library/typing.html#typing.NamedTuple) был удалён. Он был устаревшим с Python 3.8. Используйте вместо него атрибут `__annotations__`. (Автор: Serhiy Storchaka в [bpo-40182](https://python-all.ru/3.12/whatsnew/3.9.html).)505- Метод `symtable.SymbolTable.has_exec()` был удалён. Он был устаревшим с 2006 года и при вызове просто возвращал `False`. (Автор: Batuhan Taskaya в [bpo-40208](https://python-all.ru/3.12/whatsnew/3.9.html))506- `asyncio.Task.current_task()` и `asyncio.Task.all_tasks()` были удалены. Они были устаревшими с Python 3.7, и вы можете использовать вместо них [`asyncio.current_task()`](https://python-all.ru/3.12/library/asyncio-task.html#asyncio.current_task) и [`asyncio.all_tasks()`](https://python-all.ru/3.12/library/asyncio-task.html#asyncio.all_tasks). (Автор: Rémi Lapeyre в [bpo-40967](https://python-all.ru/3.12/whatsnew/3.9.html))507- Метод `unescape()` в классе [`html.parser.HTMLParser`](https://python-all.ru/3.12/library/html.parser.html#html.parser.HTMLParser) был удалён (он был устаревшим с Python 3.4). Для преобразования символьных ссылок в соответствующие символы Юникода следует использовать [`html.unescape()`](https://python-all.ru/3.12/library/html.html#html.unescape).508509## Перенос на Python 3.9510511В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.512513### Изменения в Python API514515- [`__import__()`](https://python-all.ru/3.12/library/functions.html#import__) и [`importlib.util.resolve_name()`](https://python-all.ru/3.12/library/importlib.html#importlib.util.resolve_name) теперь вызывают [`ImportError`](https://python-all.ru/3.12/library/exceptions.html#ImportError) вместо [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError). Код, который перехватывает конкретный тип исключения и должен поддерживать как Python 3.9, так и более ранние версии, должен перехватывать оба с помощью `except (ImportError, ValueError):`.516- Скрипты активации [`venv`](https://python-all.ru/3.12/library/venv.html#module-venv) больше не обрабатывают особым образом случай, когда `__VENV_PROMPT__` установлено в `""`.517- Метод [`select.epoll.unregister()`](https://python-all.ru/3.12/library/select.html#select.epoll.unregister) больше не игнорирует ошибку [`EBADF`](https://python-all.ru/3.12/library/errno.html#errno.EBADF). (Автор: Victor Stinner в [bpo-39239](https://python-all.ru/3.12/whatsnew/3.9.html).)518- Параметр *compresslevel* функции [`bz2.BZ2File`](https://python-all.ru/3.12/library/bz2.html#bz2.BZ2File) стал только ключевым (keyword-only), поскольку параметр *buffering* был удалён. (Автор: Victor Stinner в [bpo-39357](https://python-all.ru/3.12/whatsnew/3.9.html).)519- Упрощённое AST для операций индексации. Простые индексы будут представлены своим значением, расширенные срезы – кортежами. `Index(value)` будет возвращать сам `value`, `ExtSlice(slices)` будет возвращать `Tuple(slices, Load())`. (Автор: Serhiy Storchaka в [bpo-34822](https://python-all.ru/3.12/whatsnew/3.9.html).)520- Модуль [`importlib`](https://python-all.ru/3.12/library/importlib.html#module-importlib) теперь игнорирует переменную окружения [`PYTHONCASEOK`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONCASEOK) при использовании параметров командной строки [`-E`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-E) или [`-I`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-I).521- Параметр *encoding* был добавлен в классы [`ftplib.FTP`](https://python-all.ru/3.12/library/ftplib.html#ftplib.FTP) и [`ftplib.FTP_TLS`](https://python-all.ru/3.12/library/ftplib.html#ftplib.FTP_TLS) как только ключевой (keyword-only), а кодировка по умолчанию изменена с Latin-1 на UTF-8 в соответствии с [**RFC 2640**](https://python-all.ru/3.12/whatsnew/3.9.html).522- [`asyncio.loop.shutdown_default_executor()`](https://python-all.ru/3.12/library/asyncio-eventloop.html#asyncio.loop.shutdown_default_executor) был добавлен в [`AbstractEventLoop`](https://python-all.ru/3.12/library/asyncio-eventloop.html#asyncio.AbstractEventLoop), что означает, что альтернативные циклы событий, наследующие от него, должны иметь этот определённый метод. (Автор: Kyle Stanley в [bpo-34037](https://python-all.ru/3.12/whatsnew/3.9.html).)523- Константные значения флагов future в модуле [`__future__`](https://python-all.ru/3.12/library/__future__.html#module-__future__) обновлены, чтобы избежать пересечения с флагами компилятора. Ранее `PyCF_ALLOW_TOP_LEVEL_AWAIT` конфликтовал с `CO_FUTURE_DIVISION`. (Автор: Batuhan Taskaya в [bpo-39562](https://python-all.ru/3.12/whatsnew/3.9.html))524- `array('u')` теперь использует в качестве C-типа `wchar_t` вместо `Py_UNICODE`. Это изменение не влияет на его поведение, поскольку `Py_UNICODE` является псевдонимом `wchar_t` начиная с Python 3.3. (Автор: Inada Naoki в [bpo-34538](https://python-all.ru/3.12/whatsnew/3.9.html).)525- API [`logging.getLogger()`](https://python-all.ru/3.12/library/logging.html#logging.getLogger) теперь возвращает корневой логгер при передаче имени `'root'`, тогда как ранее возвращался некорневой логгер с именем `'root'`. Это может повлиять на случаи, когда код явно требует некорневой логгер с именем `'root'` или создаёт логгер с помощью `logging.getLogger(__name__)` в некотором модуле верхнего уровня с именем `'root.py'`. (Автор: Vinay Sajip в [bpo-37742](https://python-all.ru/3.12/whatsnew/3.9.html).)526- Обработка деления в [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath) теперь возвращает [`NotImplemented`](https://python-all.ru/3.12/library/constants.html#NotImplemented) вместо возбуждения [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError), если передано что-то, не являющееся экземпляром `str` или [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath). Это позволяет создавать совместимые классы, не наследующие от упомянутых типов. (Автор: Roger Aiudi в [bpo-34775](https://python-all.ru/3.12/whatsnew/3.9.html)).527- Начиная с Python 3.9.5 модуль [`ipaddress`](https://python-all.ru/3.12/library/ipaddress.html#module-ipaddress) больше не принимает ведущие нули в строках IPv4-адресов. Ведущие нули неоднозначны и некоторыми библиотеками интерпретируются как восьмеричная запись. Например, устаревшая функция [`socket.inet_aton()`](https://python-all.ru/3.12/library/socket.html#socket.inet_aton) трактует ведущие нули как восьмеричную запись. Реализация glibc современного [`inet_pton()`](https://python-all.ru/3.12/library/socket.html#socket.inet_pton) не принимает никаких ведущих нулей. (Автор: Christian Heimes в [bpo-36384](https://python-all.ru/3.12/whatsnew/3.9.html)).528- [`codecs.lookup()`](https://python-all.ru/3.12/library/codecs.html#codecs.lookup) теперь нормализует имя кодировки так же, как `encodings.normalize_encoding()`, за исключением того, что [`codecs.lookup()`](https://python-all.ru/3.12/library/codecs.html#codecs.lookup) также приводит имя к нижнему регистру. Например, имя кодировки `"latex+latin1"` теперь нормализуется в `"latex_latin1"`. (Автор: Jordon Xu в [bpo-37751](https://python-all.ru/3.12/whatsnew/3.9.html).)529530### Изменения в C API531532- Экземпляры [типов, выделяемых в куче](https://python-all.ru/3.12/c-api/typeobj.html#heap-types) (таких как созданные с помощью [`PyType_FromSpec()`](https://python-all.ru/3.12/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.12/c-api/typeobj.html#c.PyTypeObject.tp_traverse), необходимо убедиться, что все пользовательские функции `tp_traverse` типов, выделяемых в куче, посещают тип объекта.533534  > Пример:535  >536  > ```c537  > int538  > foo_traverse(foo_struct *self, visitproc visit, void *arg) {539  > // Остальная часть функции traverse540  > #if PY_VERSION_HEX >= 0x03090000541  >     // Это не требовалось до Python 3.9 (Python issue 35810 и 40217)542  >     Py_VISIT(Py_TYPE(self));543  > #endif544  > }545  > ```546547  Если ваша функция traverse делегирует вызов `tp_traverse` своего базового класса (или другого типа), убедитесь, что `Py_TYPE(self)` посещается только один раз. Обратите внимание, что только [тип, выделяемый в куче](https://python-all.ru/3.12/c-api/typeobj.html#heap-types) должны посещать тип в `tp_traverse`.548549  > Например, если ваша функция `tp_traverse` содержит:550  >551  > ```c552  > base->tp_traverse(self, visit, arg)553  > ```554  >555  > то добавьте:556  >557  > ```c558  > #if PY_VERSION_HEX >= 0x03090000559  >     // Это не требовалось до Python 3.9 (bpo-35810 и bpo-40217)560  >     if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {561  >         // tp_traverse типа‑кучи уже посетил Py_TYPE(self)562  >     } else {563  >         Py_VISIT(Py_TYPE(self));564  >     }565  > #else566  > ```567568  (См. [bpo-35810](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-40217](https://python-all.ru/3.12/whatsnew/3.9.html) для получения дополнительной информации.)569- Функции `PyEval_CallObject`, `PyEval_CallFunction`, `PyEval_CallMethod` и `PyEval_CallObjectWithKeywords` устарели. Используйте вместо них [`PyObject_Call()`](https://python-all.ru/3.12/c-api/call.html#c.PyObject_Call) и его варианты. (Подробнее см. в [bpo-29548](https://python-all.ru/3.12/whatsnew/3.9.html).)570571### Изменения байткода CPython572573- Код операции [`LOAD_ASSERTION_ERROR`](https://python-all.ru/3.12/library/dis.html#opcode-LOAD_ASSERTION_ERROR) был добавлен для обработки оператора [`assert`](https://python-all.ru/3.12/reference/simple_stmts.html#assert). Ранее оператор assert работал некорректно, если исключение [`AssertionError`](https://python-all.ru/3.12/library/exceptions.html#AssertionError) было скрыто. (Автор: Zackery Spytz в [bpo-34880](https://python-all.ru/3.12/whatsnew/3.9.html).)574- Код операции [`COMPARE_OP`](https://python-all.ru/3.12/library/dis.html#opcode-COMPARE_OP) был разделён на четыре отдельные инструкции:575576  - `COMPARE_OP` для сравнений с богатой семантикой (rich comparisons)577  - `IS_OP` для проверок «is» и «is not»578  - `CONTAINS_OP` для проверок ‘in’ и ‘not in’579  - `JUMP_IF_NOT_EXC_MATCH` для проверки исключений в конструкциях ‘try-except’580581  (Автор: Mark Shannon в [bpo-39156](https://python-all.ru/3.12/whatsnew/3.9.html).)582583## Изменения сборки584585- Добавлена опция `--with-platlibdir` в скрипт `configure`: имя платформо-зависимого каталога библиотек, хранящееся в новом атрибуте [`sys.platlibdir`](https://python-all.ru/3.12/library/sys.html#sys.platlibdir). См. атрибут [`sys.platlibdir`](https://python-all.ru/3.12/library/sys.html#sys.platlibdir) для получения дополнительной информации. (Авторы: Jan Matějek, Matěj Cepl, Charalampos Stratakis и Victor Stinner в [bpo-1294959](https://python-all.ru/3.12/whatsnew/3.9.html).)586- Специальный макрос сборки `COUNT_ALLOCS` удалён. (Автор: Victor Stinner в [bpo-39489](https://python-all.ru/3.12/whatsnew/3.9.html).)587- На платформах, отличных от Windows, функции `setenv()` и `unsetenv()` теперь необходимы для сборки Python. (Автор: Victor Stinner в [bpo-39395](https://python-all.ru/3.12/whatsnew/3.9.html).)588- На платформах, отличных от Windows, создание установщиков `bdist_wininst` теперь официально не поддерживается. (Подробнее см. [bpo-10945](https://python-all.ru/3.12/whatsnew/3.9.html).)589- При сборке Python на macOS из исходного кода, `_tkinter` теперь компонуется с несистемными фреймворками Tcl и Tk, если они установлены в `/Library/Frameworks`, как это было в более старых версиях macOS. Если явно указан macOS SDK, с помощью [`--enable-universalsdk`](https://python-all.ru/3.12/using/configure.html#cmdoption-enable-universalsdk) или `-isysroot`, поиск ведется только в самом SDK. Поведение по умолчанию по-прежнему можно переопределить с помощью `--with-tcltk-includes` и `--with-tcltk-libs`. (Автор: Ned Deily в [bpo-34956](https://python-all.ru/3.12/whatsnew/3.9.html).)590- Python теперь можно собрать для Windows 10 ARM64. (Автор: Steve Dower в [bpo-33125](https://python-all.ru/3.12/whatsnew/3.9.html).)591- Некоторые отдельные тесты теперь пропускаются при использовании `--pgo`. Указанные тесты значительно увеличивали время выполнения задачи PGO и, вероятно, не способствовали улучшению оптимизации конечного исполняемого файла. Это ускоряет выполнение задачи примерно в 15 раз. Запуск полного набора модульных тестов выполняется медленно. Это изменение может привести к немного менее оптимизированной сборке, поскольку будет выполняться меньше ветвей кода. Если вы готовы ждать сборки дольше, прежнее поведение можно восстановить с помощью `./configure [..] PROFILE_TASK="-m test --pgo-extended"`. Мы не даем никаких гарантий относительно того, какой набор задач PGO дает более быструю сборку. Заинтересованным пользователям следует запускать собственные соответствующие тесты производительности, так как результаты могут зависеть от среды, рабочей нагрузки и цепочки инструментов компилятора. (Подробнее см. [bpo-36044](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-37707](https://python-all.ru/3.12/whatsnew/3.9.html).)592593## Изменения C API594595### Новые возможности596597- [**PEP 573**](https://python-all.ru/3.12/whatsnew/3.9.html): Добавлены [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.12/c-api/type.html#c.PyType_FromModuleAndSpec) для связывания модуля с классом; [`PyType_GetModule()`](https://python-all.ru/3.12/c-api/type.html#c.PyType_GetModule) и [`PyType_GetModuleState()`](https://python-all.ru/3.12/c-api/type.html#c.PyType_GetModuleState) для получения модуля и его состояния; и [`PyCMethod`](https://python-all.ru/3.12/c-api/structures.html#c.PyCMethod) и [`METH_METHOD`](https://python-all.ru/3.12/c-api/structures.html#c.METH_METHOD) для предоставления методу доступа к классу, в котором он был определен. (Авторы: Marcel Plch и Petr Viktorin в [bpo-38787](https://python-all.ru/3.12/whatsnew/3.9.html).)598- Добавлена функция [`PyFrame_GetCode()`](https://python-all.ru/3.12/c-api/frame.html#c.PyFrame_GetCode): получение кода фрейма. Добавлена функция [`PyFrame_GetBack()`](https://python-all.ru/3.12/c-api/frame.html#c.PyFrame_GetBack): получение следующего внешнего фрейма. (Автор: Victor Stinner в [bpo-40421](https://python-all.ru/3.12/whatsnew/3.9.html).)599- Добавлен [`PyFrame_GetLineNumber()`](https://python-all.ru/3.12/c-api/frame.html#c.PyFrame_GetLineNumber) в ограниченный C API. (Автор: Victor Stinner в [bpo-40421](https://python-all.ru/3.12/whatsnew/3.9.html).)600- Добавлены функции [`PyThreadState_GetInterpreter()`](https://python-all.ru/3.12/c-api/init.html#c.PyThreadState_GetInterpreter) и [`PyInterpreterState_Get()`](https://python-all.ru/3.12/c-api/init.html#c.PyInterpreterState_Get) для получения интерпретатора. Добавлена функция [`PyThreadState_GetFrame()`](https://python-all.ru/3.12/c-api/init.html#c.PyThreadState_GetFrame) для получения текущего фрейма состояния потока Python. Добавлена функция [`PyThreadState_GetID()`](https://python-all.ru/3.12/c-api/init.html#c.PyThreadState_GetID): получение уникального идентификатора состояния потока Python. (Автор: Victor Stinner в [bpo-39947](https://python-all.ru/3.12/whatsnew/3.9.html).)601- Добавлена новая публичная функция [`PyObject_CallNoArgs()`](https://python-all.ru/3.12/c-api/call.html#c.PyObject_CallNoArgs) в C API, которая вызывает вызываемый объект Python без аргументов. Это наиболее эффективный способ вызова вызываемого объекта Python без аргументов. (Автор: Victor Stinner в [bpo-37194](https://python-all.ru/3.12/whatsnew/3.9.html).)602- Изменения в ограниченном C API (если определён макрос `Py_LIMITED_API`):603604  - Предоставить [`Py_EnterRecursiveCall()`](https://python-all.ru/3.12/c-api/exceptions.html#c.Py_EnterRecursiveCall) и [`Py_LeaveRecursiveCall()`](https://python-all.ru/3.12/c-api/exceptions.html#c.Py_LeaveRecursiveCall) как обычные функции для ограниченного API. Ранее они были определены как макросы, но эти макросы не компилировались с ограниченным C API, который не может получить доступ к полю `PyThreadState.recursion_depth` (структура является непрозрачной в ограниченном C API).605  - `PyObject_INIT()` и `PyObject_INIT_VAR()` становятся обычными «непрозрачными» функциями для скрытия деталей реализации.606607  (Автор: Victor Stinner в [bpo-38644](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-39542](https://python-all.ru/3.12/whatsnew/3.9.html).)608- Добавлена функция [`PyModule_AddType()`](https://python-all.ru/3.12/c-api/module.html#c.PyModule_AddType) для помощи в добавлении типа в модуль. (Автор: Donghee Na в [bpo-40024](https://python-all.ru/3.12/whatsnew/3.9.html).)609- Добавлены функции [`PyObject_GC_IsTracked()`](https://python-all.ru/3.12/c-api/gcsupport.html#c.PyObject_GC_IsTracked) и [`PyObject_GC_IsFinalized()`](https://python-all.ru/3.12/c-api/gcsupport.html#c.PyObject_GC_IsFinalized) в публичный API, позволяющие запрашивать, отслеживаются ли в данный момент объекты Python или уже финализированы сборщиком мусора, соответственно. (Автор: Pablo Galindo Salgado в [bpo-40241](https://python-all.ru/3.12/whatsnew/3.9.html).)610- Добавлен `_PyObject_FunctionStr()` для получения удобочитаемого строкового представления объекта, подобного функции. (Патч от Jeroen Demeyer в [bpo-37645](https://python-all.ru/3.12/whatsnew/3.9.html).)611- Добавлен [`PyObject_CallOneArg()`](https://python-all.ru/3.12/c-api/call.html#c.PyObject_CallOneArg) для вызова объекта с одним позиционным аргументом. (Патч от Jeroen Demeyer в [bpo-37483](https://python-all.ru/3.12/whatsnew/3.9.html).)612613### Перенос на Python 3.9614615- `PyInterpreterState.eval_frame` ([**PEP 523**](https://python-all.ru/3.12/whatsnew/3.9.html)) теперь требует новый обязательный параметр *tstate* (`PyThreadState*`). (Автор: Victor Stinner в [bpo-38500](https://python-all.ru/3.12/whatsnew/3.9.html).)616- Модули расширения: функции [`m_traverse`](https://python-all.ru/3.12/c-api/module.html#c.PyModuleDef.m_traverse), [`m_clear`](https://python-all.ru/3.12/c-api/module.html#c.PyModuleDef.m_clear) и [`m_free`](https://python-all.ru/3.12/c-api/module.html#c.PyModuleDef.m_free) из [`PyModuleDef`](https://python-all.ru/3.12/c-api/module.html#c.PyModuleDef) больше не вызываются, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и до его выполнения (функция [`Py_mod_exec`](https://python-all.ru/3.12/c-api/module.html#c.Py_mod_exec)). Точнее, эти функции не вызываются, если [`m_size`](https://python-all.ru/3.12/c-api/module.html#c.PyModuleDef.m_size) больше 0, а состояние модуля (возвращаемое [`PyModule_GetState()`](https://python-all.ru/3.12/c-api/module.html#c.PyModule_GetState)) равно `NULL`.617618  Модули расширения без состояния модуля (`m_size <= 0`) не затрагиваются.619- Если [`Py_AddPendingCall()`](https://python-all.ru/3.12/c-api/init.html#c.Py_AddPendingCall) вызывается в подынтерпретаторе, функция теперь планируется к вызову из подынтерпретатора, а не вызывается из основного интерпретатора. Каждый подынтерпретатор теперь имеет свой собственный список запланированных вызовов. (Автор: Victor Stinner в [bpo-39984](https://python-all.ru/3.12/whatsnew/3.9.html).)620- Реестр Windows больше не используется для инициализации [`sys.path`](https://python-all.ru/3.12/library/sys.html#sys.path) при использовании опции `-E` (если [`PyConfig.use_environment`](https://python-all.ru/3.12/c-api/init_config.html#c.PyConfig.use_environment) установлено в `0`). Это важно при встраивании Python в Windows. (Автор: Zackery Spytz в [bpo-8901](https://python-all.ru/3.12/whatsnew/3.9.html).)621- Глобальная переменная [`PyStructSequence_UnnamedField`](https://python-all.ru/3.12/c-api/tuple.html#c.PyStructSequence_UnnamedField) теперь является константой и ссылается на строковую константу. (Автор: Serhiy Storchaka в [bpo-38650](https://python-all.ru/3.12/whatsnew/3.9.html).)622- Структура `PyGC_Head` теперь непрозрачна. Она определяется только во внутреннем C API (`pycore_gc.h`). (Автор: Victor Stinner в [bpo-40241](https://python-all.ru/3.12/whatsnew/3.9.html).)623- `Py_UNICODE_COPY`, `Py_UNICODE_FILL`, `PyUnicode_WSTR_LENGTH`, `PyUnicode_FromUnicode()`, `PyUnicode_AsUnicode()`, `_PyUnicode_AsUnicode` и `PyUnicode_AsUnicodeAndSize()` помечены как устаревшие в C. Они устарели [**PEP 393**](https://python-all.ru/3.12/whatsnew/3.9.html) начиная с Python 3.3. (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.12/whatsnew/3.9.html).)624- Функция [`Py_FatalError()`](https://python-all.ru/3.12/c-api/sys.html#c.Py_FatalError) заменена макросом, который автоматически записывает имя текущей функции, если не определён макрос `Py_LIMITED_API`. (Автор: Victor Stinner в [bpo-39882](https://python-all.ru/3.12/whatsnew/3.9.html).)625- Протокол vectorcall теперь требует, чтобы вызывающая сторона передавала только строки в качестве имён ключевых аргументов. (См. [bpo-37540](https://python-all.ru/3.12/whatsnew/3.9.html) для получения дополнительной информации.)626- Детали реализации ряда макросов и функций теперь скрыты:627628  - Макрос [`PyObject_IS_GC()`](https://python-all.ru/3.12/c-api/gcsupport.html#c.PyObject_IS_GC) преобразован в функцию.629  - Макрос `PyObject_NEW()` становится псевдонимом макроса [`PyObject_New`](https://python-all.ru/3.12/c-api/allocation.html#c.PyObject_New), а макрос `PyObject_NEW_VAR()` становится псевдонимом макроса [`PyObject_NewVar`](https://python-all.ru/3.12/c-api/allocation.html#c.PyObject_NewVar). Они больше не обращаются напрямую к элементу [`PyTypeObject.tp_basicsize`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_basicsize).630  - Макрос `PyObject_GET_WEAKREFS_LISTPTR()` преобразован в функцию: макрос напрямую обращался к элементу [`PyTypeObject.tp_weaklistoffset`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset).631  - Макрос [`PyObject_CheckBuffer()`](https://python-all.ru/3.12/c-api/buffer.html#c.PyObject_CheckBuffer) преобразован в функцию: макрос напрямую обращался к элементу [`PyTypeObject.tp_as_buffer`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_as_buffer).632  - [`PyIndex_Check()`](https://python-all.ru/3.12/c-api/number.html#c.PyIndex_Check) теперь всегда объявляется как непрозрачная функция для скрытия деталей реализации: удалён макрос `PyIndex_Check()`. Макрос напрямую обращался к элементу [`PyTypeObject.tp_as_number`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_as_number).633634  (См. [bpo-40170](https://python-all.ru/3.12/whatsnew/3.9.html) для получения дополнительных сведений.)635636### Удалено637638- Макросы `PyFPE_START_PROTECT()` и `PyFPE_END_PROTECT()` из `pyfpe.h` исключены из ограниченного C API. (Автор: Victor Stinner в [bpo-38835](https://python-all.ru/3.12/whatsnew/3.9.html).)639- Слот `tp_print` структуры [PyTypeObject](https://python-all.ru/3.12/c-api/typeobj.html#type-structs) удалён. Он использовался для печати объектов в файлы в Python 2.7 и ранее. Начиная с Python 3.0, он игнорируется и не используется. (Автор: Jeroen Demeyer в [bpo-36974](https://python-all.ru/3.12/whatsnew/3.9.html).)640- Изменения в ограниченном C API (если определён макрос `Py_LIMITED_API`):641642  - Из ограниченного C API исключены следующие функции:643644    - `PyThreadState_DeleteCurrent()` (Автор: Joannah Nanjekye в [bpo-37878](https://python-all.ru/3.12/whatsnew/3.9.html).)645    - `_Py_CheckRecursionLimit`646    - `_Py_NewReference()`647    - `_Py_ForgetReference()`648    - `_PyTraceMalloc_NewReference()`649    - `_Py_GetRefTotal()`650    - Механизм trashcan, который никогда не работал в ограниченном C API.651    - `PyTrash_UNWIND_LEVEL`652    - `Py_TRASHCAN_BEGIN_CONDITION`653    - `Py_TRASHCAN_BEGIN`654    - `Py_TRASHCAN_END`655    - `Py_TRASHCAN_SAFE_BEGIN`656    - `Py_TRASHCAN_SAFE_END`657  - Следующие функции и определения перемещены во внутренний C API:658659    - `_PyDebug_PrintTotalRefs()`660    - `_Py_PrintReferences()`661    - `_Py_PrintReferenceAddresses()`662    - `_Py_tracemalloc_config`663    - `_Py_AddToAllObjects()` (специфично для сборки `Py_TRACE_REFS`)664665  (Автор: Victor Stinner в [bpo-38644](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-39542](https://python-all.ru/3.12/whatsnew/3.9.html).)666- Удалены хук `_PyRuntime.getframe` и макрос `_PyThreadState_GetFrame`, который был псевдонимом `_PyRuntime.getframe`. Они были доступны только через внутренний C API. Также удалён тип `PyThreadFrameGetter`. (Автор: Victor Stinner в [bpo-39946](https://python-all.ru/3.12/whatsnew/3.9.html).)667- Из C API удалены следующие функции. Явно вызывайте [`PyGC_Collect()`](https://python-all.ru/3.12/c-api/gcsupport.html#c.PyGC_Collect) для очистки всех свободных списков. (Авторы: Inada Naoki и Victor Stinner в [bpo-37340](https://python-all.ru/3.12/whatsnew/3.9.html), [bpo-38896](https://python-all.ru/3.12/whatsnew/3.9.html) и [bpo-40428](https://python-all.ru/3.12/whatsnew/3.9.html).)668669  - `PyAsyncGen_ClearFreeLists()`670  - `PyContext_ClearFreeList()`671  - `PyDict_ClearFreeList()`672  - `PyFloat_ClearFreeList()`673  - `PyFrame_ClearFreeList()`674  - `PyList_ClearFreeList()`675  - `PyMethod_ClearFreeList()` и `PyCFunction_ClearFreeList()`: свободные списки объектов связанных методов удалены.676  - `PySet_ClearFreeList()`: свободный список множеств удалён в Python 3.4.677  - `PyTuple_ClearFreeList()`678  - `PyUnicode_ClearFreeList()`: свободный список Unicode удалён в Python 3.3.679- Удалена функция `_PyUnicode_ClearStaticStrings()`. (Автор: Victor Stinner в [bpo-39465](https://python-all.ru/3.12/whatsnew/3.9.html).)680- Удалён `Py_UNICODE_MATCH`. Он был объявлен устаревшим с помощью [**PEP 393**](https://python-all.ru/3.12/whatsnew/3.9.html) и перестал работать с Python 3.3. Вместо него можно использовать функцию [`PyUnicode_Tailmatch()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_Tailmatch). (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.12/whatsnew/3.9.html).)681- Очищены заголовочные файлы от интерфейсов, определённых, но не имеющих реализации. Удаляемые символы публичного 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.12/whatsnew/3.9.html).)682683## Заметные изменения в Python 3.9.1684685### typing686687Поведение [`typing.Literal`](https://python-all.ru/3.12/library/typing.html#typing.Literal) было изменено в соответствии с [**PEP 586**](https://python-all.ru/3.12/whatsnew/3.9.html) и для соответствия поведению статических анализаторов типов, описанному в PEP.6886891. `Literal` теперь удаляет дубликаты параметров.6902. Проверки равенства между объектами `Literal` теперь не зависят от порядка.6913. Сравнения `Literal` теперь учитывают типы. Например, `Literal[0] == Literal[False]` ранее давало `True`. Теперь это `False`. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.6924. Объекты `Literal` теперь будут вызывать исключение [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) при сравнении на равенство, если любой из их параметров не является [хэшируемым](https://python-all.ru/3.12/glossary.html#term-hashable). Обратите внимание, что объявление `Literal` с изменяемыми параметрами не вызовет ошибку:693694   ```python695   >>> from typing import Literal696   >>> Literal[{0}]697   >>> Literal[{0}] == Literal[{False}]698   Traceback (most recent call last):699     File "<stdin>", line 1, in <module>700   TypeError: unhashable type: 'set'701   ```702703(Предложено Юрием Карабасом в [bpo-42345](https://python-all.ru/3.12/whatsnew/3.9.html).)704705### Поддержка macOS 11.0 (Big Sur) и Mac на Apple Silicon706707Начиная с версии 3.9.1, Python полностью поддерживает сборку и работу на macOS 11.0 (Big Sur) и на Mac с Apple Silicon (на базе архитектуры `ARM64`). Теперь доступна новая универсальная конфигурация сборки, `universal2`, которая позволяет изначально поддерживать как `ARM64`, так и `Intel 64` в одном наборе исполняемых файлов. Также теперь можно создавать двоичные файлы на текущих версиях macOS для развёртывания на более старых версиях macOS (проверено до 10.9), при этом некоторые функции и возможности новых ОС становятся условно доступными в зависимости от версии ОС, используемой во время выполнения («weaklinking»).708709(Авторы: Ronald Oussoren и Lawrence D’Anna в [bpo-41100](https://python-all.ru/3.12/whatsnew/3.9.html).)710711## Заметные изменения в Python 3.9.2712713### collections.abc714715[`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable) обобщённый тип теперь упрощает параметры типов, аналогично тому, как это делает [`typing.Callable`](https://python-all.ru/3.12/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.12/library/types.html#types.GenericAlias) теперь может быть унаследован, и подкласс будет возвращён при индексации типа [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable). Код, который обращается к аргументам через [`typing.get_args()`](https://python-all.ru/3.12/library/typing.html#typing.get_args) или `__args__`, должен учитывать это изменение. [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning) может быть вызвано для некорректных форм параметризации [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable), которые могли проходить незаметно в Python 3.9.1. Это [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning) станет [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) в Python 3.10. (Предложено Ken Jin в [bpo-42195](https://python-all.ru/3.12/whatsnew/3.9.html).)716717### urllib.parse718719Более ранние версии Python допускали использование как `;`, так и `&` в качестве разделителей параметров запроса в [`urllib.parse.parse_qs()`](https://python-all.ru/3.12/library/urllib.parse.html#urllib.parse.parse_qs) и [`urllib.parse.parse_qsl()`](https://python-all.ru/3.12/library/urllib.parse.html#urllib.parse.parse_qsl). Из соображений безопасности и для соответствия новым рекомендациям W3C это поведение было изменено: теперь разрешён только один ключ-разделитель, `&` по умолчанию. Это изменение также затрагивает [`cgi.parse()`](https://python-all.ru/3.12/library/cgi.html#cgi.parse) и [`cgi.parse_multipart()`](https://python-all.ru/3.12/library/cgi.html#cgi.parse_multipart), поскольку они внутренне используют затронутые функции. Дополнительные сведения см. в их документации. (Авторы: Adam Goldschmidt, Senthil Kumaran и Ken Jin в [bpo-42967](https://python-all.ru/3.12/whatsnew/3.9.html).)720721## Заметные изменения в Python 3.9.3722723Исправление безопасности изменяет поведение [`ftplib.FTP`](https://python-all.ru/3.12/library/ftplib.html#ftplib.FTP), чтобы не доверять IPv4-адресу, отправленному удалённым сервером при настройке пассивного канала данных. Вместо этого используется IP-адрес FTP-сервера. Для необычного кода, которому требуется старое поведение, установите атрибут `trust_server_pasv_ipv4_address` экземпляра FTP в `True`. (См. [gh-87451](https://python-all.ru/3.12/whatsnew/3.9.html))724725## Заметные изменения в Python 3.9.5726727### urllib.parse728729Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. Следуя спецификации WHATWG, обновляющей [**RFC 3986**](https://python-all.ru/3.12/whatsnew/3.9.html), символы ASCII новой строки `\n`, `\r` и табуляции `\t` удаляются из URL анализатором в [`urllib.parse`](https://python-all.ru/3.12/library/urllib.parse.html#module-urllib.parse), предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (См. [gh-88048](https://python-all.ru/3.12/whatsnew/3.9.html))730731## Заметная функция безопасности в 3.9.14732733Преобразование между [`int`](https://python-all.ru/3.12/library/functions.html#int) и [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) по основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызывает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для [**CVE 2020-10735**](https://python-all.ru/3.12/whatsnew/3.9.html). Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или API [`sys`](https://python-all.ru/3.12/library/sys.html#module-sys). См. документацию [ограничения длины строкового представления целых чисел](https://python-all.ru/3.12/library/stdtypes.html#int-max-str-digits). Лимит по умолчанию – 4300 цифр в строковом представлении.734735## Заметные изменения в 3.9.17736737### tarfile738739- Методы извлечения в [`tarfile`](https://python-all.ru/3.12/library/tarfile.html#module-tarfile) и [`shutil.unpack_archive()`](https://python-all.ru/3.12/library/shutil.html#shutil.unpack_archive) получили новый аргумент *filter*, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. [Extraction filters](https://python-all.ru/3.12/library/tarfile.html#tarfile-extraction-filter). В Python 3.12 использование без аргумента *filter* вызовет [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning). В Python 3.14 значение по умолчанию будет изменено на `'data'`. (Автор: Petr Viktorin в [**PEP 706**](https://python-all.ru/3.12/whatsnew/3.9.html).)740