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() тепер дозволяє від’ємний показник степеня, якщо основа взаємно проста з модулем

Включення dict синхронізовані з літералами dict так, що ключ обчислюється першим, а значення — другим

Метод 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() більше не приймає аргументи, що не є цілочисельними

Реалізовано

sys

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