Liberasyon langaj pwogramasyon Python 3.10

Apre yon ane nan devlopman, yo prezante lage enpòtan nan langaj pwogramasyon Python 3.10. Nouvo branch lan pral sipòte pou yon ane edmi, apre sa pou yon lòt twa ane edmi, yo pral pwodwi ranje pou li elimine frajilite yo.

An menm tan an, tès alfa nan branch Python 3.11 la te kòmanse (an akò ak nouvo orè devlopman an, travay sou yon nouvo branch kòmanse senk mwa anvan liberasyon branch anvan an epi li rive nan etap tès alfa a nan moman pwochen lage a. ). Branch Python 3.11 la pral nan lage alfa pandan sèt mwa, pandan y ap ajoute nouvo karakteristik ak ensèk yo fikse. Apre sa, vèsyon beta yo pral teste pandan twa mwa, pandan sa yo pral entèdi ajoute nouvo karakteristik epi yo pral peye tout atansyon a repare pinèz. Pou de mwa ki sot pase yo anvan liberasyon an, branch lan pral nan etap kandida lage, nan ki estabilizasyon final la pral fèt.

Nouvo ajoute nan Python 3.10 enkli:

  • Enplemante operatè "match" ak "ka" pou matche modèl, ki amelyore lizibilite kòd, senplifye matche objè abitrè Python, ak ogmante fyab kòd atravè chèk avanse kalite estatik. Aplikasyon an sanble ak operatè "match" yo bay nan Scala, Rust, ak F#, ki konpare rezilta yon ekspresyon espesifye ak yon lis modèl ki nan lis nan blòk ki baze sou operatè "ka" la.

    def http_error(status): match status: ka 400: retounen "Move demann" ka 401|403|404: retounen "Pa pèmèt" ka 418: retounen "Mwen se yon teyè" ka _: retounen "Yon lòt bagay"

    Ou ka depake objè, tuple, lis, ak sekans abitrè pou mare varyab ki baze sou valè ki egziste deja. Li pèmèt yo defini modèl imbrike, sèvi ak kondisyon adisyonèl "si" nan modèl la, sèvi ak mask ("[x, y, * rès]"), kat kle/valè (pa egzanp, {"bandwidth": b, "latency". ”: l} pou ekstrè valè "bandwidth" ak "latansi" nan yon diksyonè), ekstrè submodèl (":=" operatè), sèvi ak konstan yo nonmen nan yon modèl. Nan klas yo, li posib pou pèsonalize konpòtman matche ak metòd "__match__()".

    soti nan klas done enpòte klas done @ klas klas Pwen: x: int y: int def whereis(pwen): pwen matche: ka Point(0, 0): print("Orijin") case Point(0, y): print(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("yon lot kote") case _: print("Pa yon pwen") matche pwen: ka Pwen(x, y) si x == y: enprime(f"Y=X nan {x}") ka Pwen(x, y): enprime(f"Pa sou dyagonal la") WOUJ, VÈT, BLUE = 0, 1, 2 matche koulè: ka RED: enprime(“Mwen wè wouj!”) ka VÈT: enprime(“Zèb vèt”) ka BLUE: enprime(“Mwen santi blues la :(“)

  • Kounye a li posib pou itilize parantèz nan deklarasyon an pou divize definisyon yon koleksyon manadjè kontèks atravè plizyè liy. Li gen dwa tou kite yon vigil apre manadjè kontèks final la nan gwoup la: ak ( CtxManager1 () kòm egzanp1, CtxManager2 () kòm egzanp2, CtxManager3 () kòm egzanp3, ): ...
  • Amelyore rapò sou kote kòd erè ki gen rapò ak aparèy òtopedik ki pa fèmen ak quotes nan literal fisèl. Pou egzanp, lè gen yon atèl ki pa fèmen, olye pou yo rapòte yon erè sentaks nan konstriksyon sa a, konsèy la kounye a mete aksan sou atèl ouvèti a epi li endike ke pa gen okenn blòk fèmen. Fichye "example.py", liy 1 espere = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' pa janm fèmen

    Te ajoute mesaj erè sentaks espesyalize adisyonèl: manke ":" senbòl anvan yon blòk ak nan diksyonè, pa separe yon tuple ak parantèz, manke yon vigil nan lis, espesifye yon blòk "eseye" san "eksepte" ak "finalman", lè l sèvi avèk "= " olye de "= =" nan konparezon, espesifye *-ekspresyon nan f-strings. Anplis de sa, li asire ke tout ekspresyon pwoblèm nan make, pa sèlman kòmansman an, ak plis enfòmasyon eksplisit sou kontèks la nan erè ki asosye ak endentasyon kòrèk. >>> def foo(): … if lel: … x = 2 Fichye “”, liy 3 x = 2 ^ IndentationError: espere yon blòk indentée apre deklarasyon ‘si’ nan liy 2

    Nan erè ki te koze pa typo nan non yo nan atribi ak non varyab nan yon fonksyon, yon rekòmandasyon ak non ki kòrèk la se pwodiksyon. >>> collections.namedtoplo Traceback (pi resan apèl dènye): Fichye "", liy 1, nan AttributeError: modil 'koleksyon' pa gen okenn atribi 'namedtoplo'. Ou te vle di: namedtuple?

  • Pou zouti debogaj ak profiler, evènman tras yo bay nimewo liy egzak kòd egzekite.
  • Te ajoute sys.flags.warn_default_encoding anviwònman pou montre yon avètisman sou erè potansyèl ki asosye ak TextIOWrapper ak open() pwosesis UTF-8 kode fichye san yo pa presize klèman opsyon 'encoding=»utf-8″' (yo itilize kodaj ASCII pa default). Nouvo lage a bay tou kapasite pou presize yon valè 'encoding="locale"' pou mete kodaj ki baze sou lokal aktyèl la.
  • Yon nouvo operatè yo te ajoute nan modil la sezisman, ki bay zouti pou espesifye tip anotasyon, ki pèmèt itilize nan sentaks "X | Y" pou chwazi youn nan kalite yo (tip X oswa kalite Y). def kare (nimewo: int | float) -> int | float: nimewo retounen ** 2 ekivalan a konstriksyon ki te deja sipòte a: def square(nimewo: Union[int, float]) -> Union[int, float]: nimewo retounen ** 2
  • Operatè Concatenate la ak varyab ParamSpec yo te ajoute nan modil la sezisman, ki pèmèt ou pase plis enfòmasyon pou tcheke kalite estatik lè w ap itilize Callable. Modil la sezisman tou ajoute valè espesyal TypeGuard pou anote fonksyon pwoteksyon kalite ak TypeAlias ​​pou defini klèman yon alyas kalite. StrCache: TypeAlias ​​​​= 'Cache[str]' # yon alyas kalite
  • Fonksyon zip() la aplike yon drapo "strik" opsyonèl, ki, lè yo espesifye, tcheke si agiman yo ap repete yo se menm longè. >>> lis(zip(('a', 'b', 'c'), (1, 2, 3), strik = Vrè)) [('a', 1), ('b', 2) , ('c', 3)] >>> lis (zip (ranje (3), ['frè', 'fi', 'fo', 'fum'], strik = Vrè)) Traceback (pi resan apèl dènye ): … ValueError: zip() agiman 2 pi long pase agiman 1
  • Nouvo fonksyon entegre aiter () ak anext () yo pwopoze ak aplikasyon an nan analogue asynchrone nan fonksyon yo iter () ak pwochen ().
  • Travay la nan str (), bytes () ak bytearray () konstrukteur yo lè w ap travay ak ti objè yo te akselere pa 30-40%.
  • Redwi kantite operasyon enpòte nan modil la runpy. Kòmand "python3 -m module_name" kounye a kouri an mwayèn 1.4 fwa pi vit akòz rediksyon modil enpòte soti nan 69 a 51.
  • Enstriksyon LOAD_ATTR la sèvi ak yon mekanis kachèt pou opcodes endividyèl yo, ki te fè li posib pou pi vit travay ak atribi regilye yo jiska 36%, ak fant jiska 44%.
  • Lè w ap konstwi Python ak opsyon "--enable-optimizations", mòd "-fno-semantic-interposition" la kounye a aktive, ki pèmèt akselere entèprèt la jiska 30% konpare ak bati ak "--enable-shared" la. ” opsyon.
  • Modil hashlib ak ssl yo te ajoute sipò pou OpenSSL 3.0.0 epi yo sispann sipòte vèsyon OpenSSL ki pi gran pase 1.1.1.
  • Ansyen parser la te retire, ki te ranplase nan branch anvan an pa analizeur PEG (Parsing Expression Grammar). Yo retire modil fòmatè a. Yo retire paramèt bouk la nan API asyncio la. Yo retire metòd ki te demode anvan. Yo retire fonksyon Py_UNICODE_str* ki manipile kòd Py_UNICODE* yo.
  • Modil distutils la te obsolète epi li pwograme pou retire li nan Python 3.12. Olye de distutils, li rekòmande pou itilize setuptools, emballage, platfòm, Shuil, subprocess ak sysconfig modules. Estrikti wstr nan PyUnicodeObject te obsolète ak pwograme pou retire li.

Sous: opennet.ru

Add nouvo kòmantè