Pas një viti zhvillimi, është paraqitur një lëshim i rëndësishëm i gjuhës së programuese Python 3.10. Kjo degë do të mbështetet për njëzet muaj, pas së cilës do të formohen rregullime për disa vite të tjera për të hequr dobësitë.
Njëkohësisht ka filluar testimi alfa i degës Python 3.11 (sipas skedarit të ri të zhvillimit, puna mbi degën e re fillon pesë muaj para lëshimit të degës së mëparshme dhe në momentin e lëshimit të radhës arrin në fazën e testimit alfa). Dega Python 3.11 do të jetë në fazën e lëshimeve alfa për shtatë muaj, gjatë të cilëve do të shtohen mundësi të reja dhe do të rregullohen defekte. Pas kësaj, do të ketë një periudhë prej tre muajsh për testimin e versioneve beta, gjatë së cilës do të ndalohet shtimi i mundësive të reja dhe përqendrimi do të jetë në rregullimin e defekteve. Dy muajt e fundit para lëshimit, dega do të jetë në fazën e kandidatëve për lëshim, ku do të kryhet stabilizimi i fundit.
Ndër novacionet e shtuar në Python 3.10 janë:
- Janë realizuar operatorët «match» dhe «case» për përputhjen me modelin, të cilët lejojnë përmirësimin e lexueshmërisë së kodit, thjeshtimin e përputhjes së objekteve të rastit Python dhe rritjen e qëndrueshmërisë së kodit përmes mundësisë së kontrollit të avancuar të tipeve. Realizimi në shumë mënyra i ngjan operatorit «match» të ofruar nga gjuhët Scala, Rust dhe F#, i cili bën krahasimin e rezultatit të ekzekutimit të shprehjes së caktuar me një listë modelesh, të renditur në blloqet bazuar në operatorin «case».
def http_error(status): match status: case 400: return «Kërkesë e gabuar» case 401|403|404: return «Nuk lejohet» case 418: return «Jam një teapot» case _: return «Diçka tjetër»
Ka mundësi për të shpërbërë objekte, tuple, lista dhe sekuenca të rastësishme për lidhjen e variablave në bazë të vlerave ekzistuese. Lejohet përcaktimi i shablloneve të ngulitura, përdorimi i kushteve shtesë "nëse" në shabllon, aplikimi i maskave ("[x, y, *rest]"), mapimi i lidhjeve çelës/vlerë (për shembull, {"bandwidth": b, "latency": l} për të nxjerrë vlerat "bandwidth" dhe "latency" nga një fjalor), nxjerrja e nënshablloneve (operatori ":=") dhe përdorimi i konstantave të emëruara në shabllon. Në klasa është e mundur të konfigurohet sjellja gjatë përputhjes me metodën "__match__()".
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Origjina") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Diku tjetër") case _: print("Nuk është një pikë") match point: case Point(x, y) if x == y: print(f"Y=X në {x}") case Point(x, y): print(f"Nuk është në diagonale") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print("Shoh të kuqe!") case GREEN: print("Bar është i gjelbër") case BLUE: print("Jam duke u ndier keq :( ")
- Është ofruar mundësia për të përdorur kllapa të rrethuar në operatorin with për të shpërndarë përcaktimin e koleksioneve të menaxherëve të kontekstit në disa rreshta. Në këtë përfshihet leja për të lënë një presje pas menaxherit të fundit të kontekstit në grup: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- Është përmirësuar informimi mbi vendndodhjen në kod të gabimeve që lidhen me kllapat e hapura dhe thonjëzat në literat string. Për shembull, në rastin e një kllape të hapur, në vend që të informohet për një gabim sintaksor në pasardhësin e saj, treguesi tani thekson kllapën e hapur dhe informon për mungesën e bllokut të mbyllur. File "example.py", line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: ‘{‘ nuk u mbyll kurrë
Janë shtuar mesazhe të specializuara për gabimet sintaksore: mungesa e simbolit ":" para bllokut dhe në fjalorë, mosshënjimi i tuple me kllapa, mungesa e presjeve në lista, specifikimi i bllokut "try" pa "except" dhe "finally", përdorimi i "=" në vend të "==" në krahasime, specifikimi i *-shprehjeve në f-tringje. Për më tepër, është siguruar shënimi i gjithë shprehjes problematike, dhe një informim më i qartë mbi kontekstin e gabimeve që lidhen me renditjen e gabuar të hapësirave. >>> def foo(): ... if lel: ... x = 2 File "", line 3 x = 2 ^ IndentationError: pritej një bllok i indentuar pas deklaratës 'if' në line 2
Në gabimet që shkaktohen nga shkrimi i gabuar të emrave të atributeve dhe variablave në funksion, është siguruar dalja e një rekomandimi me emrin e saktë. >>> collections.namedtoplo Traceback (most recent call last): File "", line 1, in AttributeError: moduli 'collections' nuk ka atribut 'namedtoplo'. A dëshiron të thua: namedtuple?
- Për mjetet e debagimit dhe profiluesit është siguruar shënimi në ngjarjet e gjurmimit të numrave të saktë të rreshtave të kodit të ekzekutuar.
- Është shtuar konfigurimi sys.flags.warn_default_encoding për të nxjerrë një paralajmërim mbi gabime të mundshme lidhur me përpunimin në TextIOWrapper dhe open() të skedave në kodimin UTF-8 pa specifikuar qartë opsionin 'encoding="utf-8"' (me të drejtë përdoret kodimi ASCII). Gjithashtu, në lëshimin e ri është ofruar mundësia e specifikimit të vlerës 'encoding="locale"' për të vendosur kodimin në bazë të lokalitetit aktual.
- Në modulatin typing, i cili ofron mjete për përcaktimin e anotarive të tipeve, është shtuar një operator i ri, i cili lejon përdorimin e sintaksës "X | Y" për të zgjedhur një nga tipet (tipi X ose tipi Y). def square(number: int | float) -> int | float: return number ** 2 ekvivalent me konstruktin më herët të mbështetur: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- Në modulatin typing është shtuar operatori Concatenate dhe variabla ParamSpec, të cilat lejojnë kalimin e informacionit shtesë për verifikimin statik të tipeve kur përdoret Callable. Në modulatin typing gjithashtu janë shtuar vlera speciale TypeGuard për anotarimin e funksioneve të mbrojtjes së tipeve dhe TypeAlias për përcaktimin e qartë të pseudonimit të tipit. StrCache: TypeAlias = 'Cache[str]' # një pseudonim i tipit
- Funksioni zip() implementon një flag opsionale "strict", e cila, kur specifikohet, siguron kontrollin e gjatësi së njëjtë të argumenteve që po iterohen. >>> 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 është më e gjatë se argument 1
- Sot janë propozuar funksionet e reja të integruara aiter() dhe anext() me implementimin e analogëve asinkronë të funksioneve iter() dhe next().
- Performanca e konstruktorëve str(), bytes() dhe bytearray() është rritur me 30-40% gjatë punës me objekte të vogla.
- Numri i operacioneve të importimit në modulën runpy është reduktuar. Komanda “python3 -m emri_i_modulit” tani ekzekutohet në mesatarisht 1.4 herë më shpejt për shkak të reduktimit të moduleve të importuara nga 69 në 51.
- Në instrukcionin LOAD_ATTR është aktivizuar mekanizmi i caching për opcode të veçantë, i cili ka lejuar përshpejtimin e punës me atributet normale deri në 36%, dhe me slotet deri në 44%.
- Kur buildohet Python me opsionin “—enable-optimizations”, tani aktivizohet moda “-fno-semantic-interposition”, e cila lejon, krahasuar me ndërtimin me opsionin “—enable-shared”, të përshpejtojë punën e interpretuesit deri në 30%.
- Në modulet hashlib dhe ssl është shtuar mbështetje për OpenSSL 3.0.0 dhe është ndërprerë mbështetje për versionet e OpenSSL më të vjetra se 1.1.1.
- Parseri i vjetër është eliminuar, i cili u zëvendësua nga parseri PEG (Parsing Expression Grammar) në degën e kaluar. Moduli formatter është eliminuar. Nga API asyncio është eliminuar parametri loop. Janë eliminuar metodat, të cilat ishin shpallur të vjetra më parë. Funksionet Py_UNICODE_str*, që manipulojnë me stringjet Py_UNICODE*, janë eliminuar.
- Moduli distutils është shpallur i vjetruar, i cili është planifikuar për t’u eliminua në Python 3.12. Në vend të distutils, rekomandohet përdorimi i moduleve setuptools, packaging, platform, shutil, subprocess dhe sysconfig. Strukturën wstr në PyUnicodeObject e kaluan në kategorinë e vjetruar dhe të planifikuar për tu eliminuar.
Burimi: opennet.ru
