Выпуск мовы праграмавання 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: макс.

    Магчыма распакаванне аб'ектаў, картэжаў, спісаў і адвольных паслядоўнасцяў для прывязкі зменных на аснове наяўных значэнняў. Дапускаецца вызначэнне ўкладзеных шаблонаў, выкарыстанне ў шаблоне дадатковых умоў «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") Y={y}») case Point(x, 0): print(f»X={x}») case Point(): print(«Somewhere else») case _: print(«No 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, 0, 1 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 (most recent 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]' # typ 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

Дадаць каментар