Lëshimi i gjuhës programuese Python 3.9

Pas një viti zhvillimi prezantuar lëshim i rëndësishëm i gjuhës së programimit Python 3.9. Python 3.9 ishte lëshimi i parë më pas kalim projekti më cikli i ri përgatitjen dhe mbështetjen e publikimeve. Publikimet e reja kryesore tani do të gjenerohen një herë në vit dhe përditësimet korrigjuese do të lëshohen çdo dy muaj. Çdo degë e rëndësishme do të mbështetet për një vit e gjysmë, pas së cilës do të zhvillohen tre vjet e gjysmë të tjera për të rregulluar dobësitë.

Puna për një degë të re tani fillon pesë muaj para daljes së degës tjetër, d.m.th. që përkon me lëshimin e Python 3.9 filloi testimi alfa i degës Python 3.10. Dega e Python 3.10 do të jetë në lëshim alfa për shtatë muaj, gjatë të cilëve do të shtohen veçori të reja dhe do të rregullohen gabimet. Pas kësaj, versionet beta do të testohen për tre muaj, gjatë të cilëve do të ndalohet shtimi i veçorive të reja dhe e gjithë vëmendja do t'i kushtohet rregullimit të gabimeve. Dy muajt e fundit para lirimit, dega do të jetë në fazën e kandidatit për lirim, në të cilën do të kryhet stabilizimi përfundimtar.

