Vrystelling van die Python 3.9-programmeertaal

Na 'n jaar van ontwikkeling aangebied beduidende programmeertaal vrystelling Python 3.9. Python 3.9 was die eerste vrystelling daarna oorgang projek aan nuwe siklus voorbereiding en ondersteuning van vrystellings. Nuwe groot vrystellings sal nou een keer per jaar gegenereer word, en regstellende opdaterings sal elke twee maande vrygestel word. Elke beduidende tak sal vir een en 'n half jaar ondersteun word, waarna nog drie en 'n half jaar ontwikkel sal word om kwesbaarhede reg te stel.

Werk aan 'n nuwe tak begin nou vyf maande voor die vrystelling van die volgende tak, m.a.w. wat saamval met die vrystelling van Python 3.9 begin het alfa-toetsing van die Python 3.10-tak. Die Python 3.10-tak sal vir sewe maande in alfa-vrystelling wees, waartydens nuwe funksies bygevoeg en foute reggestel sal word. Hierna sal beta-weergawes vir drie maande getoets word, waartydens die toevoeging van nuwe kenmerke verbied sal word en alle aandag sal gegee word aan die regstelling van foute. Die laaste twee maande voor die vrystelling sal die tak in die vrystellingskandidaatstadium wees, waarop finale stabilisering uitgevoer sal word.

