Izdanje programskog jezika Python 3.9

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

Rad na novoj grani sada počinje pet mjeseci prije puštanja sljedeće grane, tj. poklapa se s izdanjem Pythona 3.9 počeo alfa testiranje grane Python 3.10. Ogranak Python 3.10 bit će u alfa izdanju sedam mjeseci, tijekom kojih će se dodavati nove značajke i ispravljati greške. Nakon toga, beta verzije će se testirati tri mjeseca, tijekom kojih će dodavanje novih značajki biti zabranjeno i sva će se pozornost posvetiti ispravljanju grešaka. Posljednja dva mjeseca prije puštanja grana će biti u fazi kandidata za puštanje, pri čemu će se izvršiti konačna stabilizacija.

među dodao inovacije u Pythonu 3.9:

  • U rječnicima definiranim pomoću ugrađene klase dict, pojavio podrška za operatore spajanja "|" i "|=" ažuriranja, koja nadopunjuju metode {**d1, **d2} i dict.update prethodno predložene za spajanje rječnika.

    >>> x = {"ključ1": "vrijednost1 od x", "ključ2": "vrijednost2 od x"}
    >>> y = {"ključ2": "vrijednost2 iz y", "ključ3": "vrijednost3 iz y"}

    >>> x | g
    {'key1': 'vrijednost1 od x', 'key2': 'vrijednost2 od y', 'key3': 'vrijednost3 od y'}

    >>> y | x
    {'key2': 'vrijednost2 od x', 'key3': 'vrijednost3 od y', 'key1': 'vrijednost1 od x'}

  • Ugrađena zbirka tipova uključuje popis, dikt i tuple, koji se mogu koristiti kao osnovni tipovi bez uvoza iz modula za tipkanje. Oni. umjesto tipkanja.List, tipkanja.Dict i tipkanja.Torka koju sada možete navesti
    samo popis, dict i tuple:

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

  • su osigurani fleksibilni alati za označavanje funkcija i varijabli. Za prilaganje bilješki, novi Annotated tip dodan je modulu za tipkanje, proširujući postojeće tipove s dodatnim metapodacima koji se mogu koristiti za statičku analizu ili za optimizaciju vremena izvođenja. Za pristup metapodacima iz koda, parametar include_extras dodan je metodi typing.get_type_hints().

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

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

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

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

  • U standardnu ​​knjižnicu dodano modul zoneinfo, koji uključuje podatke iz IANA baze podataka vremenskih zona.

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

    >>> dt.tzname()
    'PDT'

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

    >>> ispis(dt.tzname())
    PST

  • Dodan graphlib modul, u kojem implementiran podrška za topološko sortiranje grafova.
  • Zaprosio nove metode za uklanjanje prefiksa i završetaka redaka - str.removeprefix(prefix) i str.removesuffix(suffix). Metode su dodane objektima str, bytes, bytearray i collections.UserString.

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

  • Uključeni novi parser PEG (Parsing Expression Grammar), koji je zamijenio parser LL(1). Korištenje novog parsera omogućilo je uklanjanje nekih "hakova" korištenih za zaobilaženje ograničenja u LL(1) i značajno smanjilo troškove rada za održavanje parsera. Što se tiče performansi, novi parser je otprilike na istoj razini kao i prethodni, ali je znatno ispred njega u smislu fleksibilnosti, što vam omogućuje da se osjećate slobodnije pri dizajniranju novih jezičnih značajki. Stari kod parsera za sada je 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 uvjetom mogućnost da metode C proširenja pristupe stanju modula u kojem su definirani korištenjem izravne dereferencije pokazivača umjesto traženja stanja modula pomoću funkcije PyState_FindModule. Promjena vam omogućuje da povećate performanse C modula smanjenjem ili potpunim uklanjanjem dodatnih troškova provjere stanja modula. Za povezivanje modula s klasom, predlaže se C-funkcija PyType_FromModuleAndSpec(), za dobivanje modula i njegovog stanja, predlažu se C-funkcije PyType_GetModule() i PyType_GetModuleState(), a za pružanje metode s pristupom klasi u kojem je definirana, predložena je C-funkcija PyCMethod i oznaka METH_METHOD. .
  • Sakupljač smeća dostavljeno od zaključavanja zbirki koje sadrže reanimirane objekte koji ostaju dostupni izvana nakon pokretanja finalizatora.
  • Dodana metoda os.pidfd_open, koji omogućuje podsustavu jezgre Linuxa "pidfd" da se koristi za obradu situacije ponovne upotrebe PID-a (pidfd je povezan s određenim procesom i ne mijenja se, dok se PID može povezati s drugim procesom nakon što trenutni proces povezan s tim PID-om završi ).
  • Podrška za Unicode specifikaciju ažurirana je na verziju 13.0.0.
  • Eliminiran curenje memorije prilikom reinicijalizacije Python interpretera u istom procesu.
  • Izvedba ugrađenih tipova range, tuple, set, frozenset, list i dict je optimizirana. implementiran korištenjem Vectorcall protokola prečaca za brži pristup objektima napisanim u C jeziku.
  • Moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time i _weakref učitavaju se iz inicijalizacija u nekoliko faza.
  • Moduli standardne knjižnice audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios i zlib pretvoreni su u 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 kompilirani za 3.9 moći će raditi u grani 3.10).
  • Modul asyncio obustavio je podršku za parametar reuse_address zbog mogućih sigurnosnih problema (upotreba SO_REUSEADDR za UDP na Linuxu omogućuje različitim procesima da prikače utičnice za slušanje na UDP priključak).
  • Dodane su nove optimizacije, na primjer, poboljšana izvedba rukovatelja signalima u aplikacijama s više niti, povećana brzina modula podprocesa u FreeBSD okruženju i brže dodjeljivanje privremenih varijabli (dodjeljivanje varijable u izrazu “za y u [izraz) ]” sada je jednako učinkovit kao izraz “y = expr”"). Općenito, većina testova predstava smanjenje performansi u usporedbi s granom 3.8 (ubrzanje se opaža samo u testovima write_local i write_deque):

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

    Pristup čitanju 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 pisanju varijabli i atributa:
    pisanje_lokalno 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 čitanju 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 pisanju strukture podataka:
    spisak_pisanja 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

    Operacije stoga (ili reda čekanja):
    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 Pythona 2.7 koje su prethodno bile zastarjele i rezultirale su DeprecationWarning 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