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 за замовчуванням завжди буферизується по рядках

Примітки