Izdanje programskog jezika Python 3.10

Nakon godinu dana razvoja, predstavljeno je značajno izdanje programskog jezika Python 3.10. Nova grana će biti podržana godinu i po, nakon čega će se još tri i po godine generisati popravke za nju kako bi se otklonile ranjivosti.

Istovremeno je počelo alfa testiranje grane Python 3.11 (u skladu s novim rasporedom razvoja, rad na novoj grani počinje pet mjeseci prije izlaska prethodne grane i dostiže fazu alfa testiranja do trenutka sljedećeg izdanja ). Grana Python 3.11 će biti u alfa izdanju sedam mjeseci, tokom kojih će biti dodane nove funkcije i ispravljene greške. Nakon toga, beta verzije će biti testirane tri mjeseca, tokom kojih će dodavanje novih funkcija biti zabranjeno i sva pažnja će biti posvećena ispravljanju grešaka. Posljednja dva mjeseca prije puštanja, grana će biti u fazi kandidata za oslobađanje, u kojoj će se izvršiti konačna stabilizacija.

Novi dodaci za Python 3.10 uključuju:

  • Implementirani "match" i "case" operatori za podudaranje uzoraka, koji poboljšavaju čitljivost koda, pojednostavljuju uparivanje proizvoljnih Python objekata i povećavaju pouzdanost koda kroz naprednu statičku provjeru tipova. Implementacija je vrlo slična operatoru "match" koji se nalazi u Scali, Rustu i F#, koji upoređuje rezultat specificiranog izraza sa listom obrazaca navedenih u blokovima na osnovu operatora "case".

    def http_error(status): status podudaranja: slučaj 400: vraćanje “Loš zahtjev” slučaj 401|403|404: vraćanje “Nije dozvoljeno” slučaj 418: vraćanje slučaja “Ja sam čajnik” _: vraćanje “Nešto drugo”

    Možete raspakovati objekte, tuple, liste i proizvoljne sekvence da biste povezali varijable na osnovu postojećih vrijednosti. Dozvoljeno je definirati ugniježđene predloške, koristiti dodatne “if” uslove u šablonu, koristiti maske (“[x, y, *rest]”), mapiranja ključ/vrijednost (na primjer, {“propusnost”: b, “latencija ”: l} za izdvajanje vrijednosti "propusnosti" i "latencije" iz rječnika), izdvajanje podšablona (":=" operator), korištenje imenovanih konstanti u šablonu. U klasama je moguće prilagoditi ponašanje podudaranja pomoću metode “__match__()”.

    from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): tačka podudaranja: case Point(0, 0): print("Origin") case Point(0, y): print(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Negdje drugdje") case _: print("Nije tacka") podudaranje tačka: case Tačka(x, y) ako je x == y: print(f"Y=X na {x}") case Tačka(x, y): print(f"Nije na dijagonali") CRVENA, ZELENA, PLAVA = 0, 1, 2 odgovara boji: case RED: print(“Vidim crvenu!”) case GREEN: print(“Trava je zelena”) case BLUE: print(“Osjećam plavu boju :(“)

  • Sada je moguće koristiti zagrade u naredbi with za podjelu definicije kolekcije kontekst menadžera u više redova. Također je dozvoljeno ostaviti zarez nakon konačnog upravitelja konteksta u grupi: sa ( CtxManager1() kao primjer1, CtxManager2() kao primjer2, CtxManager3() kao primjer3, ): ...
  • Poboljšano izvještavanje o lokaciji koda grešaka koje se odnose na nezatvorene zagrade i navodnike u literalima stringova. Na primjer, kada postoji nezatvorena vitičasta zagrada, umjesto da prijavi sintaksičku grešku u sljedećoj konstrukciji, pokazivač sada ističe početnu zagradu i pokazuje da nema bloka za zatvaranje. Fajl "example.py", red 1 očekivan = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' nikada nije zatvorena

    Dodane su dodatne specijalizirane poruke o greškama u sintaksi: nedostaje simbol ":" prije bloka i u rječnicima, ne odvaja se tuple zagradama, nedostaje zarez u listama, specificira "pokušaj" blok bez "osim" i "konačno", koristeći "= " umjesto "= =" u poređenjima, specificirajući *-izraze u f-stringovima. Osim toga, osigurava da je istaknut cijeli problematičan izraz, a ne samo početak, i eksplicitnije informacije o kontekstu grešaka povezanih s nepravilnim uvlačenjem. >>> def foo(): … if lel: … x = 2 Fajl “”, red 3 x = 2 ^ IndentationError: očekivao se uvučeni blok nakon 'if' naredbe u redu 2

    U greškama uzrokovanim greškama u kucanju u nazivima atributa i nazivima varijabli u funkciji, ispisuje se preporuka s ispravnim imenom. >>> collections.namedtoplo Traceback (posljednji posljednji poziv): Fajl "", red 1, u AttributeError: modul 'collections' nema atribut 'namedtoplo'. Jeste li mislili: namedtuple?

  • Za alate za otklanjanje grešaka i profilatore, događaji praćenja su obezbeđeni sa tačnim brojevima linija izvršenog koda.
  • Dodata postavka sys.flags.warn_default_encoding za prikaz upozorenja o potencijalnim greškama povezanim s TextIOWrapper i open() obradom UTF-8 kodiranih datoteka bez eksplicitnog navođenja opcije ‘encoding=»utf-8″‘ (ASCII kodiranje se koristi po defaultu). Novo izdanje također pruža mogućnost specificiranja vrijednosti 'encoding="locale"' za postavljanje kodiranja na osnovu trenutnog lokaliteta.
  • Novi operator je dodat modulu za kucanje, koji pruža alate za određivanje oznaka tipa, omogućavajući upotrebu sintakse „X | Y" da odaberete jedan od tipova (X tip ili Y tip). def kvadrat(broj: int | float) -> int | float: povratni broj ** 2 je ekvivalentan prethodno podržanoj konstrukciji: def square(broj: Union[int, float]) -> Union[int, float]: povratni broj ** 2
  • Operator konkatenacije i varijabla ParamSpec dodani su modulu za kucanje, koji vam omogućavaju da proslijedite dodatne informacije za statičku provjeru tipa kada koristite Callable. Modul za kucanje također dodaje posebne vrijednosti TypeGuard za označavanje funkcija zaštite tipa i TypeAlias ​​da eksplicitno definira pseudonim tipa. StrCache: TypeAlias ​​= 'Cache[str]' # pseudonim tipa
  • Funkcija zip() implementira opcionu “strogu” zastavicu, koja, kada je navedena, provjerava da li su argumenti koji se ponavljaju iste dužine. >>> 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 (posljednji poziv posljednji ): … ValueError: zip() argument 2 je duži od argumenta 1
  • Nove ugrađene funkcije aiter() i anext() su predložene sa implementacijom asinhronih analoga funkcijama iter() i next().
  • Rad konstruktora str(), bytes() i bytearray() pri radu sa malim objektima je ubrzan za 30-40%.
  • Smanjen je broj operacija uvoza u runpy modulu. Naredba "python3 -m module_name" sada radi u prosjeku 1.4 puta brže zbog smanjenja uvezenih modula sa 69 na 51.
  • Instrukcija LOAD_ATTR koristi mehanizam keširanja za pojedinačne opkodove, što je omogućilo da se ubrza rad sa regularnim atributima do 36%, a sa slotovima do 44%.
  • Prilikom izrade Python-a s opcijom “--enable-optimizations”, sada je omogućen način “-fno-semantic-interposition” koji omogućava ubrzanje interpretatora do 30% u odnosu na izgradnju sa “--enable-shared” " opcija.
  • Hashlib i ssl moduli su dodali podršku za OpenSSL 3.0.0 i prestali podržavati OpenSSL verzije starije od 1.1.1.
  • Stari parser je uklonjen, koji je u prethodnoj grani zamijenjen parserom PEG (Parsing Expression Grammar). Modul za formatiranje je uklonjen. Parametar petlje je uklonjen iz asyncio API-ja. Metode koje su prethodno bile zastarjele su uklonjene. Funkcije Py_UNICODE_str* koje manipulišu Py_UNICODE* nizovima su uklonjene.
  • Distutils modul je zastario i planirano je za uklanjanje u Python 3.12. Umjesto distutila, preporučljivo je koristiti setuptools, packaging, platformu, shutil, subprocess i sysconfig module. Struktura wstr u PyUnicodeObject je zastarjela i zakazana za uklanjanje.

izvor: opennet.ru

Dodajte komentar