Python 3.8

Python 3.8.0 (финальная версия) был выпущен 14 октября 2019 года. Возможности версии 3.8 определены в PEP 569, а подробное описание изменений можно найти в What’s New in Python 3.8.

Возможности

Статус

PEP 570

Только позиционные аргументы

PEP 572

Выражения присваивания

Завершено

PEP 574

Протокол pickle 5 с внеполосными данными

PEP 578

Хуки аудита времени выполнения

PEP 587

Конфигурация инициализации Python

PEP 590

Vectorcall: быстрый протокол вызова для CPython

Разное

f-строки поддерживают = для самодокументирующихся выражений и отладки

Завершено

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

Инструкция continue была недопустима в блоке finally из-за проблемы в реализации. В Python 3.8 это ограничение было снято

Завершено

Типы bool, int и fractions.Fraction теперь имеют метод as_integer_ratio(), как у float и decimal.Decimal

Конструкторы int, float и complex теперь будут использовать специальный метод __index__(), если он доступен, а соответствующий метод __int__(), __float__() или __complex__() недоступен

Добавлена поддержка экранирования N{name} в регулярных выражениях

Dict и dictviews теперь можно итерировать в обратном порядке вставки с помощью reversed()

Синтаксис, допустимый для имён именованных аргументов в вызовах функций, был дополнительно ограничен. В частности, f((keyword)=arg) больше не допускается

Обобщённая распаковка итерируемых объектов в инструкциях yield и return больше не требует охватывающих скобок

Когда в коде вроде [(10, 20) (30, 40)] пропущена запятая, компилятор отображает SyntaxWarning с полезной подсказкой

Арифметические операции между подклассами datetime.date или datetime.datetime и объектами datetime.timedelta теперь возвращают экземпляр подкласса, а не базового класса

Когда интерпретатор Python прерывается Ctrl-C (SIGINT) и возникающее исключение KeyboardInterrupt не перехватывается, процесс Python теперь завершается через сигнал SIGINT или с корректным кодом выхода, так что вызывающий процесс может определить, что он завершился из-за Ctrl-C

Некоторые продвинутые стили программирования требуют обновления объекта types.CodeType для существующей функции

Для целых чисел трёхаргументная форма функции pow() теперь допускает отрицательный показатель степени в случае, когда основание взаимно просто с модулем

Включения словарей были согласованы с литералами словарей, так что сначала вычисляется ключ, а затем значение

Метод object.__reduce__() теперь может возвращать кортеж длиной от двух до шести элементов

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

asyncio

asyncio.run() перешёл из предварительного в стабильный API

Завершено

Запуск python -m asyncio запускает нативно асинхронный REPL

Исключение asyncio.CancelledError теперь наследуется от BaseException, а не от Exception, и больше не наследуется от concurrent.futures.CancelledError

Завершено

Добавлен asyncio.Task.get_coro() для получения обёрнутой корутины внутри asyncio.Task

Задачи asyncio теперь можно именовать, передавая именованный аргумент name в asyncio.create_task() или метод цикла событий create_task(), либо вызывая метод set_name() у объекта задачи

Добавлена поддержка Happy Eyeballs в asyncio.loop.create_connection(). Для задания поведения были добавлены два новых параметра: happy_eyeballs_delay и interleave.

gc

get_objects() теперь может принимать необязательный параметр generation, указывающий поколение, из которого нужно получить объекты. (Однако обратите внимание, что хотя gc является встроенным, get_objects() не реализован для MicroPython)

math

Добавлена новая функция math.dist() для вычисления евклидова расстояния между двумя точками

Расширена функция math.hypot() для обработки нескольких измерений

Добавлена новая функция math.prod() как аналог sum(), которая возвращает произведение «начального» значения (по умолчанию: 1) на итерируемый набор чисел

Добавлены две новые комбинаторные функции math.perm() и math.comb()

Добавлена новая функция math.isqrt() для вычисления точных целочисленных квадратных корней без преобразования в число с плавающей точкой

Функция math.factorial() больше не принимает аргументы, не являющиеся int-подобными

Завершено

sys

Добавлена новая функция sys.unraisablehook(), которую можно переопределить для управления тем, как обрабатываются «невозбудимые исключения»