Nakon godine razvoja predstavljen je značajan ispravak jezika programiranja Python 3.10. Nova grana bit će podržavana tijekom jedne i pol godine, nakon čega će još tri i pol godine biti dostupne ispravke za uklanjanje sigurnosnih ranjivosti.
Istovremeno je započelo alfa-testiranje grane Python 3.11 (prema novom rasporedu razvoja, rad na novoj grani počinje pet mjeseci prije objave prethodne grane i do trenutka sljedeće objave doseže fazu alfa-testiranja). Grana Python 3.11 bit će u fazi alfa-izdavanja tijekom sedam mjeseci, tijekom kojih će se dodavati nove mogućnosti i ispravljati greške. Nakon toga, tijekom tri mjeseca provodit će se beta-testiranje, tijekom kojeg će dodavanje novih mogućnosti biti zabranjeno i cijela pažnja bit će usmjerena na ispravljanje grešaka. Posljednja dva mjeseca prije objave grana će biti u fazi kandidat za objavljivanje, tijekom koje će se izvoditi konačna stabilizacija.
Među novostima u Pythonu 3.10 su:
- Implementirani su operatori „match” i „case” za usklađivanje s uzorkom, koji poboljšavaju čitljivost koda, pojednostavljuju usklađivanje proizvoljnih Python objekata i povećavaju pouzdanost koda zahvaljujući mogućnosti proširenog statičkog provjeravanja tipova. Implementacija u velikoj mjeri podsjeća na operator „match” koji se pruža u jezicima Scala, Rust i F#, a koji izvršava usporedbu rezultata izvršenja određenog izraza s popisom uzoraka navedenim u blokovima temeljenim na operatoru „case”.
def http_error(status): match status: case 400: return «Bad request» case 401|403|404: return «Not allowed» case 418: return «I’m a teapot» case _: return «Something else»
Omogućena je raspakiravanje objekata, tuplova, lista i proizvoljnih sekvenci za vezivanje varijabli na osnovu postojećih vrednosti. Dozvoljeno je definisanje ugniježdenih obrazaca, korišćenje dodatnih uslova "if" u obrascu, primena maski ("[x, y, *rest]"), mapiranje veza ključa/vrednosti (na primer, {"bandwidth": b, "latency": l} za vađenje vrednosti "bandwidth" i "latency" iz rečnika), vađenje podobrazaca (operator ":="), korišćenje imenovanih konstanti u obrascu. U klasama je moguće prilagoditi ponašanje prilikom usklađivanja pomoću metode "__match__()".
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Izvor") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Negde drugde") case _: print("Nije tačka") match point: case Point(x, y) if x == y: print(f"Y=X na {x}") case Point(x, y): print(f"Nije na dijagonali") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print("Vidim crveno!") case GREEN: print("Trava je zelena") case BLUE: print("Imam plavetnilo :(")
- Omogućena je upotreba okruglih zagrada u operatoru with za razdvajanje definicija kolekcije kontekstualnih menadžera u više redova. Takođe je dozvoljeno ostaviti zarez posle finalnog kontekstualnog menadžera u grupi: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- Poboljšano je obaveštenje o lokaciji u kodu grešaka povezanih sa otvorenim vitičastim zagradama i navodnicima u string literama. Na primer, prilikom otvorene vitičaste zagrade umesto obaveštenja o grešci sintakse u sledećoj konstrukciji, pokazivač sada ističe otvorenu vitičastu zagradu i obaveštava o nedostatku zatvarajuće blokade. File "example.py", line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: '{' was never closed
Dodani su dodatni specijalizirani poruci o sintaktičkim greškama: nedostaje znak „:” ispred bloka i u rječnicima, neizdvajanje tuplica zagradama, nedostatak zareza u popisima, navođenje bloka „try” bez „except” i „finally”, korištenje „=” umjesto „==” u usporedbama, navođenje *-izrazâ u f-stringovima. Osim toga, osigurano je izdvajanje cijelog problematičnog izraza, a ne samo njegovog početka, i jasnije informiranje o kontekstu grešaka povezanih s nepravilnim razmještanjem uvlačenja. >>> def foo(): … if lel: … x = 2 Datoteka „”, redak 3 x = 2 ^ IndentationError: očekivan je uvučeni blok nakon „if” izjave u retku 2
U greškama uzrokovanim tipografskim pogreškama u nazivima atributa i imena varijabli u funkciji, osigurano je ispisivanje preporuke s ispravnim imenom. >>> collections.namedtoplo Trag greške (najnoviji poziv posljednji): Datoteka „”, redak 1, u AttributeError: modul ‘collections’ nema atribut ‘namedtoplo’. Jeste li mislili: namedtuple?
- Za alate za otklanjanje pogrešaka i profilere osigurano je navođenje u događajima praćenja točnih brojeva redaka izvršenog koda.
- Dodana je postavka sys.flags.warn_default_encoding za ispisivanje upozorenja o potencijalnim greškama vezanim uz obradu u TextIOWrapper i open() datoteka u UTF-8 kodiranju bez izričitog navođenja opcije ‘encoding="utf-8"’ (po defaultu se koristi ASCII kodiranje). Također, u novom izdanju omogućena je opcija navođenja vrijednosti ‘encoding="locale"’ za postavljanje kodiranja na temelju trenutne lokalizacije.
- U modul typing, koji pruža sredstva za postavljanje anotacija tipa, dodan je novi operator koji omogućava korištenje sintakse „X | Y” za odabir jednog od tipova (tip X ili tip Y). def square(number: int | float) -> int | float: return number ** 2 ekvivalentno je ranije podržavanoj konstrukciji: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- U modul typing dodan je operator Concatenate i varijabla ParamSpec, koji omogućuju prijenos dodatnih informacija za statičku provjeru tipa prilikom korištenja Callable. U modul typing također su dodane posebne vrijednosti TypeGuard za anotiranje funkcija zaštite tipova i TypeAlias za izričito definiranje nadimka tipa. StrCache: TypeAlias = ‘Cache[str]’ # naziv tipa
- Funkcija zip() ima opcionalnu oznaku "strict", koja provodi provjeru duljine iteriranih argumenata. >>> list(zip((‘a’, ‘b’, ‘c’), (1, 2, 3), strict=True)) [(‘a’, 1), (‘b’, 2), (‘c’, 3)] >>> list(zip(range(3), [‘fee’, ‘fi’, ‘fo’, ‘fum’], strict=True)) Traceback (most recent call last): … ValueError: zip() argument 2 je duži od argumenta 1
- Predložene su nove ugrađene funkcije aiter() i anext() s implementacijom asinkronih analognih funkcijama iter() i next().
- Brzina rada konstruktora str(), bytes() i bytearray() povećana je za 30-40% prilikom obrade malih objekata.
- Smanjen je broj operacija uvoza u modulu runpy. Komanda „python3 -m ime_modula“ sada se pokreće u prosjeku 1.4 puta brže zahvaljujući smanjenju uvezenih modula s 69 na 51.
- U instrukciji LOAD_ATTR uveden je mehanizam keširanja pojedinih opkoda, što je omogućilo povećanje brzine rada s običnim atributima do 36%, a sa slotovima do 44%.
- Prilikom sastavljanja Pythona s opcijom „—enable-optimizations“, sada se uključuje način „-fno-semantic-interposition“, koji omogućuje ubrzanje rada interpreteru do 30% u usporedbi s izgradnjom s opcijom „—enable-shared“.
- U modulima hashlib i Uklonjena je neiskorištena tabela INFORMATION_SCHEMA.TABLESPACES. dodana je podrška za OpenSSL 3.0.0, dok je podrška za starije verzije OpenSSL prekinuta.
- Stari parser je uklonjen, a umjesto njega je u prošloj verziji predstavljen parser PEG (Parsing Expression Grammar). Uklonjen je modul formatter. Parametar loop je uklonjen iz API-ja asyncio. Uklonjene su metode koje su nekada bile označene kao zastarjele. Uklonjene su funkcije Py_UNICODE_str*, koje manipuliraju stringovima Py_UNICODE*.
- Modul distutils je označen kao zastario i planira se brisanje u Pythonu 3.12. Umjesto distutils preporučuje se korištenje modula setuptools, packaging, platform, shutil, subprocess i sysconfig. Struktura wstr u PyUnicodeObject je također označena kao zastarjela i planira se brisanje.
Izvor: opennet.ru
