Eldono de la programlingvo Python 3.9

Post jaro da evoluo prezentita signifa programlingvo eldono python 3.9. Python 3.9 estis la unua eldono poste transiro projekti plu nova ciklo preparado kaj subteno de eldonoj. Novaj ĉefaj eldonoj nun estos generitaj unufoje jare, kaj korektaj ĝisdatigoj estos publikigitaj ĉiujn du monatojn. Ĉiu signifa branĉo estos subtenata dum unu kaj duona jaro, post kiu aliaj tri jaroj kaj duono estos disvolvitaj por ke ĝi riparu vundeblecojn.

Laboro pri nova branĉo nun komenciĝas kvin monatojn antaŭ la liberigo de la sekva branĉo, t.e. koincidante kun la liberigo de Python 3.9 komencis alfa-testado de la branĉo Python 3.10. La branĉo Python 3.10 estos en alfa-eldono dum sep monatoj, dum kiuj novaj funkcioj estos aldonitaj kaj cimoj riparitaj. Post ĉi tio, beta-versioj estos testitaj dum tri monatoj, dum kiuj aldoni novajn funkciojn estos malpermesita kaj la tuta atento estos pagita por ripari erarojn. La lastaj du monatoj antaŭ la liberigo, la branĉo estos en la eldonkandidata stadio, ĉe kiu fina stabiligo estos farita.

