Izdanje programskog jezika Python 3.10

Nakon godinu dana razvoja, predstavljeno je značajno izdanje programskog jezika Python 3.10. Nova grana bit će podržana godinu i pol, nakon čega će se još tri i pol godine za nju generirati popravci kako bi se uklonile ranjivosti.

U isto vrijeme započelo je alfa testiranje grane Python 3.11 (u skladu s novim rasporedom razvoja, rad na novoj grani počinje pet mjeseci prije izdanja prethodne grane i dostiže fazu alfa testiranja do sljedećeg izdanja ). Ogranak Python 3.11 bit će u alfa izdanju sedam mjeseci, tijekom kojih će se dodavati nove značajke i ispravljati greške. Nakon toga, beta verzije će se testirati tri mjeseca, tijekom kojih će dodavanje novih značajki biti zabranjeno i sva će se pozornost posvetiti ispravljanju grešaka. Posljednja dva mjeseca prije puštanja grana će biti u fazi kandidata za puštanje, pri čemu će se izvršiti konačna stabilizacija.

Novi dodaci Pythonu 3.10 uključuju:

  • Implementirani "match" i "case" operatori za podudaranje uzorka, koji poboljšavaju čitljivost koda, pojednostavljuju podudaranje proizvoljnih Python objekata i povećavaju pouzdanost koda kroz naprednu statičku provjeru tipa. Implementacija je umnogome slična "match" operatoru danom u Scali, Rustu i F#, koji uspoređuje rezultat određenog izraza s popisom uzoraka navedenih u blokovima na temelju "case" operatora.

    def http_error(status): status podudaranja: case 400: return “Loš zahtjev” case 401|403|404: return “Nije dopušteno” case 418: return “Ja sam čajnik” case _: return “Something other”

    Možete raspakirati objekte, torke, popise i proizvoljne nizove za vezanje varijabli na temelju postojećih vrijednosti. Dopušteno je definirati ugniježđene predloške, koristiti dodatne "if" uvjete u predlošku, koristiti maske ("[x, y, *rest]"), mapiranja ključ/vrijednost (na primjer, {"bandwidth": b, "latency ”: l} za izdvajanje vrijednosti "propusnost" i "latencija" iz rječnika), izdvajanje podpredložaka (":=" operator), korištenje imenovanih konstanti u predlošku. U razredima 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): match point: 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 točka") podudaranje point: case Point(x, y) if x == y: print(f"Y=X na {x}") case Point(x, y): print(f"Nije na dijagonali") CRVENO, ZELENO, PLAVO = 0, 1, 2 boja podudaranja: mala i mala slova CRVENA: ispis(“Vidim crveno!”) mala i mala slova ZELENA: ispis(“Trava je zelena”) mala i mala slova PLAVA: ispis(“Osjećam bluz :(“)

  • Sada je moguće koristiti zagrade u izjavi with za dijeljenje definicije zbirke upravitelja konteksta u više redaka. Također je dopušteno ostaviti zarez iza konačnog upravitelja konteksta u grupi: s ( CtxManager1() kao primjer1, CtxManager2() kao primjer2, CtxManager3() kao primjer3, ): ...
  • Poboljšano izvješćivanje o lokaciji koda pogrešaka povezanih s nezatvorenim zagradama i navodnicima u literalima niza. Na primjer, kada postoji nezatvorena vitičasta zagrada, umjesto izvješćivanja o sintaktičkoj pogrešci u sljedećoj konstrukciji, pokazivač sada ističe početnu vitičastu zagradu i označava da ne postoji zatvarajući blok. Datoteka "example.py", očekivani redak 1 = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' nikad nije bila zatvorena

    Dodane su dodatne specijalizirane sintaktičke poruke o pogrešci: nedostaje simbol ":" ispred bloka i u rječnicima, neodvaja se tuple sa zagradama, nedostaje zarez na popisima, navođenje bloka "pokušaj" bez "osim" i "konačno", korištenje "= " umjesto "= =" u usporedbama, navodeći *-izraze u f-nizovima. Osim toga, osigurava da je cijeli problematični izraz istaknut, a ne samo početak, i jasnije informacije o kontekstu pogrešaka povezanih s netočnim uvlačenjem. >>> def foo(): ... if lel: ... x = 2 datoteka " ", redak 3 x = 2 ^ IndentationError: očekuje se uvučeni blok nakon izjave 'if' u retku 2

    U pogreškama uzrokovanim upisnim pogreškama u imenima atributa i nazivima varijabli u funkciji, ispisuje se preporuka s točnim nazivom. >>>zbirke.namedtoplo Traceback (zadnji zadnji poziv): Datoteka « ", redak 1, in AttributeError: modul 'zbirke' nema atribut 'namedtoplo'. Jeste li mislili: namedtuple?

  • Za alate za otklanjanje pogrešaka i profilere, događaji praćenja dani su s točnim brojevima redaka izvršenog koda.
  • Dodana postavka sys.flags.warn_default_encoding za prikaz upozorenja o mogućim pogreškama povezanim s TextIOWrapper i open() obradom UTF-8 kodiranih datoteka bez izričitog navođenja opcije 'encoding=»utf-8″' (ASCII kodiranje koristi se prema zadanim postavkama) . Novo izdanje također pruža mogućnost određivanja vrijednosti 'encoding="locale"' za postavljanje kodiranja na temelju trenutne lokalne postavke.
  • Modulu za tipkanje dodan je novi operator koji pruža alate za određivanje tipskih napomena, dopuštajući korištenje sintakse “X | Y" za odabir jedne od vrsta (tip X ili tip Y). def kvadrat(broj: int | float) -> int | float: povratni broj ** 2 ekvivalentan je prethodno podržanoj konstrukciji: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • Operator Concatenate i varijabla ParamSpec dodani su modulu za tipkanje, koji vam omogućuju prosljeđivanje dodatnih informacija za statičku provjeru tipa kada koristite Callable. Modul za tipkanje također dodaje posebne vrijednosti TypeGuard za označavanje funkcija zaštite tipa i TypeAlias ​​za eksplicitno definiranje pseudonima tipa. StrCache: TypeAlias ​​​​= 'Cache[str]' # alias tipa
  • Funkcija zip() implementira neobaveznu "strogu" oznaku koja, kada je navedena, provjerava jesu li argumenti koji se ponavljaju iste duljine. >>> popis(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2) , ('c', 3)] >>> popis(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Traceback (posljednji poziv zadnji ): … ValueError: zip() argument 2 duži je od argumenta 1
  • Predlažu se nove ugrađene funkcije aiter() i anext() s implementacijom asinkronih analoga funkcijama iter() i next().
  • Rad konstruktora str(), bytes() i bytearray() pri radu s malim objektima ubrzan je za 30-40%.
  • Smanjen je broj operacija uvoza u runpy modulu. Naredba "python3 -m naziv_modula" sada radi u prosjeku 1.4 puta brže zbog smanjenja uvezenih modula sa 69 na 51.
  • Instrukcija LOAD_ATTR koristi mehanizam predmemoriranja za pojedinačne opkodove, što je omogućilo ubrzanje rada s regularnim atributima do 36%, a s utorima do 44%.
  • Prilikom izgradnje Pythona s opcijom “--enable-optimizations”, sada je omogućen način rada “-fno-semantic-interposition”, koji omogućuje ubrzanje tumača do 30% u usporedbi s izgradnjom s “--enable-shared” ” opcija.
  • Moduli hashlib i ssl dodali su podršku za OpenSSL 3.0.0 i prestali podržavati verzije OpenSSL-a starije od 1.1.1.
  • Uklonjen je stari parser, koji je u prethodnoj grani zamijenjen PEG (Parsing Expression Grammar) parserom. Modul za formatiranje je uklonjen. Parametar petlje je uklonjen iz asyncio API-ja. Metode koje su prethodno bile zastarjele su uklonjene. Py_UNICODE_str* funkcije koje manipuliraju Py_UNICODE* nizovima su uklonjene.
  • Modul distutils je zastario i planirano je za uklanjanje u Pythonu 3.12. Umjesto distutilsa, preporučuje se korištenje modula setuptools, packaging, platform, shutil, subprocess i sysconfig. Struktura wstr u PyUnicodeObjectu je zastarjela i zakazano za uklanjanje.

Izvor: opennet.ru

Dodajte komentar