Efter et års udvikling er den betydelige udgivelse af programmeringssproget Python 3.11 blevet offentliggjort. Den nye gren vil blive understøttet i halvandet år, hvorefter der i yderligere tre og en halv år vil blive udarbejdet rettelser til sikkerhedsfejl.
Samtidig er alfa-testningen af Python 3.12 begyndt (i henhold til den nye udviklingsplan begynder arbejdet med den nye gren fem måneder før udgivelsen af den foregående gren, og på tidspunktet for den næste udgivelse når den alfa-testningsstadiet). Python 3.12 vil være i alfa-udgivelsesstadiet i syv måneder, hvor nye funktioner vil blive tilføjet, og fejl vil blive rettet. Derefter vil der blive gennemført beta-testning i tre måneder, hvor tilføjelse af nye funktioner vil være forbudt, og al opmærksomhed vil være rettet mod at rette fejl. De sidste to måneder før udgivelsen vil grenen være i kandidat-til-udgivelse-fasen, hvor den endelige stabilisering vil finde sted.
Blandt de nye tilføjelser i Python 3.11 er:
- Der er blevet udført betydeligt arbejde med at optimere ydeevnen. Den nye gren inkluderer ændringer relateret til acceleration og inline-udrulning af funktionskald, brugen af hurtige tolkere til typeoperationer (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), samt optimeringer forberedt af Cinder- og HotPy-projekterne. Afhængigt af belastningstypen er der blevet registreret en hastighedsforøgelse på 10-60% under udførelsen af koden. I gennemsnit er ydeevnen under testsettet pyperformance steget med 25%.
Caching-mekanismen for bytekode er blevet redesignet, hvilket har reduceret opstartstiden for tolken med 10-15%. Objekter med kode og bytekode placeres nu statisk af tolken, hvilket har gjort det muligt at udelade de trin, der involverer demarshalling af den cachede bytekode og konvertering af objekter med kode til placering i dynamisk hukommelse.
- Når der vises spor af opkald i diagnosticeringsmeddelelser, er der sikret visning af oplysninger om det udtryk, der forårsagede fejlen (tidligere blev kun linjen fremhævet uden detaljering af, hvilken del af linjen der medførte fejlen). Udvidet information om sporet kan også fås via API'et og anvendes til at matche individuelle bytekode-instruktioner med en specifik position i kildekoden ved hjælp af metoden codeobject.co_positions() eller C API-funktionen PyCode_Addr2Location(). Ændringen gør det betydeligt lettere at fejlfinde problemer relateret til indlejrede dictionary-objekter, flere funktionsopkald og komplekse aritmetiske udtryk. Traceback (seneste opkald sidst): Fil «calculation.py», linje 54, i resultat = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division med nul
- Support til undtagelsesgrupper er tilføjet, hvilket muliggør, at programmet kan generere og håndtere flere forskellige undtagelser samtidigt. For at gruppere flere undtagelser og kalde dem sammen er der introduceret nye undtagelsestyper ExceptionGroup og BaseExceptionGroup, og for at skelne mellem enkelte undtagelser i gruppen er der tilføjet udtrykket «except*».
- Metoden add_note() er blevet tilføjet i klassen BaseException, hvilket gør det muligt at vedhæfte en tekstnotat til undtagelsen, f.eks. for at tilføje kontekstuelle oplysninger, der ikke var tilgængelige under genereringen af undtagelsen.
- En særlig type Self er blevet tilføjet, som repræsenterer den aktuelle lukkede klasse. Self kan bruges til at annotere metoder, der returnerer en instans af sin klasse, på en enklere måde end ved brug af TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- En ny speciel datatype LiteralString er blevet tilføjet, som kun kan inkludere strenglitteraler, der er kompatible med datatypen LiteralString (dvs. rene strenge og strenge af typen LiteralString, men ikke vilkårlige eller kombinerede strenge af typen str). Datatypen LiteralString kan bruges til at begrænse transmissionen af strengeargumenter til funktioner, hvor vilkårlig udskiftning af strenge kan føre til sårbarheder, såsom ved dannelse af strenge til SQL-forespørgsler eller shell-kommandoer. 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) # Fejl run_query( # Fejl f»SELECT * FROM students WHERE name = {arbitrary_string}» )
- Datatype TypeVarTuple er blevet tilføjet, hvilket muliggør brugen af variabel generik, i modsætning til TypeVar, der dækker ikke én, men et vilkårligt antal typer.
- Modulet tomllib er blevet inkluderet i standardbiblioteket med funktioner til at analysere TOML-formatet.
- Der er givet mulighed for at markere enkelte elementer i typede ordbøger (TypedDict) med mærkerne Required og NotRequired for at bestemme obligatoriske og ikke-obligatoriske felter (som standard er alle erklærede felter obligatoriske, medmindre parameteren total er sat til False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (feltet year er ikke obligatorisk) m3: Movie = {«year»: 2022} # Fejl, obligatorisk felt title er ikke udfyldt)
- Klassen TaskGroup er blevet tilføjet til modulet asyncio med implementeringen af en asynkron kontekstmanager, der venter på, at en gruppe opgaver afsluttes. Tilsætning af opgaver til gruppen sker ved hjælp af 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(«Begge opgaver er nu afsluttet.»)
- Dekoratøren for klasser, metoder og funktioner @dataclass_transform er blevet tilføjet, hvorved systemet til statisk typekontrol behandler objektet som ved brug af dekoratoren @dataclasses.dataclass. I eksemplet nedenfor vil klassen CustomerModel ved typekontrol blive behandlet på samme måde som en klasse med dekoratoren @dataclasses.dataclass, dvs. som havende metoden __init__, der accepterer variablerne id og name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- I regulære udtryk er der blevet tilføjet muligheden for at bruge atomær gruppering ((?>…)) og jaloux (possessive) kvantifikatorer (*+, ++, ?+, {m,n}+).
- Der er tilføjet en kommandolinjeindstilling "-P" og en miljøvariabel PYTHONSAFEPATH for at deaktivere automatisk vedhæftning af potentielt usikre filstier til sys.path.
- Py.exe værktøjet til Windows-platformen er blevet betydeligt forbedret, hvor der er implementeret understøttelse af syntaksen "-V:<company>\/<tag>" ud over "-<major>.<minor>".
- Mange makroer i C API'en er blevet omdannet til almindelige eller statiske inline-funktioner.
- Modulerne uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb og mailcap er blevet markeret som forældede og vil blive fjernet i Python 3.13. Funktionerne PyUnicode_Encode* er blevet fjernet.
Kilde: opennet.ru
