Po roku vývoja bolo zverejnené významné vydanie programovacieho jazyka Python 3.12. Nová pobočka bude podporovaná jeden a pol roka, po ktorom sa pre ňu budú ešte tri a pol roka generovať opravy na odstránenie zraniteľností.
Zároveň sa začalo alfa testovanie vetvy Python 3.13, ktoré zaviedlo režim zostavovania CPythonu bez globálneho zámku interpreta (GIL, Global Interpreter Lock). Vetva Python 3.13 bude vo verzii alfa sedem mesiacov, počas ktorých budú pridané nové funkcie a opravené chyby (v súlade s novým harmonogramom vývoja sa práce na novej vetve začínajú päť mesiacov pred vydaním predchádzajúcej vetvy a do čas ďalšieho vydania dosiahne štádium alfa testovania). Potom budú beta verzie testované tri mesiace, počas ktorých bude zakázané pridávanie nových funkcií a všetka pozornosť sa bude venovať opravám chýb. Posledné dva mesiace pred vydaním bude pobočka v štádiu kandidáta na vydanie, v ktorom sa vykoná konečná stabilizácia.
Nové prírastky do Pythonu 3.12 zahŕňajú:
- Flexibilita analýzy f-reťazcov (formátovaných literálov s predponou 'f') sa zvýšila, čo nám umožňuje zbaviť sa mnohých obmedzení. Napríklad f-reťazce môžu teraz obsahovať ľubovoľný výraz platný v jazyku Python, vrátane viacriadkových výrazov, komentárov, spätných lomiek a sekvencií escape Unicode. Okrem toho vnútorný reťazec teraz umožňuje opätovné použitie rovnakých úvodzoviek ako ohraničenie f-string (t. j. dvojité úvodzovky je teraz možné znova použiť vo vnútri bez toho, aby ste museli prepínať na jednoduché úvodzovky). Zväčšil sa informačný obsah chybových hlásení v f-riadkoch, v ktorých je teraz uvedené presné miesto v riadku, ktoré chybu spôsobilo.
Napríklad v Pythone 3.12 sú povolené nasledujúce konštrukcie: print(f"Toto je zoznam skladieb: {"\n".join(songs)}") print(f"Toto je zoznam skladieb: {"\N{BLACK HEART SUIT}". join(songs)}") print(f"Toto je zoznam skladieb: {", ".join([ … 'Vezmi ma späť do Edenu', # Moje, moje, tie oči ako oheň ... 'Alkaline' , # Nie kyslé ani zásadité ... 'Ascensionizmus' # Vydajte sa konečne do rozbitého neba... ])})
- Na zvýšenie efektívnosti využívania zdrojov vo viacjadrových systémoch bola implementovaná podpora pre izolované podtlmočníky a samostatné globálne zámky (GIL, Global Interpreter Lock) pre rôznych interpretov v rámci procesu (CPython umožňuje spustiť niekoľko interpretov naraz v jeden proces). V súčasnej podobe je funkcia momentálne dostupná len cez C-API (podpora Python API sa objaví v ďalšej významnej vetve).
- Do kódu Pythonu bola pridaná možnosť používať protokol vyrovnávacej pamäte. Triedy, ktoré poskytujú metódu "__buffer__()" možno teraz použiť ako typy, ktoré priamo pracujú s binárnymi údajmi v pamäti.
- Na ladenie a profilovanie je navrhnutý modul sys.monitoring, ktorý umožňuje sledovať udalosti v CPythone ako sú volania, návraty funkcií, vykonávanie ľubovoľných riadkov kódu, výnimky a prechody s minimálnou réžiou.
- Interpret implementuje podporu pre podsystém jadra Linux perf, ktorý umožňuje určiť názvy funkcií Pythonu pri profilovaní pomocou utility perf (predtým sa v stopách určovali iba názvy funkcií C).
- Zväčšil sa informačný obsah chybových hlásení a rozšíril sa okruh výnimiek, ktoré ponúkajú odporúčania na odstránenie preklepov. Teraz sa napríklad zobrazujú odporúčania na import zabudnutých modulov štandardnej knižnice a zobrazujú sa rady na pridanie predpony “self.”. v metódach sa definuje písanie „import x z y“ namiesto „z y import x“ atď. sys.version_info NameError: názov 'sys' nie je definovaný. Zabudli ste importovať „sys“? somethin = blech NameError: názov 'blech' nie je definovaný. Mali ste na mysli: 'self.blech'? import ayz from byz SyntaxError: Chceli ste namiesto toho použiť 'from ... import ...'? from collections import chainmap ImportError: nemožno importovať názov 'chainmap' z 'collections'. Mali ste na mysli: 'ChainMap'?
- Pokračovali práce na optimalizácii výkonu. Celkové zvýšenie výkonu v dôsledku pridaných optimalizácií sa odhaduje na 5 %.
- Do procesu zostavovania bola pridaná experimentálna podpora pre binárny optimalizátor BOLT, čím sa zvýšil výkon o 1 – 5 %.
- Bolo implementované priame nasadenie zoznamov (comprehensions), ktoré zrýchlilo prácu s inklúziami zoznamu až dvojnásobne (pri kóde, ktorý aktívne využíva inklúzie zoznamu, testovanie ukázalo celkové zvýšenie výkonu o 11 %).
- Veľkosť objektov Unicode sa zmenšila o 8-16 bajtov.
- Operácie s regulárnymi výrazmi re.sub(), re.subn() a re.Pattern boli zrýchlené.
- Vykonávanie kontrol isinstance() pre niektoré protokoly sa zrýchlilo z 2 na 20-krát.
- Výkon balíka asyncio sa výrazne zlepšil (niektoré testy ukazujú 75% zrýchlenie).
- Zrýchlilo sa vytváranie triedy asyncio.Task.
- Výrazne (v niektorých testoch o 64 %) boli zrýchlené funkcie tokenize.tokenize() a tokenize.generate_tokens().
- Načítanie atribútov a volanie metódy super() bolo zrýchlené.
- Bola navrhnutá nová, kompaktnejšia syntax anotácií pre generické triedy a funkcie. def max[T](argumenty: Iterable[T]) -> T: ... zoznam tried[T]: def __getitem__(self, index: int, /) -> T: ... def append(self, element : T) - >Žiadne: ...
- Poskytol nový spôsob, ako definovať aliasy typu pomocou výrazu „typ“ typ Point = tuple[float, float] typ Point[T] = tuple[T, T]
- Do typovacieho modulu bol pridaný nový dekorátor @override, ktorý informuje systémy kontroly typu, že metóda v podtriede je určená na prepísanie metódy alebo atribútu v nadtriede. Dekorátor možno použiť na zachytenie chýb spôsobených metódou, ktorá má byť prepísaná, nevykonávaním danej akcie. class Base: def log_status(self) -> None: … class Sub(Base): @override def log_status(self) -> None: # Ok, prepíše Base.log_status … @override def done(self) -> None: # Systém kontroly typu zistí chybu...
- V záujme zvýšenia bezpečnosti boli vstavané implementácie algoritmov SHA1, SHA3, SHA2-384, SHA2-512 a MD5 v hashlibe nahradené formálne overenými možnosťami z projektu HACL* (vstavané implementácie sa používajú iba ak OpenSSL nie je k dispozícii).
- Python implementuje ochranu pred pretečením zásobníka.
- Trieda pathlib.Path podporuje podtriedy.
- Modul os má rozšírenú podporu platforiem. WindowsNapríklad pri práci v Windows Pridaná podpora pre metódy os.listdrives(), os.listvolumes() a os.listmounts() a vylepšená presnosť metód os.stat() a os.lstat().
- Pridané rozhrania príkazového riadka do modulov sqlite3 a uuid („python -m sqlite3“ a „python -m uuid“).
- C-API pridalo podporu pre „nesmrteľné“ objekty, pre ktoré sa nepoužíva počítanie referencií.
- Bol implementovaný koncept nestabilnej úrovne C API, ktorý je určený na použitie v debuggeroch, JIT kompilátoroch a iných nízkoúrovňových nástrojoch.
- Vyčistené zastarané funkcie.
- Moduly asynchat, asyncore, smtpd, imp a distutils boli odstránené (modul distutils je možné použiť z balíka setuptools).
- Vlastnosti wstr a wstr_length boli odstránené z implementácie objektov Unicode v jazyku C.
- V module unittest boli odstránené zastarané metódy.
- Odstránené zastarané alebo nefunkčné funkcie, triedy a metódy vrátane locale.format(), io.OpenWrapper, ssl.RAND_pseudo_bytes(), ElementTree.Element.copy(), hashlib.pbkdf2_hmac(), gzip.GzipFile atď.
- Modul webového prehliadača už nepodporuje staršie prehliadače vrátane Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird a Firefox až do verzie 36.
- V rámci prípravy na budúce optimalizácie sa zmenila interná reprezentácia celých čísel.
Zdroj: opennet.ru
