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

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

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

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

  • Реалізовані оператори «match» та «case» для порівняння зі зразком, які дозволяють покращити читання коду, спростити зіставлення довільних Python-об'єктів та підвищити надійність коду завдяки можливості розширеної статичної перевірки типів. Реалізація багато в чому нагадує оператор «match», який надається у мовах Scala, Rust і F#, який виконує порівняння результату виконання зазначеного виразу зі списком зразків, перерахованих у блоках з урахуванням оператора «case».

    def http_error(status): match status: case 400: return "Bad request" case 401|403|404: return "Неможливо" case 418: return "I'm a teapot" case _: return "Something else"

    Можливе розпакування об'єктів, кортежів, списків та довільних послідовностей для прив'язки змінних на основі наявних значень. Допускається визначення вкладених шаблонів, використання у шаблоні додаткових умов «if», застосування масок («[x, y, *rest]»), мапінгу зв'язок ключ/значення (наприклад, {«bandwidth»: b, «latency»: l} для вилучення значень "bandwidth" і "latency" зі словника), вилучення підшаблонів (оператор ":="), використання іменованих констант у шаблоні. У класах можливе налаштування поведінки зі зіставлення з допомогою методу «__match__()».

    з dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print(«Origin») case Point(0, y): print(f» Y={y}») case Point(x, 0): print("X={x}") case Point(): print("Somewhere else") case _: print("Not a point") match point: case Point(x, y) if x == y: print(f"Y=X at {x}") case Point(x, y): print(f"Not on the diagonal") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print(«I see red!») case GREEN: print(«Grass is green») case BLUE: print(«I'm feeling the blues :(«)

  • Надано можливість використання круглих дужок в операторі with для рознесення на кілька рядків визначення колекції контекстних менеджерів. У тому числі дозволено залишати кому після фінального контекстного менеджера в групі: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
  • Поліпшено інформування про місцезнаходження у коді помилок, пов'язаних із незакритими фігурними дужками та лапками у рядкових літералах. Наприклад, при незакритій фігурній дужці замість інформування про помилку синтаксису в слідом конструкції, що вказує тепер підсвічує відкривається фігурну дужку і інформує про відсутність закриває блоку. File «example.py», line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: '{' was never closed

    Додані додаткові спеціалізовані повідомлення про помилки синтаксису: відсутність символу «:» перед блоком та в словниках, не виділення кортежу дужками, відсутність коми у списках, вказівка ​​блоку «try» без «except» та «finally», використання «=» замість «= =» у порівняннях, вказівка ​​*-виразів у f-рядках. Крім того, забезпечено виділення всього проблемного виразу, а не тільки його початку, і більш явне інформування про контекст помилок, пов'язаних із неправильним розміщенням відступів. >>> def foo(): … if lel: … x = 2 File « », line 3 x = 2 ^ IndentationError: expected an indented block after 'if' statement in line 2

    У помилках, викликаних друкарськими помилками в назві атрибутів та імен змінних у функції, забезпечено виведення рекомендації з правильним ім'ям. >>> collections.namedtoplo Traceback (більше останній call last): File « », line 1, in AttributeError: module 'collections' не має attribute 'namedtoplo'. Did you mean: namedtuple?

  • Для налагоджувальних інструментів та профільників забезпечено вказівку у подіях трасування точних номерів рядків виконаного коду.
  • Додано налаштування sys.flags.warn_default_encoding для виведення попередження про потенційні помилки, пов'язані з обробкою в TextIOWrapper та open() файлів у кодуванні UTF-8 без явної вказівки опції 'encoding=utf-8' (за замовчуванням використовується кодування ASCII). Також у новому випуску надано можливість вказати значення 'encoding="locale"' для встановлення кодування на основі поточної локалі.
  • У модуль typing, що надає засоби для завдання інструкцій типів, додано новий оператор, що дозволяє використовувати синтаксис «X | Y» для вибору одного з типів (тип X або Y). def square(number: int | float) -> int | float: return number ** 2 еквівалентно раніше підтримуваної конструкції: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • У модуль typing доданий оператор Concatenate та змінна ParamSpec, які дозволяють передати додаткову інформацію для статичної перевірки типів під час використання Callable. Модуль typing також додав спеціальні значення TypeGuard для анотування функцій захисту типів і TypeAlias ​​для явного визначення псевдоніма типу. StrCache: TypeAlias ​​= 'Cache[str]' # a type alias
  • У функції zip() реалізований необов'язковий прапор «strict», при вказівці якого здійснюється перевірка на однакову довжину аргументів, що перебираються. >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Traceback (most recent call last ): … ValueError: zip() argument 2 is longer than argument 1
  • Запропоновано нові вбудовані функції aiter() та anext() з реалізацією асинхронних аналогів функцій iter() та next().
  • На 30-40% прискорено роботу конструкторів str(), bytes() і bytearray() під час роботи з дрібними об'єктами.
  • Скорочено кількість операцій імпорту в модулі runpy. Команда «python3 -m ім'я_модуля» тепер запускається в середньому в 1.4 рази швидше за рахунок скорочення модулів, що імпортуються, з 69 до 51.
  • В інструкції LOAD_ATTR задіяно механізм кешування окремих опкодів, який дозволив прискорити роботу із звичайними атрибутами до 36%, а зі слотами до 44%.
  • Під час складання Python з опцією «enable-optimizations» тепер включається режим «-fno-semantic-interposition», що дозволяє в порівнянні зі збіркою з опцією «enable-shared» прискорити роботу інтерпретатора до 30%.
  • У модулях hashlib і ssl додано підтримку OpenSSL 3.0.0 і припинено підтримку версій OpenSSL старше 1.1.1.
  • Видалено старий парсер, на зміну якому в минулій гілці прийшов парсер PEG (Parsing Expression Grammar). Видалено модуль formatter. З API asyncio видалено параметр loop. Видалено методи, раніше оголошені застарілими. Видалено функції Py_UNICODE_str*, що маніпулюють рядками Py_UNICODE*.
  • Оголошено застарілим модуль distutils, який запланований для видалення Python 3.12. Замість distutils рекомендовано використовувати модулі setuptools, packaging, platform, shutil, subprocess та sysconfig. До числа застарілих та намічених для видалення переведено структуру wstr у PyUnicodeObject.

Джерело: opennet.ru

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