Lëshimi i gjuhës programuese Python 3.11

Pas një viti zhvillimi, është publikuar një version i rëndësishëm i gjuhës programuese Python 3.11. Dega e re do të mbështetet për një vit e gjysmë, pas së cilës do të krijohen arna me dobësi për të edhe për tre vjet e gjysmë.

Në të njëjtën kohë, filloi testimi alfa i degës Python 3.12 (në përputhje me orarin e ri të zhvillimit, puna në një degë të re fillon pesë muaj para lëshimit të degës së mëparshme dhe arrin fazën e testimit alfa deri në kohën e lëshimit të ardhshëm ). Dega e Python 3.12 do të jetë në versionet alfa për shtatë muaj, gjatë të cilëve do të shtohen veçori të reja dhe do të rregullohen gabimet. Pas kësaj, versionet beta do të testohen për tre muaj, gjatë të cilëve do të ndalohet shtimi i veçorive të reja dhe e gjithë vëmendja do t'i kushtohet rregullimit të gabimeve. Dy muajt e fundit para lirimit, dega do të jetë në fazën kandidate për lirim, ku do të kryhet stabilizimi përfundimtar.

Shtesat e reja në Python 3.11 përfshijnë:

  • Është bërë punë e rëndësishme për të optimizuar performancën. Dega e re përfshin ndryshime në lidhje me përshpejtimin dhe vendosjen në linjë të thirrjeve të funksioneve, përdorimin e interpretuesve të shpejtë të operacioneve tipike (x+x, x*x, xx, a[i], a[i] = z, f( arg) C( arg), o.method(), o.attr = z, *seq), si dhe optimizimet e përgatitura nga projektet Cinder dhe HotPy. Në varësi të llojit të ngarkesës, ka një rritje të shpejtësisë së ekzekutimit të kodit me 10-60%. Mesatarisht, performanca kur kaloni paketën e testit pyperformance u rrit me 25%.

    Është ridizajnuar mekanizmi i memorizimit të bytekodit, i cili ka reduktuar kohën e fillimit të përkthyesit me 10-15%. Objektet me kod dhe bajtkod tani ndahen në mënyrë statike nga interpretuesi, gjë që bëri të mundur eliminimin e fazave të zbërthimit të bajtkodit të nxjerrë nga cache dhe konvertimit të objekteve me kod për vendosje në memorien dinamike.

  • Kur shfaqen gjurmët e thirrjeve në mesazhet diagnostikuese, jepet informacion në lidhje me shprehjen që shkaktoi gabimin (më parë, vetëm linja theksohej pa detajuar se cila pjesë e linjës e shkaktoi gabimin). Informacioni i gjurmimit të zgjeruar mund të merret gjithashtu nëpërmjet API-së dhe të përdoret për të hartuar udhëzimet individuale të bytekodit në një pozicion specifik në kodin burimor duke përdorur metodën codeobject.co_positions() ose funksionin PyCode_Addr2Location() C API. Ndryshimi thjeshton shumë problemet e korrigjimit të lidhura me objektet e fjalorit të ndërthurur, thirrjet e shumëfishta të funksioneve dhe shprehjet komplekse aritmetike. Gjurmimi (telefonata më e fundit e fundit): Skedari "calculation.py", rreshti 54, në rezultat = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: pjesëtimi me zero
  • Mbështetje e shtuar për grupet e përjashtimeve, duke i dhënë programit mundësinë për të gjeneruar dhe përpunuar disa përjashtime të ndryshme në të njëjtën kohë. Llojet e reja të përjashtimeve ExceptionGroup dhe BaseExceptionGroup propozohen për grupimin e disa përjashtimeve dhe thirrjen e tyre të përbashkët, dhe shprehja "përveç*" shtohet për përjashtime të veçanta nga një grup.
  • Metoda add_note() është shtuar në klasën BaseException, e cila ju lejon t'i bashkëngjitni një shënim teksti përjashtimit, për shembull, për të shtuar informacione kontekstuale që nuk janë të disponueshme në kohën kur është hedhur përjashtimi.
  • Një lloj i veçantë Vetë është shtuar për të përfaqësuar klasën aktuale private. Self mund të përdoret për të shënuar metoda që kthejnë një shembull të klasës së tyre në një mënyrë më të thjeshtë sesa përdorimi i TypeVar. klasa MyLock: def __enter__(vetë) -> Vetë: vetë.bllokohet() kthehu vetë
  • Është shtuar një lloj i veçantë LiteralString që mund të përfshijë vetëm literale të vargjeve që janë të pajtueshme me llojin LiteralString (d.m.th. vargje të zhveshura dhe vargje të llojit LiteralString, por jo vargje arbitrare ose të kombinuara të tipit str). Lloji LiteralString mund të përdoret për të kufizuar kalimin e argumenteve të vargut në funksione, zëvendësimi arbitrar i pjesëve të vargjeve në të cilat mund të çojë në dobësi, për shembull, kur gjenerohen vargje për pyetjet SQL ose komandat e guaskës. def run_query(sql: LiteralString) -> ... ... def caller(arbitrare_string: str, query_string: LiteralString, table_emri: LiteralString, ) -> Asnjë: run_query("SELECT * FROM Students") # ok run_query(literal_string) # ok run_query( "SELECT * FROM " + literal_string) # ok run_query(arbitrary_string) # Error run_query ( # Error f"SELECT * FROM student WHERE emri = {arbitrary_string}" )
  • Është shtuar tipi TypeVarTuple, i cili lejon përdorimin e gjenerikëve të variablave, ndryshe nga TypeVar, duke mbuluar jo një lloj, por një numër arbitrar llojesh.
  • Biblioteka standarde përfshin modulin tomllib me funksione për analizimin e formatit TOML.
  • Mundësia për të shënuar elemente individuale të fjalorëve të shtypur (TypedDict) me shenjat Required dhe NotRequired ofrohet për të përcaktuar fushat e kërkuara dhe ato opsionale (si parazgjedhje, të gjitha fushat e deklaruara kërkohen nëse parametri total nuk është vendosur në False). class Film(TypedDict): titulli: viti i rr: NotRequired[int] m1: Film = {"title": "Black Panther", "viti": 2018} # OK m2: Film = {"titulli": "Star Wars" } # OK (fusha e vitit është opsionale) m3: Film = {"viti": 2022} # Gabim, fusha e kërkuar e titullit nuk u plotësua)
  • Klasa TaskGroup është shtuar në modulin asyncio me zbatimin e një menaxheri të kontekstit asinkron që pret që grupi i detyrave të përfundojë. Shtimi i detyrave në një grup bëhet duke përdorur metodën create_task(). async def main(): async me asyncio.TaskGroup() si tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print("Të dyja detyrat janë përfunduar tani.")
  • Klasa, metoda dhe dekoruesi i funksionit të shtuar @dataclass_transform, kur specifikohet, kontrolluesi i tipit statik e trajton objektin sikur përdor dekoratorin @dataclasses.dataclass. Në shembullin e mëposhtëm, klasa CustomerModel do të kontrollohet si një klasë me dekoratorin @dataclasses.dataclass, d.m.th. pasi ka një metodë __init__ që lejon variablat id dhe emrat. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: emri int: str
  • U shtua aftësia për të përdorur grupimin atomik ((?>…)) dhe sasiorët xheloz (posedues) (*+, ++, ?+, {m,n}+) në shprehje të rregullta.
  • U shtua opsioni i linjës së komandës "-P" dhe ndryshorja e mjedisit PYTHONSAFEPATH për të çaktivizuar bashkëngjitjen automatike të shtigjeve të skedarëve potencialisht të pasigurta në sys.path.
  • Përmirësoi ndjeshëm mjetin py.exe për platformën Windows, i cili tani mbështet sintaksën "-V:". / "përveç "- . ".
  • Shumë makro në C API janë konvertuar në funksione normale ose statike inline.
  • Modulet uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev dhe sunau janë zhvlerësuar dhe do të hiqen në 3.13 lëshimi. U hoqën funksionet PyUnicode_Encode*.

Burimi: opennet.ru

Shto një koment