Pas pas një vit zhvillimi, është publikuar një version i rëndësishëm i gjuhës së programimit Python 3.11. Një dege e re do të mbështetet për një vit e gjysmë, pas së cilës do të formohen rregullime për të përballuar dobësitë për tre vitet e ardhshme.
Njëkohësisht, filloi testi alfa i degës Python 3.12 (sipas një grafiku të ri zhvillimi, puna mbi degen e re fillon pesë muaj para publikimit të degës së mëparshme dhe arrin fazën e testeve alfa njëherësh me publikimin e radhës). Dega Python 3.12 do të jetë në fazën e publikimeve alfa për shtatë muaj, gjatë së cilave do të shtohen funksionalitete të reja dhe do të korrigjohen defekte. Pas kësaj, për tre muaj do të zhvillohet testi i versioneve beta, gjatë të cilit shtimi i funksionaliteteve të reja do të ndalohet dhe gjithë vëmendja do t'i kushtohet rregullimeve të defekteve. Dy muajt e fundit para publikimit, dega do të jetë në fazën e kandidatëve për publikim, ku do të kryhet stabilizimi përfundimtar.
Mes risive të sjella në Python 3.11 janë:
- ĂshtĂ« bĂ«rĂ« njĂ« punĂ« e madhe nĂ« optimizimin e performancĂ«s. Dega e re pĂ«rfshin ndryshime qĂ« lidhen me pĂ«rshpejtimin dhe implementimin inline tĂ« thirrjeve tĂ« funksioneve, aplikimin e interpretimeve tĂ« shpejta pĂ«r operacionet tipike (x+x, x*x, x-x, a[i], a[i] = z, f(arg), C(arg), o.method(), o.attr = z, *seq), si dhe optimizime tĂ« pĂ«rgatitura nga projektet Cinder dhe HotPy. NĂ« varĂ«si tĂ« llojit tĂ« ngarkesĂ«s, Ă«shtĂ« vĂ«rejtur njĂ« rritje e shpejtĂ«sisĂ« sĂ« ekzekutimit tĂ« kodit nga 10-60%. NĂ« mesatare, performanca gjatĂ« kalimit nĂ« grupin e testeve pyperformance Ă«shtĂ« rritur me 25%.
ĂshtĂ« rishikuar mekanizmi i caching tĂ« bytecode, çka ka lejuar tĂ« reduktohet koha e nisjes sĂ« interpretuesit me 10-15%. Objektet me kod dhe bytecode tani shfaqen statikisht nga interpretuesi, çka ka mundĂ«suar pĂ«rjashtimin e fazave tĂ« demarshaling tĂ« bytecode tĂ« nxjerrĂ« nga cache dhe transformimin e objekteve me kod pĂ«r vendosje nĂ« memorie dinamike.
- Kur shfaqet gjurmimi i thirrjeve në mesazhet diagnostikuese, është siguruar tregimi i informacionit mbi shprehjen që shkaktoi gabimin (më parë ishte ndriçuar vetëm rreshti pa detaje, se cila pjesë e rreshtit ishte shkaku i gabimit). Informacioni i zgjeruar mbi gjurmimin gjithashtu mund të merret nëpërmjet API-së dhe të përdoret për të përputhur instrukcionet e veçanta të bytecode-it me pozita specifike në kodin burimor, duke përdorur metodën codeobject.co_positions() ose funksionin C API PyCode_Addr2Location(). Ky ndryshim e thjeshton ndjeshëm depurimin e problemeve të lidhura me objektet e përfshira, thirrjet e shumta të funksioneve dhe shprehjet komplekse aritmetike. Traceback (most recent call last): File «calculation.py», line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r grupet e pĂ«rjashtimeve, duke i dhĂ«nĂ« programit mundĂ«sinĂ« tĂ« gjenerojĂ« dhe tĂ« trajtojĂ« njĂ«kohĂ«sisht disa pĂ«rjashtime tĂ« ndryshme. PĂ«r grupimin e disa pĂ«rjashtimeve dhe thirrjen e tyre sĂ« bashku janĂ« propozuar lloje tĂ« reja pĂ«rjashtimesh ExceptionGroup dhe BaseExceptionGroup, dhe pĂ«r tĂ« ndarĂ« pĂ«rjashtimet e veçanta nga grupi Ă«shtĂ« shtuar shprehja «except*».
- Në klasën BaseException është shtuar metoda add_note(), e cila lejon lidhjen e një shënimi tekstual me përjashtimin, për shembull, duke shtuar informacion kontekstual që nuk është i aksesueshëm gjatë gjenerimit të përjashtimit.
- ĂshtĂ« shtuar njĂ« lloj i veçantĂ« Self, qĂ« pĂ«rfaqĂ«son klasĂ«n e mbyllur aktuale. Self mund tĂ« pĂ«rdoret pĂ«r tĂ« anotuar metodat qĂ« kthejnĂ« njĂ« instancĂ« tĂ« klasĂ«s sĂ« tyre, nĂ« njĂ« mĂ«nyrĂ« mĂ« tĂ« thjeshtĂ« sesa duke pĂ«rdorur TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- ĂshtĂ« shtuar njĂ« lloj i veçantĂ« LiteralString, i cili mund tĂ« pĂ«rfshijĂ« vetĂ«m literale string, qĂ« janĂ« tĂ« pajtueshme me llojin LiteralString (dmth. string tĂ« papĂ«rpunuara dhe string me lloj LiteralString, por jo string tĂ« rastĂ«sishme ose tĂ« kombinuara me lloj str). Lloji LiteralString mund tĂ« pĂ«rdoret pĂ«r tĂ« kufizuar kalimin e argumenteve string nĂ« funksione, ku ndonjĂ« zĂ«vendĂ«sim i rastĂ«sishĂ«m i pjesĂ«ve tĂ« string mund tĂ« çojĂ« nĂ« dobĂ«si, pĂ«r shembull, gjatĂ« formimit tĂ« string pĂ«r kĂ«rkesat SQL ose komandat 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_query(«SELECT * FROM » + literal_string) # ok run_query(arbitrary_string) # Gabim run_query( # Gabim f»SELECT * FROM students WHERE name = {arbitrary_string}» )
- ĂshtĂ« shtuar lloji TypeVarTuple, i cili lejon pĂ«rdorimin e dhenĂ«ve variativĂ«, ndryshe nga TypeVar qĂ« mbulon jo njĂ« lloj, por njĂ« numĂ«r tĂ« rastĂ«sishĂ«m llojesh.
- Në bibliotekën standarde është përfshirë moduli tomllib me funksione për analizimin e formatit TOML.
- ĂshtĂ« mundĂ«sia pĂ«r tĂ« etiketuar elemente tĂ« veçanta tĂ« fjalorĂ«ve tĂ« tipizuara (TypedDict) me etiketat Required dhe NotRequired pĂ«r tĂ« pĂ«rcaktuar fushat e detyrueshme dhe jo tĂ« detyrueshme (me tĂ« dhĂ«na tĂ« parazgjedhura, tĂ« gjitha fushat e shpallura janĂ« tĂ« detyrueshme pĂ«r t'u mbushur, nĂ«se parametri total nuk Ă«shtĂ« vendosur nĂ« vlerĂ«n False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars"} # OK (fusha year Ă«shtĂ« e opcional) m3: Movie = {"year": 2022} # Gabim, fusha e detyrueshme title nuk Ă«shtĂ« mbushur)
- NĂ« modulĂ«n asyncio Ă«shtĂ« shtuar klasa TaskGroup me implementimin e menaxherit tĂ« kontekstit asinkron, qĂ« pret pĂ«r pĂ«rfundimin e njĂ« grupi detyrash. Shtimi i detyrave nĂ« grup bĂ«het me metodĂ«n create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(âŠ)) task2 = tg.create_task(another_coro(âŠ)) print("TĂ« dy detyrat tani janĂ« pĂ«rfunduar.")
- I është shtuar një dekorator klasave, metodave dhe funksioneve @dataclass_transform, me të cilin sistemi i kontrollit të tipeve statike e interpreton objektin, si kur përdoret dekoratori @dataclasses.dataclass. Në shembullin më poshtë, klasa CustomerModel gjatë kontrollit të tipeve do të trajtohet në përputhje me klasën me dekorator @dataclasses.dataclass, domethënë si e tillë që ka metodën __init__, që pranon variablat id dhe name. @dataclass_transform() class ModelBase: ⊠class CustomerModel(ModelBase): id: int name: str
- NĂ« shprehjet e rregullta Ă«shtĂ« e mundur tĂ« pĂ«rdoret grupimi atomik ((?>(âŠ)) dhe kvanifikatorĂ«t xhelozĂ« (possessive) (*+, ++, ?+, {m,n}+).
- ĂshtĂ« shtuar opsioni i linjĂ«s sĂ« komandĂ«s «-P» dhe variabla e mjedisit PYTHONSAFEPATH pĂ«r tĂ« çaktivizuar bashkimin automatik nĂ« sys.path tĂ« shtegĂ«ve tĂ« skedarĂ«ve potencialisht tĂ« rrezikshĂ«m.
- Signifikativisht është përmirësuar utilitari py.exe për platformën Windows, ku është implementuar mbështetje për sintaksën «-V:/» përveç «-.».
- Shumë makro në C API janë transformuar në funksione të zakonshme ose inline statike.
- Modulet uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev dhe sunau janë shpallur të plogështa dhe do të hiqen në lëshimin e Python 3.13. Funksionet PyUnicode_Encode* janë hequr.
Burimi: opennet.ru
