Випуск мови програмування Python 3.11

Після року опубліковано значний випуск мови програмування Python 3.11. Нова гілка підтримуватиметься протягом півтора року, після чого ще три з половиною роки для неї формуватимуться виправлення з усуненням уразливостей.

Одночасно почалося альфа-тестування гілки Python 3.12 (відповідно до нового графіка розробки робота над новою гілкою починається за п'ять місяців до релізу попередньої гілки і до моменту чергового релізу досягає стадії альфа-тестування). Гілка Python 3.12 перебуватиме на стадії альфа-випусків протягом семи місяців, під час яких будуть додаватися нові можливості та виправлятися помилки. Після цього протягом трьох місяців буде проводитися тестування бета-версій, під час якого додавання нових можливостей буде заборонено і вся увага приділятиметься виправленню помилок. Останні два місяці перед релізом гілка перебуватиме на стадії кандидата у релізи, на якій буде виконано фінальну стабілізацію.

Серед доданих до Python 3.11 нововведень:

  • Проведено значну роботу з оптимізації продуктивності. У нову гілку включені зміни, пов'язані з прискоренням та inline-розгортанням виклику функцій, застосуванням швидких інтерпретаторів типових операцій (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), а також оптимізаціями, підготовленими проектами Cinder та HotPy. Залежно від виду навантаження спостерігається приріст швидкості виконання коду на 10-60%. У середньому продуктивність при проходженні тестового набору pyperformance збільшилася на 25%.

    Перероблено механізм кешування байткоду, що дозволило скоротити час запуску інтерпретатора на 10-15%. Об'єкти з кодом і байткод тепер статично розміщуються інтерпретатором, що дало змогу виключити стадії демаршалінгу вилученого з кешу байткоду та перетворення об'єктів з кодом для розміщення динамічної пам'яті.

  • При відображенні трасування викликів у діагностичних повідомленнях забезпечено виведення інформації про вираз, через який виникла помилка (раніше підсвічувалася лише рядок без деталізації, яка саме частина рядка стала причиною помилки). Розширену інформацію про трасування також можна отримати через API та використовувати для зіставлення окремих інструкцій байткоду з конкретною позицією у вихідному коді, використовуючи метод codeobject.co_positions() або функцію C API PyCode_Addr2Location(). Зміна істотно спрощує налагодження проблем, пов'язаних із вкладеними об'єктами словників, множинними викликами функцій та складними арифметичними виразами. Traceback (останній останній call): File «calculation.py», line 54, в result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
  • Додано підтримку груп винятків, що дають програмі можливість генерувати та обробляти відразу кілька різних винятків одночасно. Для групування кількох винятків та їхнього спільного виклику запропоновано нові типи винятків ExceptionGroup та BaseExceptionGroup, а для виділення окремих винятків із групи додано вираз «except*».
  • До класу BaseException додано метод add_note(), що дозволяє прикріпити текстову примітку до виключення, наприклад, додати контекстну інформацію, недоступну під час генерації винятку.
  • Доданий спеціальний тип Self, який представляє поточний закритий клас. Self може застосовуватися для анотування методів, що повертають екземпляр свого класу, простіше, ніж при використанні TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Доданий спеціальний тип LiteralString, який може включати лише рядкові літерали, сумісні з типом LiteralString (тобто голі рядки та рядки з типом LiteralString, але не довільні та не комбіновані рядки з типом str). Тип LiteralString можна використовувати для обмеження передачі функцій рядкових аргументів, довільна підстановка частин рядків, у яких може призвести до вразливостей, наприклад, при формуванні рядків для SQL-запитів або shell-команд. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query(«SELECT * FROM students») # ok run_query(literal_string) # ok run «SELECT * FROM » + literal_string) # ok run_query(arbitrary_string) # Помилка run_query( # Помилка f»SELECT * FROM students WHERE name = {arbitrary_string}» )
  • Доданий тип TypeVarTuple, що дозволяє використовувати варіативні дженерики, на відміну від TypeVar, що охоплюють не один тип, а довільне число типів.
  • У стандартну бібліотеку включено модуль tomllib з функціями для аналізу формату TOML.
  • Надано можливість позначення окремих елементів типизованих словників (TypedDict) мітками Required і NotRequired для визначення обов'язкових і необов'язкових полів (за замовчуванням усі оголошені поля обов'язкові для заповнення, якщо параметр total не виставлений у значення False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (поле year необов'язкове) m3: Movie = {«year»: 2022} # Помилка, не заповнене обов'язкове поле title)
  • У модуль asyncio додано клас TaskGroup з реалізацією асинхронного контекстного менеджера, який очікує завершення групи завдань. Додавання завдань у групу здійснюється з допомогою методу create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…))
  • Додано декоратор класів, методів та функцій @dataclass_transform, при вказівці якого система перевірки статичних типів трактує об'єкт, як при використанні декоратора @dataclasses.dataclass. У прикладі нижче клас CustomerModel під час перевірки типів буде оброблений за аналогією з класом з декоратором @dataclasses.dataclass, тобто. як метод __init__, що допускає змінні id і name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
  • У регулярних виразах додано можливість використання атомарного угруповання ((?>…)) та ревнивих (possessive) квантифікаторів (*+, ++, ?+, {m,n}+).
  • Додано опцію командного рядка «-P» та змінну оточення PYTHONSAFEPATH для відключення автоматичного прикріплення до sys.path потенційно небезпечних файлових шляхів.
  • Значно покращено утиліту py.exe для платформи Windows, в якій реалізовано підтримку синтаксису «-V: / " на додаток до "- . ».
  • Багато макроси в C API перетворені на звичайні або статичні inline-функції.
  • Оголошені застарілими і будуть видалені у випуску Python 3.13 модулі uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossa Вилучено функції PyUnicode_Encode*.

Джерело: opennet.ru

Додати коментар або відгук