Udgivelse af programmeringssproget Python 3.11

Efter et års udvikling er den betydelige udgivelse af programmeringssproget Python 3.11 blevet offentliggjort. Den nye filial vil blive understøttet i halvandet år, hvorefter der i yderligere tre et halvt år vil blive genereret rettelser til den for at eliminere sårbarheder.

Samtidig begyndte alfatest af Python 3.12-grenen (i overensstemmelse med den nye udviklingsplan begynder arbejdet med en ny filial fem måneder før udgivelsen af ​​den forrige filial og når alfateststadiet på tidspunktet for den næste udgivelse ). Python 3.12-grenen vil være i alfa-udgivelse i syv måneder, hvor nye funktioner vil blive tilføjet og fejl rettet. Herefter vil betaversioner blive testet i tre måneder, hvor det er forbudt at tilføje nye funktioner, og al opmærksomhed vil blive rettet mod at rette fejl. I de sidste to måneder før udgivelsen vil filialen være på udgivelseskandidatstadiet, hvor den endelige stabilisering vil blive udført.

Nye tilføjelser til Python 3.11 inkluderer:

  • Der er gjort et betydeligt arbejde for at optimere ydeevnen. Den nye gren omfatter ændringer relateret til acceleration og inline-implementering af funktionskald, brug af hurtige fortolkere af standardoperationer (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), samt optimeringer udarbejdet af Cinder- og HotPy-projekterne. Afhængigt af belastningstypen er der en stigning i kodeudførelseshastigheden på 10-60%. I gennemsnit steg ydeevnen på pyperformance-testpakken med 25 %.

    Bytecode-caching-mekanismen er blevet redesignet, hvilket har reduceret tolkens opstartstid med 10-15%. Objekter med kode og bytekode er nu statisk allokeret af tolken, hvilket gjorde det muligt at eliminere stadierne med unmarshalling bytecode udtrukket fra cachen og konvertering af objekter med kode, der skal placeres i dynamisk hukommelse.

  • Ved visning af opkaldsspor i diagnostiske meddelelser er det nu muligt at få vist information om det udtryk, der forårsagede fejlen (tidligere var det kun linjen, der blev fremhævet uden at angive, hvilken del af linjen, der forårsagede fejlen). Udvidet sporingsinformation kan også opnås gennem API'et og bruges til at kortlægge individuelle bytekode-instruktioner til en specifik position i kildekoden ved hjælp af metoden codeobject.co_positions() eller C API-funktionen PyCode_Addr2Location(). Ændringen gør det meget lettere at fejlfinde problemer med indlejrede ordbogsobjekter, flere funktionskald 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
  • Tilføjet understøttelse af undtagelsesgrupper, hvilket giver programmet mulighed for at generere og behandle flere forskellige undtagelser på én gang. For at gruppere flere undtagelser og hæve dem sammen, er nye undtagelsestyper ExceptionGroup og BaseExceptionGroup blevet foreslået, og udtrykket "except*" er blevet tilføjet for at fremhæve individuelle undtagelser fra en gruppe.
  • Metoden add_note() er blevet tilføjet til BaseException-klassen, hvilket giver dig mulighed for at vedhæfte en tekstnote til undtagelsen, for eksempel ved at tilføje kontekstuelle oplysninger, der ikke er tilgængelige, når undtagelsen kastes.
  • Tilføjet en speciel selvtype for at repræsentere den aktuelle private klasse. Self kan bruges til at annotere metoder, der returnerer en forekomst af dens klasse på en enklere måde end at bruge TypeVar. klasse MyLock: def __enter__(selv) -> Self: self.lock() returnerer selv
  • Tilføjet en speciel LiteralString-type, der kun kan inkludere strengliteraler, der er kompatible med LiteralString-typen (dvs. bare og LiteralString-strenge, men ikke vilkårlige eller kombinerede strenge). LiteralString-typen kan bruges til at begrænse videregivelsen af ​​strengargumenter til funktioner, vilkårlig substitution af dele af strenge, som kan føre til sårbarheder, for eksempel ved generering af strenge til SQL-forespørgsler eller shell-kommandoer. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, tabelnavn: LiteralString, ) -> Ingen: 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 students WHERE name = {arbitrary_string}" )
  • TypeVarTuple-typen er blevet tilføjet, hvilket tillader brugen af ​​variable generiske stoffer, i modsætning til TypeVar, som ikke dækker én type, men et vilkårligt antal typer.
  • Standardbiblioteket inkluderer tomllib-modulet med funktioner til at analysere TOML-formatet.
  • Det er muligt at markere individuelle elementer i maskinskrevne ordbøger (TypedDict) med etiketter Required og NotRequired for at bestemme påkrævede og valgfrie felter (som standard er alle deklarerede felter påkrævet, hvis totalparameteren ikke er sat til False). klasse Film(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (årsfeltet er valgfrit) m3: Film = {“år”: 2022} # Fejl, det påkrævede titelfelt er ikke udfyldt)
  • TaskGroup-klassen er blevet tilføjet til asyncio-modulet med implementeringen af ​​en asynkron kontekst-manager, der venter på, at en gruppe af opgaver skal fuldføres. Tilføjelse af opgaver til en gruppe udføres ved hjælp af create_task() metoden. async def main(): asynkron med asyncio.TaskGroup() som tg: opgave1 = tg.create_task(some_coro(...)) opgave2 = tg.create_task(en anden_coro(...)) print("Begge opgaver er afsluttet nu .")
  • Tilføjet @dataclass_transform-dekorator for klasser, metoder og funktioner, når det er angivet, behandler det statiske typekontrolsystem objektet, som om det brugte @dataclasses.dataclass-dekoratoren. I eksemplet nedenfor vil CustomerModel-klassen, når der kontrolleres typer, blive behandlet på samme måde som en klasse med @dataclasses.dataclass-dekoratoren, dvs. som havende en __init__ metode, der accepterer id- og navnevariabler. @dataclass_transform() klasse ModelBase: … klasse CustomerModel(ModelBase): id: int navn: str
  • I regulære udtryk er muligheden for at bruge atomgruppering ((?>...)) og besiddende kvantifikatorer (*+, ++, ?+, {m,n}+) tilføjet.
  • Tilføjet "-P" kommandolinjevalg og PYTHONSAFEPATH miljøvariabel for at deaktivere automatisk vedhæftning af potentielt usikre filstier til sys.path.
  • py.exe-værktøjet til Windows-platformen er blevet væsentligt forbedret for at understøtte "-V:/"-syntaksen ud over syntaksen "-.".
  • Mange makroer i C API'et konverteres til regulære eller statiske inline-funktioner.
  • Modulerne uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev og sunau er blevet forældet og vil blive fjernet i Python. 3.13 udgivelse. Fjernede PyUnicode_Encode*-funktioner.

Kilde: opennet.ru

Tilføj en kommentar