Izdaja programskega jezika Python 3.11

Po letu dni razvoja je bila objavljena pomembna izdaja programskega jezika Python 3.11. Nova veja bo podprta eno leto in pol, nato pa bodo še tri leta in pol zanjo generirani popravki za odpravo ranljivosti.

Hkrati se je začelo alfa testiranje veje Python 3.12 (v skladu z novim urnikom razvoja se delo na novi veji začne pet mesecev pred izdajo prejšnje veje in doseže fazo alfa testiranja do naslednje izdaje ). Podružnica Python 3.12 bo v izdaji alfa sedem mesecev, v tem času pa bodo dodane nove funkcije in odpravljene napake. Po tem bodo beta različice testirane tri mesece, med katerimi bo prepovedano dodajanje novih funkcij, vsa pozornost pa bo namenjena odpravljanju napak. Zadnja dva meseca pred sprostitvijo bo veja v fazi kandidata za sprostitev, na kateri bo izvedena končna stabilizacija.

Novi dodatki k Pythonu 3.11 vključujejo:

  • Za optimizacijo delovanja je bilo opravljenega veliko dela. Nova veja vključuje spremembe v zvezi s pospeševanjem in inline razmestitvijo funkcijskih klicev, uporabo hitrih tolmačev standardnih operacij (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), kot tudi optimizacije, ki sta jih pripravila projekta Cinder in HotPy. Odvisno od vrste obremenitve se hitrost izvajanja kode poveča za 10-60%. V povprečju se je zmogljivost na zbirki testov pyperformance povečala za 25 %.

    Mehanizem predpomnjenja bajtne kode je bil preoblikovan, kar je skrajšalo čas zagona tolmača za 10-15 %. Tolmač zdaj statično dodeli objekte s kodo in bajtno kodo, kar je omogočilo odpravo stopenj razvrščanja bajtne kode, ekstrahirane iz predpomnilnika, in pretvorbo objektov s kodo za postavitev v dinamični pomnilnik.

  • Pri prikazu sledi klicev v diagnostičnih sporočilih je zdaj mogoče prikazati informacije o izrazu, ki je povzročil napako (prej je bila označena samo vrstica brez podrobnosti, kateri del vrstice je povzročil napako). Razširjene informacije o sledenju je mogoče pridobiti tudi prek API-ja in jih uporabiti za preslikavo posameznih navodil bajtne kode na določen položaj v izvorni kodi z uporabo metode codeobject.co_positions() ali funkcije C API PyCode_Addr2Location(). Sprememba omogoča veliko lažje odpravljanje težav z ugnezdenimi slovarskimi objekti, klici več funkcij in kompleksnimi aritmetičnimi izrazi. Traceback (zadnji zadnji klic): datoteka "calculation.py", vrstica 54, v rezultatu = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: deljenje z ničlo
  • Dodana podpora za skupine izjem, kar daje programu možnost generiranja in obdelave več različnih izjem hkrati. Za združevanje več izjem in njihovo združevanje sta bili predlagani novi vrsti izjem ExceptionGroup in BaseExceptionGroup, dodan pa je bil izraz »except*«, ki poudarja posamezne izjeme iz skupine.
  • Metoda add_note() je bila dodana v razred BaseException, kar vam omogoča, da izjemi pripnete besedilno opombo, na primer dodajanje kontekstualnih informacij, ki niso na voljo, ko je vržena izjema.
  • Dodan je poseben tip Self, ki predstavlja trenutni zasebni razred. Self lahko uporabite za označevanje metod, ki vrnejo primerek svojega razreda na enostavnejši način kot z uporabo TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Dodan je poseben tip LiteralString, ki lahko vključuje le literale nizov, ki so združljivi s tipom LiteralString (tj. goli nizi in nizi LiteralString, ne pa poljubnih ali kombiniranih nizov str). Tip LiteralString se lahko uporablja za omejevanje posredovanja nizovnih argumentov funkcijam, pri čemer lahko poljubna zamenjava delov nizov privede do ranljivosti, na primer pri generiranju nizov za poizvedbe SQL ali ukaze lupine. 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) # Napaka run_query( # Error f"SELECT * FROM students WHERE name = {arbitrary_string}" )
  • Dodan je bil tip TypeVarTuple, ki omogoča uporabo spremenljivih generikov, za razliko od TypeVar, ki ne pokriva ene vrste, ampak poljubno število tipov.
  • Standardna knjižnica vključuje modul tomllib s funkcijami za razčlenjevanje formata TOML.
  • Posamezne elemente tipiziranih slovarjev (TypedDict) je mogoče označiti z oznakama Required in NotRequired, da se določijo obvezna in neobvezna polja (privzeto so vsa deklarirana polja obvezna, če skupni parameter ni nastavljen na False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # V redu (polje za leto ni obvezno) m3: Film = {»leto«: 2022} # Napaka, obvezno polje za naslov ni izpolnjeno)
  • Razred TaskGroup je bil dodan modulu asyncio z implementacijo asinhronega upravitelja konteksta, ki čaka na dokončanje skupine opravil. Dodajanje nalog v skupino poteka z metodo create_task(). async def main(): async z asyncio.TaskGroup() kot tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Obe nalogi sta zdaj končani .")
  • Dodan dekorater @dataclass_transform za razrede, metode in funkcije, ko je podano, sistem za preverjanje statičnega tipa obravnava objekt, kot da bi uporabljal dekorater @dataclasses.dataclass. V spodnjem primeru bo razred CustomerModel pri preverjanju tipov obdelan podobno kot razred z dekoratorjem @dataclasses.dataclass, tj. kot ima metodo __init__, ki sprejema spremenljivki id in name. @dataclass_transform() razred ModelBase: … razred CustomerModel(ModelBase): id: int ime: str
  • V regularnih izrazih je bila dodana možnost uporabe atomskega združevanja ((?>...)) in posesivnih kvantifikatorjev (*+, ++, ?+, {m,n}+).
  • Dodana možnost ukazne vrstice »-P« in spremenljivka okolja PYTHONSAFEPATH za onemogočanje samodejnega pripenjanja potencialno nevarnih poti datotek v sys.path.
  • Pripomoček py.exe za platformo Windows je bil bistveno izboljšan, dodana je podpora za sintakso »-V:«. / " poleg "- . "
  • Številni makri v API-ju C se pretvorijo v običajne ali statične funkcije v vrstici.
  • Moduli uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev in sunau so opuščeni in bodo odstranjeni v Pythonu 3.13 izdaja. Odstranjene funkcije PyUnicode_Encode*.

Vir: opennet.ru

Dodaj komentar