Efter ett Ärs utveckling har en betydande version av programmeringssprÄket Python 3.11 publicerats. Denna gren kommer att stödjas under ett och ett halvt Är, varefter den kommer att fÄ sÀkerhetsfixar i ytterligare tre och ett halvt Är.
Samtidigt har alfatestningen av Python 3.12-grenen pÄbörjats (enligt den nya utvecklingsplanen börjar arbetet med den nya grenen fem mÄnader innan releasen av den föregÄende grenen och nÄr alfatestning vid release). Python 3.12-grenen kommer att befinna sig i alfautgÄvor under sju mÄnader, under vilka nya funktioner kommer att lÀggas till och buggar rÀttas. DÀrefter kommer det att genomföras betatestning under tre mÄnader, dÀr nya funktioner inte fÄr lÀggas till och hela uppmÀrksamheten kommer att riktas mot buggfixar. De sista tvÄ mÄnaderna före releasen kommer grenen att befinna sig i releasekandidatstadiet, dÀr den slutliga stabiliseringen kommer att utföras.
Bland nyheterna som lagts till i Python 3.11 Àr:
- En betydande insats har gjorts för att optimera prestandan. Den nya grenen innehÄller Àndringar relaterade till accelerering och inline-utbyggnad av funktionsanrop, anvÀndning av snabba interpreter för typoperationer (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), samt optimeringar som utvecklats av projekten Cinder och HotPy. Beroende pÄ typen av belastning har hastigheten pÄ kodkörningen ökat med 10-60%. I genomsnitt ökade prestandan under pyperformance testsviten med 25%.
Cache-mekanismen för bytekod har reviderats, vilket har möjliggjort en minskning av starttiden för tolken med 10-15%. Objekt med kod och bytekod placeras nu statiskt av tolken, vilket har gjort det möjligt att utesluta stadierna av demarshalling av hÀmtad bytekod och omvandling av objekt med kod för placering i dynamiskt minne.
- Vid visning av funktionsspĂ„rningar i diagnostiska meddelanden sĂ€kerstĂ€lls att information om uttrycket som orsakade felet visas (tidigare visades bara raden utan detaljering av vilken del av raden som orsakade felet). Utökad information om spĂ„rningen kan ocksĂ„ erhĂ„llas via API och anvĂ€ndas för att matcha individuella bytekodinstruktioner med en specifik position i kĂ€llkoden, med hjĂ€lp av metoden codeobject.co_positions() eller funktionen C API PyCode_Addr2Location(). Ăndringen förenklar avsevĂ€rt felsökningen av problem relaterade till nĂ€stlade ordboksobjekt, flera funktionsanrop och komplexa aritmetiska uttryck. Traceback (most recent call last): File «calculation.py», line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
- Stöd för undantagsgrupper har lagts till, vilket ger programmet möjlighet att generera och hantera flera olika undantag samtidigt. För gruppering av flera undantag och deras gemensamma anrop har nya undantagstyper som ExceptionGroup och BaseExceptionGroup introducerats, och för att sÀrskilja individuella undantag frÄn gruppen har uttrycket «except*» lagts till.
- I klassen BaseException har metoden add_note() lagts till, vilket gör det möjligt att fÀsta en textkommentar till ett undantag, till exempel för att lÀgga till kontextuell information som inte var tillgÀnglig vid genereringen av undantaget.
- En sÀrskild typ av Self har lagts till, som representerar den aktuella privata klassen. Self kan anvÀndas för att annotera metoder som returnerar en instans av sin klass, pÄ ett enklare sÀtt Àn med anvÀndning av TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- En speciell typ av LiteralString har lagts till, som endast kan inkludera strÀngliteraler som Àr kompatibla med typen LiteralString (dvs. rena strÀngar och strÀngar av typen LiteralString, men inte godtyckliga eller kombinerade strÀngar av typen str). Typen LiteralString kan anvÀndas för att begrÀnsa överföringen av strÀngargument till funktioner, dÀr godtycklig insÀttning av strÀngdelar kan leda till sÄrbarheter, till exempel vid skapande av strÀngar för SQL-frÄgor eller shell-kommandon. 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) # Fel run_query( # Fel f»SELECT * FROM students WHERE name = {arbitrary_string}» )
- Typen TypeVarTuple har lagts till, vilket möjliggör anvÀndning av variabla generiska typer, till skillnad frÄn TypeVar, som omfattar inte bara en typ, utan ett godtyckligt antal typer.
- Modulen tomllib med funktioner för att parsa TOML-formatet har lagts till i standardbiblioteket.
- Det har blivit möjligt att mÀrka individuella element i typade ordböcker (TypedDict) med etiketter som Required och NotRequired för att definiera obligatoriska och icke-obligatoriska fÀlt (alla deklarerade fÀlt Àr som standard obligatoriska att fylla i, om parameter total inte sÀtts till False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (fÀltet year Àr valfritt) m3: Movie = {«year»: 2022} # Fel, obligatoriskt fÀlt title Àr inte fyllt)
- Klassen TaskGroup har lagts till i modulen asyncio med en implementation av en asynkron kontextförvaltare som vĂ€ntar pĂ„ att en grupp uppgifter ska slutföras. Uppgifter lĂ€ggs till gruppen med metoden create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(âŠ)) task2 = tg.create_task(another_coro(âŠ)) print(«BĂ„da uppgifterna har nu slutförts.»)
- Dekoratorn @dataclass_transform har lagts till för klasser, metoder och funktioner, vilket gör att systemet för statisk typkontroll tolkar objektet som nÀr man anvÀnder dekoratorn @dataclasses.dataclass. I exemplet nedan hanteras klassen CustomerModel vid typkontroll pÄ samma sÀtt som en klass med dekoratorn @dataclasses.dataclass, dvs. som om den hade en __init__-metod som tillÄter variablerna id och name. @dataclass_transform() class ModelBase: ⊠class CustomerModel(ModelBase): id: int name: str
- I reguljĂ€ra uttryck har möjligheten att anvĂ€nda atomĂ€r gruppering ((?>âŠ)) och sjĂ€lviska (possessive) kvantifierare (*+, ++, ?+, {m,n}+).
- En ny kommandoradsalternativ «-P» och miljövariabeln PYTHONSAFEPATH har lagts till för att stÀnga av automatisk bifogning av potentiellt osÀkra filvÀgar till sys.path.
- Verktyget py.exe för Windows-plattformen har betydligt förbÀttrats, med stöd för syntaktisk notation «-V:/» utöver «-.».
- MÄnga makron i C API har omvandlats till vanliga eller statiska inline-funktioner.
- Modulerna uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev och sunau har deklarerats som förÄldrade och kommer att tas bort i Python 3.13. Funktionerna PyUnicode_Encode* har tagits bort.
KĂ€lla: opennet.ru
