Выпуск мовы праграмавання 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(). Змена істотна спрашчае адладку праблем, злучаных з укладзенымі аб'ектамі слоўнікаў, множнымі выклікамі функцый і складанымі арыфметычнымі выразамі. Працоўнае месца (пераважна нядаўна call last): File "calculation.py", line 54, у выніку = (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(…)) print(«Both tasks
  • Дададзены дэкаратар класаў, метадаў і функцый @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

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