Python 3.9

Python 3.9.0 (финальная версия) был выпущен 5 октября 2020 года. Возможности версии 3.9 определены в PEP 596, а подробное описание изменений можно найти в What’s New in Python 3.9

Возможности

Статус

PEP 573

Быстрый доступ к состоянию модуля из методов типов C-расширений

Неактуально

PEP 584

Операторы объединения, добавленные в dict

Завершено [1]

PEP 585

Аннотации типов с обобщениями в стандартных коллекциях

PEP 593

Гибкие аннотации функций и переменных

PEP 602

CPython переходит на годичный цикл выпусков. Вместо годичного — стремление к двухмесячному циклу выпусков

Неактуально

PEP 614

Смягчение грамматических ограничений на декораторы

PEP 615

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

PEP 616

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

PEP 617

CPython теперь использует новый парсер на основе PEG

Неактуально

Прочие изменения языка:

__import__() теперь возбуждает ImportError вместо ValueError

Завершено

Python теперь получает абсолютный путь к имени файла скрипта, указанному в командной строке (например: python3 script.py): атрибут __file__ модуля __main__ стал абсолютным путём, а не относительным

По умолчанию, для лучшей производительности, аргумент errors проверяется только при первой ошибке кодирования/декодирования, а аргумент encoding иногда игнорируется для пустых строк

«».replace(«», s, n) теперь возвращает s вместо пустой строки для всех ненулевых n. Теперь это согласуется с «».replace(«», s)

Любое допустимое выражение теперь может использоваться в качестве декоратора. Ранее грамматика была гораздо более ограничивающей

Параллельный запуск aclose() / asend() / athrow() теперь запрещён, а ag_running теперь отражает фактический статус выполнения асинхронного генератора

Непредвиденные ошибки при вызове метода __iter__ больше не маскируются TypeError в операторе in и функциях contains(), indexOf() и countOf() модуля operator

Лямбда-выражения без скобок больше не могут быть частью выражения в условии if во включениях и генераторных выражениях

Изменения во встроенных модулях:

asyncio

Из-за серьёзных проблем с безопасностью параметр reuse_address функции asyncio.loop.create_datagram_endpoint() больше не поддерживается

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

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

добавлена новая coroutine asyncio.to_thread()

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

asyncio теперь возбуждает TyperError при вызове несовместимых методов с сокетом ssl.SSLSocket

gc

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

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

math

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

Добавлена math.lcm(): возвращает наименьшее общее кратное указанных аргументов

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

Добавлена math.ulp(): возвращает значение младшего значащего бита числа с плавающей точкой

os

Открыты доступные специфичные для Linux os.pidfd_open() и os.P_PIDFD

Функция os.unsetenv() теперь также доступна в Windows

Завершено

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

Завершено

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

random

Добавлен новый метод random.Random.randbytes: генерирует случайные байты

sys

Добавлен новый атрибут sys.platlibdir: имя специфичного для платформы каталога библиотек

Ранее sys.stderr был блочно-буферизованным в неинтерактивном режиме. Теперь stderr по умолчанию всегда построчно буферизован

Примечания