Inter la aldonis novigoj en Python 3.9:

  • En vortaroj difinitaj uzante la enkonstruitan dictklason, aperis subteno por kunfandaj operatoroj "|" kaj "|=" ĝisdatigoj, kiuj kompletigas la metodojn {**d1, **d2} kaj dict.update antaŭe proponitajn por kunfandi vortarojn.

    >>> x = {"key1": "valoro1 de x", "key2": "valoro2 de x"}
    >>> y = {"key2": "valoro2 de y", "key3": "valoro3 de y"}

    >>> x | y
    {'key1': 'valoro1 de x', 'key2': 'valoro2 de y', 'key3': 'valoro3 de y'}

    >>> kaj | x
    {'key2': 'valoro2 de x', 'key3': 'valoro3 de y', 'key1': 'valoro1 de x'}

  • La enkonstruita kolekto de tipoj inkluzivas liston, dikton kaj opon, kiuj povas esti uzataj kiel baztipoj sen importi el la tajpa modulo. Tiuj. anstataŭ tajpi.Listo, tajpado.Dict kaj tajpado.Opo vi nun povas specifi
    nur listo, dikto kaj opo:

    def greet_all(nomoj: listo[str]) -> Neniu:
    por nomoj en nomoj:
    print("Saluton", nomo)

  • Estas provizitaj flekseblaj iloj por komentado de funkcioj kaj variabloj. Por aldoni komentariojn, nova Komentita tipo estis aldonita al la tajpa modulo, etendante ekzistantajn tipojn kun pliaj metadatenoj, kiuj povas esti uzataj por senmova analizo aŭ por rultempaj optimumigoj. Por aliri metadatenojn de kodo, la parametro include_extras estis aldonita al la metodo typing.get_type_hints().

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

  • Tonigita malsupren gramatikaj postuloj por dekoraciistoj - ajna esprimo taŭga por uzo en se kaj dum blokoj nun povas esti uzataj kiel dekoraciisto. La ŝanĝo signife plibonigis la legeblecon de la kodo PyQt5 kaj simpligis la prizorgadon de ĉi tiu modulo:

    Estis:
    button_0 = butonoj[0] @button_0.klakita.konekti

    Nun vi povas skribi:
    @butonoj[0].klakitaj.konekti

  • Al la norma biblioteko aldonis modulo zoneinfo, kiu inkludas informojn de la IANA-horzondatumbazo.

    >>> de zoneinfo importu ZoneInfo
    >>> de datetime import datetime, timedelta
    >>> # Somera tempo
    >>> dt = datotempo(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Norma tempo
    >>> dt += timedelta(tagoj=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

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

  • Aldonita graphlib modulo, en kiu efektivigita subteno por topologia ordigo de grafeoj.
  • Proponita novaj metodoj por forigi prefiksojn kaj liniofinaĵojn - str.removeprefix(prefikso) kaj str.removesuffix(sufikso). Metodoj estis aldonitaj al str, bajtoj, bytearray kaj kolektoj.UserString objektoj.

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

  • Engaĝita nova analizilo PEG (Parsing Expression Grammar), kiu anstataŭigis la analizilon LL (1). La uzo de la nova analizilo ebligis forigi kelkajn el la "hakoj" uzataj por preteriri la restriktojn en LL(1), kaj signife reduktis la laborkostojn por konservi la analizilon. Koncerne rendimenton, la nova analizilo estas proksimume sur la sama nivelo kiel la antaŭa, sed estas signife antaŭ ĝi laŭ fleksebleco, kio permesas vin senti pli libera dum desegnado de novaj lingvofunkcioj. La malnova analizkodo estas konservita nuntempe kaj povas esti resendita per la flago "-X oldparser" aŭ la mediovariablo "PYTHONOLDPARSER=1", sed estos forigita en eldono 3.10.
  • Provizita la kapablo por C-etendmetodoj aliri la staton de la moduloj en kiuj ili estas difinitaj uzante rektan montrilon dereference anstataŭ serĉi la modulan staton uzante la PyState_FindModule-funkcion. La ŝanĝo permesas pliigi la rendimenton de C-moduloj reduktante aŭ tute forigante la superan kontrolon de la modula stato. Por asocii modulon kun klaso, la C-funkcio PyType_FromModuleAndSpec() estas proponita, por akiri la modulon kaj ĝian staton, la C-funkcioj PyType_GetModule() kaj PyType_GetModuleState() estas proponitaj, kaj por provizi metodon kun aliro al la klaso en kiu ĝi estas difinita, la C-funkcia PyCMethod kaj la flago METH_METHOD estas proponitaj. .
  • Rubokolektisto liverita de ŝlosado de kolektoj enhavantaj revivigitajn objektojn, kiuj restas ekstere alireblaj post kiam la finigilo funkcias.
  • Aldonita metodo os.pidfd_open, kiu permesas al la Linukso-kernsubsistemo "pidfd" esti uzita por pritrakti la PID-reuzosituacion (pidfd estas rilata al specifa procezo kaj ne ŝanĝiĝas, dum PID povas esti asociita kun alia procezo post kiam la nuna procezo asociita kun tiu PID finiĝas ).
  • Subteno por la Unikoda specifo estis ĝisdatigita al versio 13.0.0.
  • Forigita memorfluo kiam oni rekomencigas la Python-interpretilon en la sama procezo.
  • La agado de la enkonstruitaj tipoj gamo, opo, aro, frostita, listo kaj dikto estis optimumigita. efektivigita per la uzo de la Vectorcall-mallongiga protokolo por pli rapida aliro al objektoj skribitaj en la C-lingvo.
  • Moduloj _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time kaj _weakref estas ŝarĝitaj de inicialigo en pluraj etapoj.
  • La normaj bibliotekmoduloj audioop, ast, grp, _hashlib, pwd, _posixsubprocess, hazarda, select, struct, termios kaj zlib estis konvertitaj por uzi limigitan stabila ABI, kiu solvas la problemon de la operaco de asembleoj de etendaj moduloj por malsamaj versioj de Python (dum la ĝisdatigo de la versio, ne necesas rekonstrui etendaĵojn, kaj moduloj kompilitaj por 3.9 povos funkcii en la branĉo 3.10).
  • La asyncio-modulo malrekomendis subtenon por la parametro reuse_address pro eblaj sekurecaj problemoj (uzante SO_REUSEADDR por UDP en Linukso permesas al malsamaj procezoj ligi aŭskultajn ingojn al UDP-haveno).
  • Novaj optimumigoj estis aldonitaj, ekzemple, plibonigita rendimento de signal-traktiloj en plurfadenaj aplikoj, pliigita rapideco de la subproceza modulo en la medio FreeBSD, kaj pli rapida asignado de provizoraj variabloj (asignante variablon en la esprimo "por y en [expr". ]” nun estas same efika kiel la esprimo “y = ekspr” "). Ĝenerale, plej multaj provoj spektaklo rendimento malpliiĝo kompare kun branĉo 3.8 (plirapidigo estas observita nur en la testoj write_local kaj write_deque):

    Python-versio 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Variablo kaj atributo lego aliro:
    legi_loka 7.1 7.1 5.4 5.1 3.9 4.0
    legu_neloka 7.1 8.1 5.8 5.4 4.4 4.8
    legi_tutmonde 15.5 19.0 14.3 13.6 7.6 7.7
    legi_enkonstruita 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
    leg_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    leg_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
    legu_boundmetodo 37.6 37.9 29.6 26.9 27.7 45.9

    Variablo kaj atributa skribaliro:
    skribi_loka 8.7 9.3 5.5 5.3 4.3 4.2
    skribi_neloka 10.5 11.1 5.6 5.5 4.7 4.9
    skribi_tutmonda 19.7 21.2 18.0 18.0 15.8 17.2
    skribu_klasovar 92.9 96.0 104.6 102.1 39.2 43.2
    skrib_instancovar 44.6 45.8 40.0 38.9 35.5 40.7
    skrib_instancovar_fendoj 35.6 36.1 27.3 26.6 25.7 27.7

    Datuma strukturo de legado:
    legu_liston 24.2 24.5 20.8 20.8 19.0 21.1
    legi_deke 24.7 25.5 20.2 20.6 19.8 21.6
    legi_dikto 24.3 25.7 22.3 23.0 21.0 22.5
    legi_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Datuma strukturo skribaliro:
    skribi_listo 27.1 28.5 22.5 21.6 20.0 21.6
    skribi_deko 28.7 30.1 22.7 21.8 23.5 23.2
    skribi_dikto 31.4 33.3 29.3 29.2 24.7 27.8
    skribi_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Stakaj (aŭ vico) operacioj:
    list_apend_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

    Tempobuklo:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Forigita multaj Python 2.7-funkcioj kaj metodoj kiuj antaŭe estis malrekomenditaj kaj rezultigis Malrekomenditan Averton en la antaŭa eldono, inkluzive de la unescape() metodo en html.parser.HTMLParser,
    tostring() kaj fromstring() en array.array, isAlive() en threading.Thread, getchildren() kaj getiterator() en ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() kaj base64.decodestring().

fonto: opennet.ru

Aldoni komenton