Onder bygevoeg innovasies in Python 3.9:

  • In woordeboeke gedefinieer met behulp van die ingeboude dict-klas, verskyn ondersteuning vir samesmeltingsoperateurs "|" en "|="-opdaterings, wat die {**d1-, **d2}- en dict.update-metodes aanvul wat voorheen voorgestel is vir die samevoeging van woordeboeke.

    >>> x = {"sleutel1": "waarde1 vanaf x", "sleutel2": "waarde2 vanaf x"}
    >>> y = {"key2": "value2 from y", "key3": "value3 from y"}

    >>> x | y
    {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}

    >>> y | x
    {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

  • Die ingeboude versameling tipes sluit lys, dict en tuple in, wat as basistipes gebruik kan word sonder om vanaf die tikmodule in te voer. Dié. in plaas van tik.Lys, tik.Dict en tik.Tuple kan jy nou spesifiseer
    lys, dikteer en tupleer net:

    def greet_all (name: lys[str]) -> Geen:
    vir name in name:
    print("Hallo", naam)

  • Word voorsien buigsame gereedskap vir die annotering van funksies en veranderlikes. Vir die aanheg van aantekeninge is 'n nuwe geannoteerde tipe by die tikmodule gevoeg, wat bestaande tipes uitbrei met bykomende metadata wat gebruik kan word vir statiese analise of vir hardlooptydoptimalisasies. Om toegang tot metadata vanaf kode te verkry, is die include_extras-parameter by die typing.get_type_hints()-metode gevoeg.

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

  • Afgetoon grammatikale vereistes vir versierders - enige uitdrukking wat geskik is vir gebruik in as en while blokke kan nou as 'n versierder gebruik word. Die verandering het die leesbaarheid van die PyQt5-kode aansienlik verbeter en die instandhouding van hierdie module vereenvoudig:

    Was:
    button_0 = knoppies[0] @button_0.clicked.connect

    Nou kan jy skryf:
    @knoppies[0].geklik.koppel

  • Na die standaard biblioteek bygevoeg module sone -inligting, wat inligting van die IANA-tydsonedatabasis insluit.

    >>> vanaf zoneinfo invoer ZoneInfo
    >>> vanaf datumtyd invoer datumtyd, tyddelta
    >>> # Somertyd
    >>> dt = datumtyd(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> druk(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Standaardtyd
    >>> dt += tyddelta(dae=7)
    >>> druk(dt)
    2020-11-07 12:00:00-08:00

    >>> druk(dt.tzname())
    PST

  • Bygevoeg graphlib module, waarin geïmplementeer ondersteuning vir topologiese sortering van grafieke.
  • Voorgestelde nuwe metodes vir die verwydering van voorvoegsels en lyneindes - str.removeprefix(prefix) en str.removesuffix(suffix). Metodes is bygevoeg by str, bytes, bytearray en collections.UserString-objekte.

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

  • Betrokke nuwe ontleder PEG (Parsing Expression Grammar), wat die ontleder vervang het LL(1). Die gebruik van die nuwe ontleder het dit moontlik gemaak om ontslae te raak van sommige van die "hacks" wat gebruik is om die beperkings in LL(1) te omseil, en het die arbeidskoste vir die instandhouding van die ontleder aansienlik verminder. Wat prestasie betref, is die nuwe ontleder ongeveer op dieselfde vlak as die vorige een, maar is aansienlik voor dit in terme van buigsaamheid, wat jou meer vry laat voel wanneer jy nuwe taalkenmerke ontwerp. Die ou ontlederkode word vir eers behou en kan teruggestuur word deur die "-X oldparser" vlag of die "PYTHONOLDPARSER=1" omgewingsveranderlike te gebruik, maar sal in vrystelling 3.10 verwyder word.
  • Verskaf die vermoë vir C-uitbreidingsmetodes om toegang te verkry tot die toestand van die modules waarin hulle gedefinieer is deur direkte wyserdereference te gebruik in plaas daarvan om na die moduletoestand te soek deur die PyState_FindModule-funksie te gebruik. Die verandering laat jou toe om die werkverrigting van C-modules te verhoog deur die bokoste van die nagaan van die modulestatus te verminder of heeltemal uit te skakel. Om 'n module met 'n klas te assosieer, word die C-funksie PyType_FromModuleAndSpec() voorgestel, om die module en sy toestand te verkry, word die C-funksies PyType_GetModule() en PyType_GetModuleState() voorgestel, en om 'n metode met toegang tot die klas te verskaf waarin dit gedefinieer word, word die C-funksie PyCMetod en die METH_METHOD vlag voorgestel. .
  • Vullis versamelaar afgelewer van die sluit van versamelings wat gereanimeerde voorwerpe bevat wat ekstern toeganklik bly nadat die finaliseerder loop.
  • Bygevoeg metode os.pidfd_open, wat toelaat dat die Linux-kern-substelsel "pidfd" gebruik word om die PID-hergebruiksituasie te hanteer (pidfd word geassosieer met 'n spesifieke proses en verander nie, terwyl 'n PID met 'n ander proses geassosieer kan word nadat die huidige proses wat met daardie PID geassosieer word, beëindig is ).
  • Ondersteuning vir die Unicode-spesifikasie is opgedateer na weergawe 13.0.0.
  • Uitgeskakel geheue lek wanneer die Python-tolk in dieselfde proses herinitialiseer word.
  • Die werkverrigting van die ingeboude tipes reeks, tuple, set, frozenset, list en dict is geoptimaliseer. geïmplementeer deur die gebruik van die Vectorcall-kortpadprotokol vir vinniger toegang tot voorwerpe wat in die C-taal geskryf is.
  • Die _abc, oudioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operateur, hulpbron, tyd en _weakref modules is geskuif na laai vanaf inisialisering in verskeie fases.
  • Die standaard biblioteekmodules audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios en zlib is omgeskakel na gebruik beperk stabiele ABI, wat die probleem van die werkbaarheid van samestellings van uitbreidingsmodules vir verskillende weergawes van Python oplos (wanneer die weergawe opgedateer word, is dit nie nodig om uitbreidingsmodules te herbou nie, en modules wat vir 3.9 saamgestel is, sal in die 3.10-tak kan werk).
  • Die asyncio-module het ondersteuning vir die reuse_address-parameter opgeskort weens potensiële sekuriteitskwessies (die gebruik van SO_REUSEADDR vir UDP op Linux laat verskillende prosesse toe om luistervoetstukke aan 'n UDP-poort te koppel).
  • Nuwe optimaliserings is bygevoeg, byvoorbeeld verbeterde werkverrigting van seinhanteerders in multi-threaded toepassings, verhoogde spoed van die subproses module in die FreeBSD omgewing, en vinniger toewysing van tydelike veranderlikes (toewysing van 'n veranderlike in die uitdrukking "vir y in [uitdr. ]” is nou so performant soos die uitdrukking “y = expr” "). In die algemeen, die meeste toetse show prestasie afname in vergelyking met tak 3.8 (versnelling word slegs waargeneem in die write_local en write_deque toetse):

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

    Veranderlike en kenmerk leestoegang:
    lees_plaaslik 7.1 7.1 5.4 5.1 3.9 4.0
    lees_nieplaaslik 7.1 8.1 5.8 5.4 4.4 4.8
    lees_globaal 15.5 19.0 14.3 13.6 7.6 7.7
    lees_ingebou 21.1 21.6 18.5 19.0 7.5 7.7
    lees_klasvar_van_klas 25.6 26.5 20.7 19.5 18.4 18.6
    lees_klasvar_van_instansie 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
    lees_naamdubbel 73.8 57.5 ​​45.0 46.8 18.4 23.2
    lees_gebonde metode 37.6 37.9 29.6 26.9 27.7 45.9

    Veranderlike en kenmerk skryftoegang:
    skryf_plaaslik 8.7 9.3 5.5 5.3 4.3 4.2
    skryf_nieplaaslik 10.5 11.1 5.6 5.5 4.7 4.9
    skryf_globaal 19.7 21.2 18.0 18.0 15.8 17.2
    skryf_klasvar 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

    Datastruktuur leestoegang:
    leeslys 24.2 24.5 20.8 20.8 19.0 21.1
    lees_deque 24.7 25.5 20.2 20.6 19.8 21.6
    lees_dict 24.3 25.7 22.3 23.0 21.0 22.5
    lees_string 22.6 24.3 19.5 21.2 18.9 21.6

    Datastruktuur skryftoegang:
    skryflys 27.1 28.5 22.5 21.6 20.0 21.6
    skryf_deque 28.7 30.1 22.7 21.8 23.5 23.2
    skryf_dict 31.4 33.3 29.3 29.2 24.7 27.8
    skryf_string 28.4 29.9 27.5 25.2 23.1 29.8

    Stapel (of tou) bewerkings:
    lys_byvoeg_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

    Tydsberekening lus:
    lus_bokoste 0.5 0.6 0.4 0.3 0.3 0.3

  • Verwyder baie Python 2.7-funksies en -metodes wat voorheen afgekeur is en gelei het tot 'n DeprecationWarning in die vorige weergawe, insluitend die unescape()-metode in html.parser.HTMLParser,
    tostring() en fromstring() in array.array, isAlive() in threading.Thread, getchildren() en getiterator() in ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() en base64.decodestring().

Bron: opennet.ru

Voeg 'n opmerking