Izdanje programskog jezika Python 3.9

Nakon godinu dana razvoja predstavljen značajno izdanje programskog jezika Python 3.9. Python 3.9 je bio prvo izdanje nakon toga tranzicija projekat na novi ciklus priprema i podrška izdanjima. Nova glavna izdanja će se sada generisati jednom godišnje, a ispravna ažuriranja će se objavljivati ​​svaka dva mjeseca. Svaka značajna grana će biti podržana godinu i po, nakon čega će se razvijati još tri i po godine kako bi se popravile ranjivosti.

Radovi na novoj grani sada počinju pet mjeseci prije izlaska sljedeće grane, tj. koji se poklapa sa izdavanjem Pythona 3.9 započeo alfa testiranje grane Python 3.10. Grana Python 3.10 će biti u alfa izdanju sedam mjeseci, tokom kojih će biti dodane nove funkcije i ispravljene greške. Nakon toga, beta verzije će biti testirane tri mjeseca, tokom kojih će dodavanje novih funkcija biti zabranjeno i sva pažnja će biti posvećena ispravljanju grešaka. Posljednja dva mjeseca prije puštanja, grana će biti u fazi kandidata za oslobađanje, u kojoj će se izvršiti konačna stabilizacija.

među dodano inovacije u Pythonu 3.9:

  • U rječnicima definiranim korištenjem ugrađene klase dict, pojavila podrška za operatore spajanja "|" i "|=" ažuriranja, koja dopunjuju metode {**d1, **d2} i dict.update koje su prethodno predložene za spajanje rječnika.

    >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    >>> y = {"ključ2": "vrijednost2 od y", "ključ3": "vrijednost3 od y"}

    >>> x | y
    {'ključ1': 'vrijednost1 od x', 'ključ2': 'vrijednost2 od y', 'ključ3': 'vrijednost3 od y'}

    >>> y | x
    {'ključ2': 'vrijednost2 od x', 'ključ3': 'vrijednost3 od y', 'ključ1': 'vrijednost1 od x'}

  • Ugrađena kolekcija tipova uključuje listu, dict i tuple, koji se mogu koristiti kao osnovni tipovi bez uvoza iz modula za kucanje. One. umjesto typing.List, typing.Dict i typing.Tuple sada možete specificirati
    samo navedite, dict i tuple:

    def greet_all(namena: lista[str]) -> Ništa:
    za ime u imenima:
    print("Zdravo", ime)

  • Obezbeđene su fleksibilni alati za označavanje funkcija i varijabli. Za pričvršćivanje napomena, novi anotirani tip je dodat u modul za kucanje, proširujući postojeće tipove dodatnim metapodacima koji se mogu koristiti za statičku analizu ili za optimizaciju vremena izvršavanja. Za pristup metapodacima iz koda, parametar include_extras je dodan metodi typing.get_type_hints().

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

  • Ublaženo gramatički zahtjevi za dekoratore - svaki izraz pogodan za upotrebu u if i while blokovima sada se može koristiti kao dekorator. Promjena je značajno poboljšala čitljivost PyQt5 koda i pojednostavila održavanje ovog modula:

    Bilo je:
    button_0 = dugmad[0] @button_0.clicked.connect

    Sada možete napisati:
    @buttons[0].clicked.connect

  • U standardnu ​​biblioteku dodano modul zoneinfo, koji uključuje informacije iz IANA baze podataka vremenskih zona.

    >>> iz zoneinfo import ZoneInfo
    >>> iz datetime import datetime, timedelta
    >>> # Ljetno vrijeme
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Amerika/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Standardno vrijeme
    >>> dt += timedelta(dana=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

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

  • Dodan graphlib modul, u kojem implementirano podrška za topološko sortiranje grafova.
  • Predloženo nove metode za uklanjanje prefiksa i završetaka reda - str.removeprefix(prefix) i str.removesuffix(suffix). Metode su dodate str, bytes, bytearray i collections.UserString objektima.

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

  • Uključeno novi parser PEG (Parsing Expression Grammar), koji je zamijenio parser LL(1). Upotreba novog parsera je omogućila da se otarasite nekih od „hakova“ koji se koriste za zaobilaženje ograničenja u LL(1) i značajno smanjili troškove rada za održavanje parsera. U pogledu performansi, novi parser je približno na istom nivou kao i prethodni, ali je znatno ispred njega u pogledu fleksibilnosti, što vam omogućava da se osjećate slobodnije pri dizajniranju novih jezičkih karakteristika. Stari kod parsera je za sada zadržan i može se vratiti pomoću oznake "-X oldparser" ili varijable okruženja "PYTHONOLDPARSER=1", ali će biti uklonjen u izdanju 3.10.
  • Pod uslovom mogućnost za metode proširenja C da pristupe stanju modula u kojem su definirani koristeći direktnu dereferenciju pokazivača umjesto traženja stanja modula pomoću funkcije PyState_FindModule. Promjena vam omogućava da povećate performanse C modula tako što ćete smanjiti ili potpuno eliminirati troškove provjere stanja modula. Da bi se modul pridružio klasu, predložena je C-funkcija PyType_FromModuleAndSpec(), da bi se dobio modul i njegovo stanje, predložene su C-funkcije PyType_GetModule() i PyType_GetModuleState() i da bi se omogućila metoda s pristupom klasi u kojem je definirana, predložene su C-funkcija PyCMethod i METH_METHOD zastavica.
  • Sakupljač smeća isporučeno od zaključavanja kolekcija koje sadrže reanimirane objekte koji ostaju eksterno dostupni nakon pokretanja finalizatora.
  • Dodata metoda os.pidfd_open, koji omogućava da se podsistem jezgre Linuxa "pidfd" koristi za rješavanje situacije ponovnog korištenja PID-a (pidfd je povezan s određenim procesom i ne mijenja se, dok se PID može povezati s drugim procesom nakon što se trenutni proces povezan s tim PID-om okonča ).
  • Podrška za Unicode specifikaciju je ažurirana na verziju 13.0.0.
  • Eliminisano curenje memorije prilikom ponovnog pokretanja Python interpretera u istom procesu.
  • Optimizirane su performanse ugrađenih tipova range, tuple, set, frozenset, list i dict. implementirano korištenjem protokola prečice Vectorcall za brži pristup objektima napisanim u jeziku C.
  • Iz inicijalizacija u nekoliko faza.
  • Standardni bibliotečki moduli audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios i zlib su pretvoreni za ograničenu upotrebu stabilan ABI, koji rješava problem operativnosti sklopova modula proširenja za različite verzije Pythona (prilikom ažuriranja verzije nema potrebe za ponovnom izgradnjom modula proširenja, a moduli kompajlirani za 3.9 će moći raditi u grani 3.10).
  • Asyncio modul je zastario podršku za parametar reuse_address zbog potencijalnih sigurnosnih problema (korištenje SO_REUSEADDR za UDP na Linuxu omogućava različitim procesima da pridruže prislušne utičnice na UDP port).
  • Dodane su nove optimizacije, na primjer, poboljšane performanse rukovatelja signalom u višenitnim aplikacijama, povećana brzina modula podprocesa u FreeBSD okruženju i brže dodjeljivanje privremenih varijabli (dodjela varijable u izrazu „za y u [expr ]” je sada jednako učinkovit kao izraz “y = expr” "). Općenito, većina testova pokazati smanjenje performansi u poređenju sa granom 3.8 (ubrzavanje se primećuje samo u testovima write_local i write_deque):

    Python verzija 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Pristup za čitanje varijabli i atributa:
    read_local 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 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
    read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Pristup za pisanje varijable i atributa:
    write_local 8.7 9.3 5.5 5.3 4.3 4.2
    write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    write_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

    Pristup za čitanje strukture podataka:
    read_list 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
    read_dict 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

    Pristup za pisanje strukture podataka:
    write_list 27.1 28.5 22.5 21.6 20.0 21.6
    write_deque 28.7 30.1 22.7 21.8 23.5 23.2
    write_dict 31.4 33.3 29.3 29.2 24.7 27.8
    write_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Stog (ili red) operacije:
    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

    Vremenska petlja:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Uklonjeno mnoge funkcije i metode Python 2.7 koje su prethodno bile zastarjele i rezultirale su DeprecationWarningom u prethodnom izdanju, uključujući metodu unescape() u html.parser.HTMLParser,
    tostring() i fromstring() u array.array, isAlive() u threading.Thread, getchildren() i getiterator() u ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() i base64.decodestring().

izvor: opennet.ru

Dodajte komentar