Utgivelse av programmeringsspråket Python 3.11

Etter et år med utvikling har den betydelige utgivelsen av programmeringsspråket Python 3.11 blitt publisert. Den nye grenen vil bli støttet i ett og et halvt år, hvoretter det i ytterligere tre og et halvt år vil bli generert reparasjoner for å eliminere sårbarheter.

Samtidig begynte alfa-testing av Python 3.12-grenen (i samsvar med den nye utviklingsplanen, begynner arbeidet med en ny gren fem måneder før utgivelsen av forrige gren og når alfa-teststadiet ved tidspunktet for neste utgivelse ). Python 3.12-grenen vil være i alfa-utgivelse i syv måneder, hvor nye funksjoner vil bli lagt til og feil fikset. Etter dette vil betaversjoner bli testet i tre måneder, hvor det er forbudt å legge til nye funksjoner, og all oppmerksomhet vil bli viet til å fikse feil. De siste to månedene før utgivelsen vil filialen være på utgivelseskandidatstadiet, hvor den endelige stabiliseringen vil bli utført.

Nye tillegg til Python 3.11 inkluderer:

  • Betydelig arbeid er gjort for å optimalisere ytelsen. Den nye grenen inkluderer endringer knyttet til akselerasjon og inline distribusjon av funksjonskall, bruk av raske tolkere av standardoperasjoner (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), samt optimaliseringer utarbeidet av Cinder- og HotPy-prosjektene. Avhengig av type belastning er det en økning i kodeutførelseshastighet på 10-60%. I gjennomsnitt økte ytelsen på pyperformance-testpakken med 25 %.

    Bytekodebufringsmekanismen har blitt redesignet, noe som har redusert tolkens oppstartstid med 10-15 %. Objekter med kode og bytekode er nå statisk allokert av tolken, noe som gjorde det mulig å eliminere stadiene med unmarshalling bytecode ekstrahert fra cachen og konvertere objekter med kode som skal plasseres i dynamisk minne.

  • Ved visning av anropssporinger i diagnostiske meldinger er det nå mulig å vise informasjon om uttrykket som forårsaket feilen (tidligere var det kun linjen som ble uthevet uten å angi hvilken del av linjen som forårsaket feilen). Utvidet sporingsinformasjon kan også fås gjennom API og brukes til å kartlegge individuelle bytekodeinstruksjoner til en spesifikk posisjon i kildekoden ved å bruke metoden codeobject.co_positions() eller C API-funksjonen PyCode_Addr2Location(). Endringen gjør det mye enklere å feilsøke problemer med nestede ordbokobjekter, flere funksjonskall og komplekse aritmetiske uttrykk. Traceback (siste anrop sist): Fil "calculation.py", linje 54, i resultat = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: divisjon på null
  • Lagt til støtte for unntaksgrupper, noe som gir programmet muligheten til å generere og behandle flere forskjellige unntak samtidig. For å gruppere flere unntak og øke dem sammen, har nye unntakstyper ExceptionGroup og BaseExceptionGroup blitt foreslått, og uttrykket "unntatt*" er lagt til for å markere individuelle unntak fra en gruppe.
  • Add_note()-metoden er lagt til i BaseException-klassen, slik at du kan legge ved et tekstnotat til unntaket, for eksempel ved å legge til kontekstuell informasjon som ikke er tilgjengelig når unntaket blir kastet.
  • Lagt til en spesiell selvtype for å representere den gjeldende private klassen. Self kan brukes til å kommentere metoder som returnerer en forekomst av klassen på en enklere måte enn å bruke TypeVar. klasse MyLock: def __enter__(self) -> Self: self.lock() returnerer selv
  • Lagt til en spesiell LiteralString-type som bare kan inkludere strengliteraler som er kompatible med LiteralString-typen (det vil si bare strenger og strenger av typen LiteralString, men ikke vilkårlige eller kombinerte strenger av typen str). LiteralString-typen kan brukes til å begrense overføring av strengargumenter til funksjoner, vilkårlig substitusjon av deler av strenger som kan føre til sårbarheter, for eksempel ved generering av strenger for SQL-spørringer eller skallkommandoer. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, tabellnavn: 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 lagt til, og tillater bruk av variable generiske stoffer, i motsetning til TypeVar, som ikke dekker én type, men et vilkårlig antall typer.
  • Standardbiblioteket inkluderer tomllib-modulen med funksjoner for å analysere TOML-formatet.
  • Det er mulig å merke individuelle elementer av maskinskrevne ordbøker (TypedDict) med Required og NotRequired-etiketter for å bestemme obligatoriske og valgfrie felt (som standard er alle deklarerte feltene obligatoriske hvis totalparameteren ikke er satt til False). klasse Film(TypedDict): tittel: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (årsfeltet er valgfritt) m3: Film = {“år”: 2022} # Feil, det påkrevde tittelfeltet er ikke fylt ut)
  • TaskGroup-klassen er lagt til asyncio-modulen med implementering av en asynkron kontekstbehandling som venter på at en gruppe oppgaver skal fullføres. Å legge til oppgaver til en gruppe gjøres ved å bruke create_task()-metoden. async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Begge oppgavene er fullført nå .")
  • Lagt til @dataclass_transform-dekorator for klasser, metoder og funksjoner, når det er spesifisert, behandler det statiske typekontrollsystemet objektet som om det bruker @dataclasses.dataclass-dekoratoren. I eksemplet nedenfor vil CustomerModel-klassen, når du sjekker typer, behandles på samme måte som en klasse med @dataclasses.dataclass-dekoratoren, dvs. som å ha en __init__-metode som aksepterer id- og navnvariabler. @dataclass_transform() klasse ModelBase: ... klasse CustomerModel(ModelBase): id: int navn: str
  • I regulære uttrykk er muligheten til å bruke atomgruppering ((?>...)) og besittende kvantifiserere (*+, ++, ?+, {m,n}+) lagt til.
  • Lagt til "-P" kommandolinjealternativ og PYTHONSAFEPATH miljøvariabel for å deaktivere automatisk vedlegg av potensielt usikre filstier til sys.path.
  • py.exe-verktøyet for Windows-plattformen har blitt betydelig forbedret for å støtte "-V:/"-syntaksen i tillegg til "-."-syntaksen.
  • Mange makroer i C API konverteres til vanlige eller statiske innebygde funksjoner.
  • Uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev og sunau-modulene er avviklet og vil bli fjernet i Python 3.13 utgivelse. Fjernet PyUnicode_Encode*-funksjoner.

Kilde: opennet.ru

Legg til en kommentar