Pēc gada izstrādes ir publicēts ievērojams Python 3.11 izlaidums. Jaunā versija tiks atbalstīta pusotru gadu, pēc tam trīs ar pusi gadus tiks veiktas kļūdu labojumi un drošības atjauninājumi.
Vienlaikus ir uzsāks alfa testēšana Python 3.12 versijā (saskaņā ar jauno izstrādes grafiku darbs pie jaunās versijas sākas piecus mēnešus pirms iepriekšējās versijas iznākšanas, un līdz nākamajam izlaidumam tā sasniedz alfa testēšanas fāzi). Python 3.12 versija būs alfa izlaidumu fāzē septiņus mēnešus, kuru laikā tiks pievienotas jaunas iespējas un tiks labotas kļūdas. Pēc tam trīs mēnešus notiks beta versiju testēšana, kurā jaunas iespējas varēs pievienot tikai ar fokusēšanos uz kļūdu labošanu. Pēdējie divi mēneši pirms izlaiduma būs kandidātu izlaiduma fāzē, kurā tiks veikta galīgā stabilizācija.
Starp Python 3.11 jaunumiem ir:
- Tika veiktas ievērojamas izpildes optimizācijas. Jaunajā versijā iekļauti uzlabojumi saistībā ar funkciju izsaukumu paātrināšanu un inline izpildi, ātru tipa operāciju interpretāciju (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), kā arī optimizācijas, kuras nodrošinājušas projekti Cinder un HotPy. Atkarībā no slodzes veida izpildes ātruma pieaugums svārstās no 10-60%. Vidēji veiktspēja, veicot pyperformance testu komplektu, ir palielinājusies par 25%.
Pārstrādāta bytecode kešatmiņas mehānika, kas ļāva samazināt interpretatora palaišanas laiku par 10-15%. Kodu un bytecode objekti tagad tiek statiski izvietoti interpretatorā, kas ļāva izslēgt demaršalizācijas posmus, iegūstot bytecode no kešatmiņas, un objekta koda pārvēršanu dinamikajā atmiņā.
- Attēlojot izsaukumu izsekošanu diagnostikas ziņojumos, tiek nodrošināta informācijas par izteiksmi izvadīšana, kas izraisījusi kļūdu (iepriekš tika izcelta tikai rinda bez detalizācijas par to, kāda daļa no rindas bija kļūdas iemesls). Papildu informāciju par izsaukumu izsekošanu var iegūt arī caur API un izmantot, lai sasaistītu atsevišķas bajtkoda instrukcijas ar konkrētu vietu avota kodā, izmantojot metodi codeobject.co_positions() vai funkciju C API PyCode_Addr2Location(). Izmaiņa būtiski atvieglo problēmu atkļūdošanu, kas saistītas ar iegultiem vārdu krājumiem, vairākiem funkciju izsaukumiem un sarežģītiem aritmētiskiem izteiksmēm. Traceback (most recent call last): File «calculation.py», line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
- Pievienota atbalsts izņēmumu grupām, nodrošinot programmai iespēju ģenerēt un apstrādāt vairākus dažādus izņēmumus vienlaikus. Jaunu izņēmumu veidu ExceptionGroup un BaseExceptionGroup piedāvā grupēt vairākus izņēmumus un tos kopīgi izsaukt, bet, lai izdalītu atsevišķus izņēmumus no grupas, ir pievienota izteiksme «except*».
- Klasei BaseException pievienots metode add_note(), kas ļauj piekļaut tekstuālu piezīmi izņēmumam, piemēram, pievienot konteksta informāciju, kas nav pieejama izņēmuma ģenerēšanas laikā.
- Pievienots īpašs tips Self, kas pārstāv pašreizējo slēgto klasi. Self var izmantot, lai annotētu metodes, kas atgriež sava klases piemēru, vienkāršāk nekā izmantojot TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- Ievadīts īpašs LiteralString tips, kas var ietvert tikai virkņu literālus, kas atbilst LiteralString tipam (t.i., neapstrādātas virknes un virknes ar LiteralString tipu, bet ne nejaušas un ne kombinētās virknes ar str tipu). LiteralString tipu var izmantot, lai ierobežotu funkcijām nododamo virkņu argumentu pārsūtīšanu, kuru nejauša virknētā daļa var izraisīt drošības riska, piemēram, veidojot virknes SQL vaicājumiem vai shell komandrindām. 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) # Kļūda run_query( # Kļūda f»SELECT * FROM students WHERE name = {arbitrary_string}» )
- Ievadīts TypeVarTuple tips, kas ļauj izmantot variatīvos ģeneriķus, atšķirībā no TypeVar, kas aptver ne tikai vienu tipu, bet arī nejaušu skaitu tipu.
- Standartbibliotēkā iekļauts tomllib modulis ar funkcijām TOML formāta izsniegšanai.
- Tika nodrošināta iespēja atzīmēt atsevišķus elementus tipizētos vārdnīcās (TypedDict) ar Required un NotRequired marķējumiem, lai noteiktu obligātās un neobligātās laukus (pēc noklusējuma visi deklarētie lauki ir obligāti aizpildāmi, ja parametrs total nav iestatīts uz False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (year lauks nav obligāts) m3: Movie = {«year»: 2022} # Kļūda, obligātais lauks title nav aizpildīts)
- Asyncio modulī iekļauts TaskGroup klase ar asinkrono konteksta pārvaldnieka realizāciju, kas gaida grupas uzdevumu pabeigšanu. Uzdevumu pievienošana grupa notiek, izmantojot create_task() metodi. async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(«Abi uzdevumi ir tagad pabeigti.»)
- Ievadīts dekorators klasēm, metodēm un funkcijām @dataclass_transform, kura norāde liek statisko tipa pārbaudes sistēmai interpretēt objektu tāpat kā, izmantojot dekoratoru @dataclasses.dataclass. Zemāk redzamajā piemērā CustomerModel klase statisko tipu pārbaudē tiks apstrādāta līdzīgi kā klase ar dekoratoru @dataclasses.dataclass, t.i., ar __init__ metodi, kas pieņem mainīgos id un name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- Regulārajās izteiksmēs pievienota atomāro grupējumu (/(?>…)/) un greizso (possessive) kvantificētāju (*+, ++, ?+, {m,n}+).
- Pievienota komandrindas opcija «-P» un vides mainīgais PYTHONSAFEPATH, lai atspējotu automātisku potenciāli nedrošu failu ceļu pievienošanu sys.path.
- Significanti uzlabota utilīta py.exe Windows platformai, kurā ieviesta sintakses «-V:<company>/» atbalsts līdzās «-<major>.<minor>».
- Daudzi makro C API ir pārveidoti par parastām vai statiskām inline funkcijām.
- Atzīti par novecojušiem un tiks izņemti Python 3.13 laidienā moduļi uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev un sunau. Noņemta funkcija PyUnicode_Encode*.
Avots: opennet.lv
