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
