Eldono de la programlingvo Python 3.10

Post jaro da evoluo, la grava eldono de la programlingvo Python 3.10 estas prezentita. La nova branĉo estos subtenata dum unu kaj duono jaro, post kiu dum aliaj tri jaroj kaj duono, korektoj estos generitaj por ke ĝi eliminu vundeblecojn.

Samtempe komenciĝis alfa-testado de la branĉo Python 3.11 (laŭ la nova disvolva horaro, laboro pri nova branĉo komenciĝas kvin monatojn antaŭ la liberigo de la antaŭa branĉo kaj atingas la alfa-testan stadion en la tempo de la venonta eldono. ). La branĉo Python 3.11 estos en alfa-eldono dum sep monatoj, dum kiuj novaj funkcioj estos aldonitaj kaj cimoj riparitaj. Post ĉi tio, beta-versioj estos testitaj dum tri monatoj, dum kiuj aldoni novajn funkciojn estos malpermesita kaj la tuta atento estos pagita por ripari erarojn. Dum la lastaj du monatoj antaŭ la liberigo, la branĉo estos en la eldonkandidata stadio, ĉe kiu fina stabiligo estos farita.

Novaj aldonoj al Python 3.10 inkluzivas:

  • Efektivigitaj "matĉaj" kaj "kazaj" funkciigistoj por padronkongruo, kiuj plibonigas kodlegeblecon, simpligas kongruon de arbitraj Python-objektoj kaj pliigas kodfidindecon per progresinta senmova tipkontrolado. La efektivigo estas tre kiel la "matĉa" funkciigisto disponigita en Scala, Rust, kaj F#, kiu komparas la rezulton de precizigita esprimo kun listo de ŝablonoj listigitaj en blokoj bazitaj sur la "kaza" funkciigisto.

    def http_eraro (stato): kongrua stato: kazo 400: reveni "Malbona peto" kazo 401|403|404: reveni "Ne permesite" kazo 418: reveni "Mi estas tekruĉo" kazo _: reveni "Io alia"

    Vi povas malpaki objektojn, opoj, listojn kaj arbitrajn sekvencojn por ligi variablojn bazitajn sur ekzistantaj valoroj. Estas permesite difini nestitajn ŝablonojn, uzi pliajn "se" kondiĉojn en la ŝablono, uzi maskojn ("[x, y, *rest]"), ŝlosil/valorajn mapadojn (ekzemple, {"bandwidth": b, "latency" ”: l} por ĉerpi "bendolarĝon" kaj "latenteco" valorojn el vortaro), ĉerpi subŝablonojn (":=" operatoro), uzi nomitajn konstantojn en ŝablono. En klasoj, eblas personecigi kongruan konduton uzante la metodon "__match__()".

    el datumklasoj importu datumklason @dataclass klaso Punkto: x: int y: int def whereis(punkto): kongrua punkto: case Point(0, 0): print("Origino") case Point(0, y): print(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Ie aliloke") case _: print("Ne punkto") kongruo punkto: kazo Punkto(x, y) se x == y: print(f"Y=X ĉe {x}") case Punkto(x, y): print(f"Ne sur la diagonalo") RUĜA, VERDA, BLUA = 0, 1, 2 kongruas kun koloro: case RUĜA: print(“Mi vidas ruĝan!”) case VERDA: print(“Herbo estas verda”) case BLUE: print(“Mi sentas la bluson :(“)

  • Nun eblas uzi krampojn en la kun deklaro por dividi la difinon de kolekto de kuntekstaj administrantoj tra pluraj linioj. Estas ankaŭ permesite lasi komon post la fina kunteksta administrilo en la grupo: kun ( CtxManager1() kiel ekzemplo1, CtxManager2() kiel ekzemplo2, CtxManager3() kiel ekzemplo3, ): ...
  • Plibonigita raportado de la kodloko de eraroj rilataj al nefermitaj krampoj kaj citaĵoj en kordaj literaloj. Ekzemple, kiam estas nefermita krampo, anstataŭ raporti sintaksan eraron en la sekva konstrukcio, la montrilo nun elstarigas la malferman krampon kaj indikas ke ekzistas neniu ferma bloko. Dosiero "example.py", linio 1 atendita = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' neniam estis fermita

    Aldonitaj kromaj fakaj sintaksaj erarmesaĝoj: mankas ":" simbolo antaŭ bloko kaj en vortaroj, ne apartigi opon per krampoj, mankas komo en listoj, specifi "provu" blokon sen "krom" kaj "fine", uzante "=". " anstataŭ "= =" en komparoj, specifante *-esprimojn en f-ĉenoj. Krome, ĝi certigas ke la tuta problema esprimo estas elstarigita, ne nur la komenco, kaj pli eksplicitaj informoj pri la kunteksto de eraroj asociitaj kun malĝusta indentaĵo. >>> def foo(): ... if lel: ... x = 2 Dosiero " ", linio 3 x = 2 ^ IndentationError: atendis indentan blokon post 'se' deklaro en linio 2

    En eraroj kaŭzitaj de tajperaroj en la nomoj de atributoj kaj variablonomoj en funkcio, rekomendo kun la ĝusta nomo estas eligita. >>> collections.namedtoplo Traceback (plej lasta voko lasta): Dosiero « ", linio 1, en AttributeError: modulo 'kolektoj' havas neniun atributon 'namedtoplo'. Ĉu vi volis diri: namedtuple?

  • Por sencimigaj iloj kaj profililoj, spurokazaĵoj estas provizitaj per la precizaj linionombroj de efektivigita kodo.
  • Aldonita la agordo sys.flags.warn_default_encoding por montri averton pri eblaj eraroj asociitaj kun TextIOWrapper kaj open() prilaborado de UTF-8-kodigitaj dosieroj sen eksplicite specifi la opcion 'encoding=»utf-8″' (ASCII-kodado estas uzata defaŭlte) . La nova eldono ankaŭ disponigas la kapablon specifi 'encoding="locale"' valoron por agordi la kodigon bazitan sur la nuna loko.
  • Nova operatoro estis aldonita al la tajpa modulo, kiu provizas ilojn por specifi tipajn komentadojn, permesante la uzon de la sintakso “X | Y" por elekti unu el la tipoj (X-tipo aŭ Y-tipo). def kvadrato (nombro: int | float) -> int | float: redona nombro ** 2 estas ekvivalenta al la antaŭe subtenata konstrukcio: def square(nombro: Union[int, float]) -> Union[int, float]: redona nombro ** 2
  • La Operatoro Concatenate kaj la variablo ParamSpec estis aldonitaj al la tajpa modulo, kiuj ebligas al vi transdoni pliajn informojn por statika tipo-kontrolado kiam vi uzas Callable. La tajpa modulo ankaŭ aldonas specialajn valorojn TypeGuard por komenti tipprotektajn funkciojn kaj TypeAlias ​​por eksplicite difini tipan kaŝnomon. StrCache: TypeAlias ​​​​= 'Kaŝmemoro[str]' # tipa kaŝnomo
  • La funkcio zip() efektivigas laŭvolan "striktan" flagon, kiu, kiam specifite, kontrolas ĉu la ripetataj argumentoj estas la sama longo. >>> listo(zip(('a', 'b', 'c'), (1, 2, 3), strikta=Vera)) [('a', 1), ('b', 2) , ('c', 3)] >>> listo(zip(gamo(3), ['kotizo', 'fi', 'fo', 'fum'], strikta=Vera)) Traceback (plej lastatempa voko lasta ): … Valoreraro: zip() argumento 2 estas pli longa ol argumento 1
  • Novaj enkonstruitaj funkcioj aiter() kaj anext() estas proponitaj kun la efektivigo de nesinkronaj analogoj al la funkcioj iter() kaj next().
  • La laboro de la konstrukciistoj str(), bytes() kaj bytearray() kiam oni laboras kun malgrandaj objektoj akceliĝis je 30-40%.
  • Reduktis la nombron da importaj operacioj en la runpy-modulo. La komando "python3 -m module_name" nun funkcias averaĝe 1.4 fojojn pli rapide pro la redukto de importitaj moduloj de 69 al 51.
  • La instrukcio LOAD_ATTR uzas kaŝmemoran mekanismon por individuaj opkodoj, kiu ebligis akceli laboron kun regulaj atributoj ĝis 36%, kaj kun slotoj ĝis 44%.
  • Konstruante Python kun la opcio "--enable-optimizations", la reĝimo "-fno-semantic-interposition" nun estas ebligita, kio ebligas akceli la interpretiston ĝis 30% kompare kun konstruado per la "--enable-shared". ” opcio.
  • La hashlib kaj ssl-moduloj aldonis subtenon por OpenSSL 3.0.0 kaj ĉesis subteni OpenSSL-versiojn pli malnovajn ol 1.1.1.
  • La malnova analizilo estis forigita, kiu estis anstataŭigita en la antaŭa branĉo per la analizilo PEG (Parsing Expression Grammar). La formita modulo estis forigita. La buklo-parametro estis forigita de la asincio-API. Metodoj, kiuj antaŭe estis malrekomenditaj, estis forigitaj. La funkcioj Py_UNICODE_str*, kiuj manipulas Py_UNICODE*-ĉenojn, estis forigitaj.
  • La distutils-modulo estis malrekomendita kaj estas planita por forigo en Python 3.12. Anstataŭ distutils, oni rekomendas uzi la setuptools, pakado, platformo, shutil, subprocess kaj sysconfig moduloj. La wstr-strukturo en PyUnicodeObject estis malrekomendita kaj planita por forigo.

fonto: opennet.ru

Aldoni komenton