Izdaja programskega jezika Python 3.9

Po letu razvoja predstavljeno pomembna izdaja programskega jezika Python 3.9. Python 3.9 je bila prva izdaja po prehod projekt naprej nov cikel priprava in podpora izdaj. Nove večje izdaje bodo zdaj ustvarjene enkrat letno, popravne posodobitve pa bodo izdane vsaka dva meseca. Vsaka pomembna veja bo podprta eno leto in pol, nato pa se bodo razvijala še tri leta in pol za odpravo ranljivosti.

Delo na novi veji se zdaj začne pet mesecev pred izdajo naslednje veje, tj. sovpada z izdajo Pythona 3.9 začela alfa testiranje veje Python 3.10. Podružnica Python 3.10 bo v izdaji alfa sedem mesecev, v tem času pa bodo dodane nove funkcije in odpravljene napake. Po tem bodo beta različice testirane tri mesece, med katerimi bo prepovedano dodajanje novih funkcij, vsa pozornost pa bo namenjena odpravljanju napak. Zadnja dva meseca pred sprostitvijo bo veja v fazi kandidata za sprostitev, na kateri bo izvedena končna stabilizacija.

med dodano inovacije v Pythonu 3.9:

  • V slovarjih, definiranih z vgrajenim razredom dict, pojavil podpora za operatorje spajanja "|" in "|=" posodobitve, ki dopolnjujejo metode {**d1, **d2} in dict.update, ki so bile predhodno predlagane za združevanje slovarjev.

    >>> x = {"ključ1": "vrednost1 iz x", "ključ2": "vrednost2 iz x"}
    >>> y = {"ključ2": "vrednost2 iz y", "ključ3": "vrednost3 iz y"}

    >>> x | l
    {'key1': 'vrednost1 od x', 'key2': 'vrednost2 od y', 'key3': 'vrednost3 od y'}

    >>> y | x
    {'key2': 'vrednost2 od x', 'key3': 'vrednost3 od y', 'key1': 'vrednost1 od x'}

  • Vgrajena zbirka tipov vključuje seznam, dikt in tuple, ki jih je mogoče uporabiti kot osnovne tipe brez uvoza iz modula za tipkanje. Tisti. namesto tipkanja.List, tipkanja.Dict in tipkanja.Tuple lahko zdaj določite
    samo seznam, dict in tuple:

    def greet_all(imena: seznam[str]) -> Brez:
    za imena v imenih:
    print("Pozdravljeni", ime)

  • So na voljo prilagodljiva orodja za označevanje funkcij in spremenljivk. Za pripenjanje opomb je bil modulu za tipkanje dodan nov tip Annotated, ki razširja obstoječe tipe z dodatnimi metapodatki, ki jih je mogoče uporabiti za statično analizo ali optimizacijo med izvajanjem. Za dostop do metapodatkov iz kode je bil metodi typing.get_type_hints() dodan parameter include_extras.

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

  • Zmanjšano slovnične zahteve za dekoratorje - vsak izraz, primeren za uporabo v blokih if in while, se zdaj lahko uporablja kot dekorater. Sprememba je znatno izboljšala berljivost kode PyQt5 in poenostavila vzdrževanje tega modula:

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

    Zdaj lahko napišete:
    @buttons[0].clicked.connect

  • V standardno knjižnico dodano modul zonainfo, ki vključuje podatke iz podatkovne zbirke časovnih pasov IANA.

    >>> iz zoneinfo uvozi ZoneInfo
    >>> from datetime import datetime, timedelta
    >>> # Poletni čas
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PACIFIŠKI ČAS'

    >>> # Standardni čas
    >>> dt += timedelta(dni=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

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

  • Dodan modul graphlib, v katerem izvajati podpora za topološko razvrščanje grafov.
  • Predlagano nove metode za odstranjevanje predpon in končnic vrstic - str.removeprefix(prefix) in str.removesuffix(suffix). Metode so bile dodane objektom str, bytes, bytearray in collections.UserString.

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

  • Vpleteni nov razčlenjevalnik PEG (Parsing Expression Grammar), ki je nadomestil razčlenjevalnik LL (1). Uporaba novega razčlenjevalnika je omogočila, da se znebite nekaterih "vdorov", ki se uporabljajo za obhod omejitev v LL(1), in znatno znižala stroške dela za vzdrževanje razčlenjevalnika. Z vidika zmogljivosti je novi razčlenjevalnik približno na enaki ravni kot prejšnji, vendar je bistveno pred njim v smislu prilagodljivosti, kar vam omogoča, da se počutite bolj svobodne pri oblikovanju novih jezikovnih funkcij. Stara koda razčlenjevalnika je za zdaj ohranjena in jo je mogoče vrniti z uporabo zastavice "-X oldparser" ali spremenljivke okolja "PYTHONOLDPARSER=1", vendar bo odstranjena v izdaji 3.10.
  • Zagotovljeno zmožnost razširitvenih metod C za dostop do stanja modulov, v katerih so definirani, z uporabo neposredne dereference kazalca namesto iskanja stanja modula s funkcijo PyState_FindModule. Sprememba vam omogoča, da povečate zmogljivost modulov C z zmanjšanjem ali popolno odpravo dodatnih stroškov preverjanja stanja modula. Za povezavo modula z razredom je predlagana C-funkcija PyType_FromModuleAndSpec(), za pridobivanje modula in njegovega stanja sta predlagani C-funkciji PyType_GetModule() in PyType_GetModuleState() ter za zagotavljanje metode z dostopom do razreda v katerem je definiran, sta predlagana C-funkcija PyCMethod in zastavica METH_METHOD.
  • Zbiralec smeti dostavljeno iz zaklepanja zbirk, ki vsebujejo oživljene predmete, ki ostanejo dostopni zunaj po zagonu finalizatorja.
  • Dodana metoda os.pidfd_open, ki omogoča uporabo podsistema jedra Linuxa "pidfd" za obravnavo situacije ponovne uporabe PID (pidfd je povezan z določenim procesom in se ne spremeni, medtem ko je PID lahko povezan z drugim procesom, potem ko se trenutni proces, povezan s tem PID-om, konča ).
  • Podpora za specifikacijo Unicode je bila posodobljena na različico 13.0.0.
  • Odpravljeno puščanje pomnilnika pri ponovni inicializaciji tolmača Python v istem procesu.
  • Delovanje vgrajenih tipov range, tuple, set, frozenset, list in dict je bilo optimizirano. izvajati z uporabo protokola bližnjic Vectorcall za hitrejši dostop do objektov, napisanih v jeziku C.
  • Moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time in _weakref se naložijo iz inicializacija v več fazah.
  • Moduli standardne knjižnice audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios in zlib so bili pretvorjeni v omejeno uporabo stabilen ABI, ki rešuje problem operativnosti sklopov razširitvenih modulov za različne različice Pythona (pri posodabljanju različice razširitvenih modulov ni treba znova graditi, moduli, prevedeni za 3.9, pa bodo lahko delovali v veji 3.10).
  • Modul asyncio je opustil podporo za parameter reuse_address zaradi morebitnih varnostnih težav (uporaba SO_REUSEADDR za UDP v sistemu Linux omogoča različnim procesom, da priključijo poslušajoče vtičnice na vrata UDP).
  • Dodane so bile nove optimizacije, na primer izboljšano delovanje obdelovalcev signalov v večnitnih aplikacijah, povečana hitrost podprocesnega modula v okolju FreeBSD in hitrejše dodeljevanje začasnih spremenljivk (dodeljevanje spremenljivke v izrazu »za y v [izraz« ]« je zdaj enako učinkovit kot izraz »y = expr««). Na splošno večina testov kažejo zmanjšanje zmogljivosti v primerjavi z vejo 3.8 (pospešitev je opažena le pri testih write_local in write_deque):

    Python različica 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Dostop za branje spremenljivk in atributov:
    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

    Dostop za pisanje spremenljivk in atributov:
    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

    Dostop za branje podatkovne strukture:
    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

    Dostop za pisanje podatkovne strukture:
    pisanje_seznama 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 sklada (ali čakalne vrste):
    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

    Časovna zanka:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Izbrisano številne funkcije in metode Python 2.7, ki so bile prej opuščene in so povzročile DeprecationWarning v prejšnji izdaji, vključno z metodo unescape() v html.parser.HTMLParser,
    tostring() in fromstring() v array.array, isAlive() v threading.Thread, getchildren() in getiterator() v ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() in base64.decodestring().

Vir: opennet.ru

Dodaj komentar