ndër shtuar risitë në Python 3.9:

  • Në fjalorët e përcaktuar duke përdorur klasën e integruar dict, u shfaq mbështetje për operatorët e bashkimit "|" dhe "|=" përditësime, të cilat plotësojnë metodat {**d1, **d2} dhe dict.update të propozuara më parë për bashkimin e fjalorëve.

    >>> x = {"key1": "vlera 1 nga x", "ky2": "vlera 2 nga x"}
    >>> y = {"key2": "vlera 2 nga y", "key3": "vlera 3 nga y"}

    >>> x | y
    {'key1': 'vlera 1 nga x', 'çelësi2': 'vlera 2 nga y', 'çelësi3': 'vlera 3 nga y'}

    >>> y | x
    {'key2': 'vlera 2 nga x', 'key3': 'vlera 3 nga y', 'key1': 'vlera1 nga x'}

  • Koleksioni i integruar i llojeve përfshin listë, diktim dhe tuple, të cilat mund të përdoren si lloje bazë pa importuar nga moduli i shtypjes. Ato. në vend të typing.List, typing.Dict dhe typing.Tuple tani mund të specifikoni
    thjesht listoni, diktoni dhe dyfishoni:

    def greet_all(emrat: list[str]) -> Asnjë:
    për emrat në emra:
    print ("Përshëndetje", emri)

  • Janë dhënë mjete fleksibël për shënimin e funksioneve dhe variablave. Për bashkëngjitjen e shënimeve, një tip i ri Annotated është shtuar në modulin e shtypjes, duke zgjeruar llojet ekzistuese me meta të dhëna shtesë që mund të përdoren për analiza statike ose për optimizime të kohës së ekzekutimit. Për të hyrë në meta të dhënat nga kodi, parametri include_extras është shtuar në metodën typing.get_type_hints().

    charType = Shënim[int, ctype("char")] UnsignedShort = Shënim[int, struct2.ctype('H')]

  • E tonifikuar Kërkesat gramatikore për dekoruesit - çdo shprehje e përshtatshme për përdorim në blloqet nëse dhe ndërsa tani mund të përdoret si dekorues. Ndryshimi përmirësoi ndjeshëm lexueshmërinë e kodit PyQt5 dhe thjeshtoi mirëmbajtjen e këtij moduli:

    ishte:
    button_0 = butona[0] @button_0.clicked.connect

    Tani mund të shkruani:
    @buttons[0].klikuar.lidh

  • Tek biblioteka standarde shtuar modul zoneinfo, i cili përfshin informacion nga baza e të dhënave të zonës kohore IANA.

    >>> nga zoneinfo import ZoneInfo
    >>> nga datatime import datatime, timedelta
    >>> # Ora verore
    >>> dt = data kohë (2020, 10, 31, 12, tzinfo=ZoneInfo ("America/Los_Angeles"))
    >>> print (dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Koha standarde
    >>> dt += kohore(ditë=7)
    >>> print (dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tzname())
    PST

  • U shtua moduli graphlib, në të cilin zbatuar mbështetje për renditjen topologjike të grafikëve.
  • Propozuar metoda të reja për heqjen e parashtesave dhe mbaresave të rreshtave - str.removeprefix(prefiks) dhe str.removesuffix(prapashtesë). Metodat janë shtuar në objektet str, bajt, bytearray dhe koleksione.UserString.

    >>> s = "FooBar"
    >>> s.removeprefix("Foo")
    'Bar'

  • Të përfshirë analizues i ri PEG (Parsing Expression Grammar), i cili zëvendësoi analizuesin LL (1). Përdorimi i analizuesit të ri bëri të mundur heqjen e disa "hackave" të përdorura për të anashkaluar kufizimet në LL(1) dhe uli ndjeshëm kostot e punës për mirëmbajtjen e analizuesit. Për sa i përket performancës, analizuesi i ri është afërsisht në të njëjtin nivel me ai i mëparshmi, por është dukshëm përpara tij për sa i përket fleksibilitetit, gjë që ju lejon të ndiheni më të lirë kur hartoni veçori të reja gjuhësore. Kodi i vjetër i analizuesit ruhet për momentin dhe mund të kthehet duke përdorur flamurin "-X oldparser" ose ndryshoren e mjedisit "PYTHONOLDPARSER=1", por do të hiqet në versionin 3.10.
  • Me kusht aftësia për metodat e zgjerimit C për të aksesuar gjendjen e moduleve në të cilat ato janë përcaktuar duke përdorur referencë direkte të treguesit në vend të kërkimit të gjendjes së modulit duke përdorur funksionin PyState_FindModule. Ndryshimi ju lejon të rrisni performancën e moduleve C duke reduktuar ose eliminuar plotësisht shpenzimet e përgjithshme të kontrollit të gjendjes së modulit. Për të lidhur një modul me një klasë, propozohet funksioni C PyType_FromModuleAndSpec(), për të marrë modulin dhe gjendjen e tij, propozohen funksionet C PyType_GetModule() dhe PyType_GetModuleState() dhe për të siguruar një metodë me akses në klasë. në të cilin është përcaktuar, propozohen funksioni C PyCMethod dhe flamuri METH_METHOD. .
  • Mbledhës plehrash dorëzuar nga mbyllja e koleksioneve që përmbajnë objekte të ringjallura që mbeten të aksesueshme nga jashtë pas ekzekutimit të finalizuesit.
  • Metoda e shtuar os.pidfd_open, i cili lejon që nënsistemi i kernel Linux "pidfd" të përdoret për të trajtuar situatën e ripërdorimit PID (pidfd lidhet me një proces specifik dhe nuk ndryshon, ndërsa një PID mund të lidhet me një proces tjetër pasi procesi aktual i lidhur me atë PID përfundon ).
  • Mbështetja për specifikimin Unicode është përditësuar në versionin 13.0.0.
  • Eleminuar rrjedhje e kujtesës kur rifilloni interpretuesin Python në të njëjtin proces.
  • Performanca e gamës së llojeve të integruara, tuple, set, ngrirë, list dhe dict është optimizuar. zbatuar përmes përdorimit të protokollit të shkurtoreve Vectorcall për akses më të shpejtë në objektet e shkruara në gjuhën C.
  • Modulet _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operatori, burimi, koha dhe _weakref janë ngarkuar nga inicializimi në disa faza.
  • Modulet standarde të bibliotekës audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios dhe zlib janë konvertuar në përdorim të kufizuar ABI e qëndrueshme, i cili zgjidh problemin e funksionimit të asambleve të moduleve shtesë për versione të ndryshme të Python (kur përditësoni versionin, nuk ka nevojë të rindërtoni module shtesë, dhe modulet e përpiluara për 3.9 do të mund të funksionojnë në degën 3.10).
  • Moduli asyncio ka një mbështetje të vjetëruar për parametrin reuse_address për shkak të problemeve të mundshme të sigurisë (përdorimi i SO_REUSEADDR për UDP në Linux lejon procese të ndryshme të bashkojnë prizat e dëgjimit në një portë UDP).
  • Janë shtuar optimizime të reja, për shembull, performanca e përmirësuar e mbajtësve të sinjalit në aplikacionet me shumë fije, shpejtësia e rritur e modulit të nënprocesit në mjedisin FreeBSD dhe caktimi më i shpejtë i variablave të përkohshëm (caktimi i një ndryshoreje në shprehjen "for y në [expr ]” është tani po aq performuese sa shprehja “y = expr” “). Në përgjithësi, shumica e testeve shfaqje ulje e performancës në krahasim me degën 3.8 (përshpejtimi vërehet vetëm në testet write_local dhe write_deque):

    Versioni i Python 3.4 3.5 3.6 3.7 3.8 3.9
    ———————————

    Qasja e leximit të ndryshores dhe atributit:
    read_local 7.1 7.1 5.4 5.1 3.9 4.0
    lexo_jolokale 7.1 8.1 5.8 5.4 4.4 4.8
    read_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6
    read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
    read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    read_namedtuple 73.8 57.5 ​​45.0 46.8 18.4 23.2
    metoda e leximit_bound 37.6 37.9 29.6 26.9 27.7 45.9

    Qasja e shkrimit të ndryshores dhe atributit:
    shkruaj_lokal 8.7 9.3 5.5 5.3 4.3 4.2
    shkruani_jolokale 10.5 11.1 5.6 5.5 4.7 4.9
    shkrim_global 19.7 21.2 18.0 18.0 15.8 17.2
    write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Qasja për lexim në strukturën e të dhënave:
    lista_lexo 24.2 24.5 20.8 20.8 19.0 21.1
    read_deque 24.7 25.5 20.2 20.6 19.8 21.6
    lexo_dikt 24.3 25.7 22.3 23.0 21.0 22.5
    read_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Qasja e shkrimit në strukturën e të dhënave:
    lista_shkruaj 27.1 28.5 22.5 21.6 20.0 21.6
    shkrim_deque 28.7 30.1 22.7 21.8 23.5 23.2
    shkrim_dikt 31.4 33.3 29.3 29.2 24.7 27.8
    shkrim_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Operacionet e stivës (ose radhës):
    list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
    deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
    deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5

    Cikli i kohës:
    lak_lart 0.5 0.6 0.4 0.3 0.3 0.3

  • U hoq shumë funksione dhe metoda të Python 2.7 që më parë ishin zhvlerësuar dhe rezultuan në një Paralajmërim Deprecation në versionin e mëparshëm, duke përfshirë metodën unescape() në html.parser.HTMLParser,
    tostring() dhe fromstring() në array.array, isAlive() në threading.Thread, getchildren() dhe getiterator() në ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() dhe base64.decodestring().

Burimi: opennet.ru

Shto një koment