Izdaja programskega jezika Python 3.10

Po letu razvoja je predstavljena pomembna izdaja programskega jezika Python 3.10. Nova veja bo podprta eno leto in pol, nato pa se bo razvijala še tri leta in pol za odpravo ranljivosti.

Hkrati se je začelo alfa testiranje veje Python 3.11 (v skladu z novim urnikom razvoja se delo na novi veji začne pet mesecev pred izdajo prejšnje veje in doseže fazo alfa testiranja do naslednje izdaje ). Podružnica Python 3.11 bo v izdaji alfa sedem mesecev, v tem času pa bodo dodane nove funkcije in odpravljene napake. Po tem bodo beta različice testirane tri mesece, med katerimi bo prepovedano dodajanje novih funkcij, vsa pozornost pa bo namenjena odpravljanju napak. Zadnja dva meseca pred sprostitvijo bo veja v fazi kandidata za sprostitev, na kateri bo izvedena končna stabilizacija.

Novi dodatki k Pythonu 3.10 vključujejo:

  • Implementirani operatorji "match" in "case" za ujemanje vzorcev, ki izboljšajo berljivost kode, poenostavijo ujemanje poljubnih objektov Python in povečajo zanesljivost kode z naprednim statičnim preverjanjem tipa. Izvedba je zelo podobna operatorju "ujemanja", ki je na voljo v Scala, Rust in F#, ki primerja rezultat podanega izraza s seznamom vzorcev, navedenih v blokih, na podlagi operatorja "case".

    def http_error(status): stanje ujemanja: case 400: vrni “Slaba zahteva” case 401|403|404: vrni “Ni dovoljeno” case 418: vrni “Jaz sem čajnik” case _: vrni “Nekaj ​​drugega”

    Razpakirate lahko predmete, tuple, sezname in poljubna zaporedja, da povežete spremenljivke na podlagi obstoječih vrednosti. Dovoljeno je definirati ugnezdene predloge, uporabiti dodatne pogoje »če« v predlogi, uporabiti maske (»[x, y, *rest]«), preslikave ključ/vrednost (na primer {»pasovna širina«: b, »zakasnitev ”: l} za ekstrahiranje vrednosti "pasovne širine" in "zakasnitve" iz slovarja), ekstrahiranje podpredlog (operator":="), uporaba imenovanih konstant v predlogi. V razredih je mogoče prilagoditi vedenje ujemanja z uporabo 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("Nekje drugje") case _: print("Ni točka") match točka: case Point(x, y) if x == y: print(f"Y=X pri {x}") case Point(x, y): print(f"Ni na diagonali") RDEČA, ZELENA, MODRA = 0, 1, 2 barva ujemanja: male črke RDEČA: tisk ("Vidim rdečo!") male črke ZELENA: tisk ("Trava je zelena") male črke MODRA: tisk ("Čutim modrino :(")

  • Zdaj je mogoče uporabiti oklepaje v stavku with za razdelitev definicije zbirke upraviteljev konteksta v več vrstic. Prav tako je dovoljeno pustiti vejico za končnim upraviteljem konteksta v skupini: z ( CtxManager1() kot primer1, CtxManager2() kot primer2, CtxManager3() kot primer3, ): ...
  • Izboljšano poročanje o lokaciji kode napak, povezanih z nezaprtimi oklepaji in narekovaji v literalih nizov. Na primer, če obstaja nezaprt oklepaj, namesto da bi javil sintaktično napako v naslednjem konstruktu, kazalec zdaj osvetli začetni oklepaj in nakazuje, da ni zaključnega bloka. Datoteka "example.py", 1. vrstica je pričakovana = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' ni bil nikoli zaprt

    Dodana dodatna specializirana sporočila o napakah v sintaksi: manjka simbol ":" pred blokom in v slovarjih, neločuje nabora z oklepaji, manjka vejica na seznamih, določa blok "poskusi" brez "razen" in "končno", uporaba "= " namesto "= =" v primerjavah, ki določajo *-izraze v nizih f. Poleg tega zagotavlja, da je poudarjen celoten problematičen izraz, ne le začetek, in bolj eksplicitne informacije o kontekstu napak, povezanih z nepravilnim zamikom. >>> def foo(): ... if lel: ... x = 2 Datoteka " ", vrstica 3 x = 2 ^ IndentationError: pričakovan zamaknjen blok za stavkom "if" v vrstici 2

    Pri napakah, ki jih povzročijo tipkarske napake v imenih atributov in imenih spremenljivk v funkciji, se izpiše priporočilo s pravilnim imenom. >>>zbirke.namedtoplo Traceback (zadnji zadnji klic): Datoteka « ", vrstica 1, v AttributeError: modul 'zbirke' nima atributa 'namedtoplo'. Ste mislili: namedtuple?

  • Za orodja za odpravljanje napak in profilerje so dogodki sledenja na voljo z natančnimi številkami vrstic izvedene kode.
  • Dodana nastavitev sys.flags.warn_default_encoding za prikaz opozorila o morebitnih napakah, povezanih z TextIOWrapper in open(), ki obdeluje datoteke, kodirane z UTF-8, ne da bi izrecno določili možnost 'encoding=»utf-8″' (kodiranje ASCII se uporablja privzeto) . Nova izdaja ponuja tudi možnost podajanja vrednosti 'encoding="locale"' za nastavitev kodiranja na podlagi trenutne področne nastavitve.
  • V modul za tipkanje je bil dodan nov operator, ki ponuja orodja za določanje opomb tipa, kar omogoča uporabo sintakse “X | Y", da izberete eno od vrst (tip X ali tip Y). def kvadrat (število: int | float) -> int | float: vrni številko ** 2 je enakovreden prej podprtemu konstruktu: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • Operator Concatenate in spremenljivka ParamSpec sta bila dodana v modul za tipkanje, ki omogočata posredovanje dodatnih informacij za statično preverjanje tipa, ko uporabljate Callable. Modul za tipkanje doda tudi posebne vrednosti TypeGuard za označevanje funkcij zaščite tipa in TypeAlias ​​​​za eksplicitno definiranje vzdevka tipa. StrCache: TypeAlias ​​​​= 'Cache[str]' # vzdevek vrste
  • Funkcija zip() implementira izbirno "strogo" zastavico, ki, ko je navedena, preveri, ali so argumenti, ki se ponavljajo, enake dolž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 (najnovejši klic zadnji ): … ValueError: argument zip() 2 je daljši od argumenta 1
  • Predlagane so nove vgrajene funkcije aiter() in anext() z implementacijo asinhronih analogov funkcij iter() in next().
  • Delo konstruktorjev str(), bytes() in bytearray() pri delu z majhnimi predmeti se je pospešilo za 30-40%.
  • Zmanjšano število uvoznih operacij v modulu runpy. Ukaz "python3 -m ime_modula" zdaj deluje v povprečju 1.4-krat hitreje zaradi zmanjšanja uvoženih modulov z 69 na 51.
  • Instrukcija LOAD_ATTR uporablja mehanizem predpomnjenja za posamezne opcode, kar je omogočilo pospešitev dela z običajnimi atributi do 36 % in z režami do 44 %.
  • Pri gradnji Pythona z možnostjo “--enable-optimizations” je zdaj omogočen način “-fno-semantic-interposition”, ki omogoča pospešitev tolmača za do 30 % v primerjavi z gradnjo z “--enable-shared” ” možnost.
  • Modula hashlib in ssl sta dodala podporo za OpenSSL 3.0.0 in prenehala podpirati različice OpenSSL, starejše od 1.1.1.
  • Odstranjen je bil stari razčlenjevalnik, ki ga je v prejšnji veji nadomestil razčlenjevalnik PEG (Parsing Expression Grammar). Modul oblikovalnika je bil odstranjen. Parameter zanke je bil odstranjen iz asyncio API. Metode, ki so bile prej opuščene, so bile odstranjene. Funkcije Py_UNICODE_str*, ki manipulirajo z nizi Py_UNICODE*, so bile odstranjene.
  • Modul distutils je bil opuščen in je načrtovan za odstranitev v Python 3.12. Namesto distutils je priporočljivo uporabljati module setuptools, packaging, platform, shutil, subprocess in sysconfig. Struktura wstr v PyUnicodeObject je bila opuščena in načrtovana za odstranitev.

Vir: opennet.ru

Dodaj komentar