Python 3.9 -ohjelmointikielen julkaisu

Vuoden kehitystyön jälkeen esitetty merkittävä ohjelmointikielen julkaisu Python 3.9. Python 3.9 oli ensimmäinen julkaisu sen jälkeen siirtyminen projekti käynnissä uusi sykli julkaisujen valmistelu ja tuki. Uusia suuria julkaisuja luodaan nyt kerran vuodessa ja korjaavia päivityksiä julkaistaan ​​kahden kuukauden välein. Jokaista merkittävää haaraa tuetaan puolitoista vuotta, jonka jälkeen sille kehitetään vielä kolme ja puoli vuotta haavoittuvuuksien korjaamiseen.

Uuden haaran työt alkavat nyt viisi kuukautta ennen seuraavan haaran vapauttamista, ts. samaan aikaan Python 3.9:n julkaisun kanssa alkoi Python 3.10 -haaran alfatestaus. Python 3.10 -haara tulee olemaan alfajulkaisussa seitsemän kuukauden ajan, jonka aikana uusia ominaisuuksia lisätään ja vikoja korjataan. Tämän jälkeen beta-versioita testataan kolmen kuukauden ajan, jonka aikana uusien ominaisuuksien lisääminen on kielletty ja kaikki huomio kiinnitetään bugien korjaamiseen. Viimeiset kaksi kuukautta ennen julkaisua haara on julkaisuehdokasvaiheessa, jolloin suoritetaan lopullinen stabilointi.

Keskuudessa lisätty innovaatioita Python 3.9:ssä:

  • Sisäänrakennetun saneluluokan avulla määritetyissä sanakirjoissa ilmestyi tuki fuusiooperaattoreille "|" ja "|=" -päivitykset, jotka täydentävät aiemmin sanakirjojen yhdistämiseen ehdotettuja menetelmiä {**d1, **d2} ja dict.update.

    >>> x = {"avain1": "arvo1 x:stä", "avain2": "arvo2 x:stä"}
    >>> y = {"avain2": "arvo2 y:stä", "avain3": "arvo3 y:stä"}

    >>> x | y
    {'avain1': 'arvo1 x:stä', 'avain2': 'arvo2 y:stä', 'avain3': 'arvo3 y:stä'}

    >>> y | x
    {'avain2': 'arvo2 x:stä', 'avain3': 'arvo3 y:stä', 'avain1': 'arvo1 x:stä'}

  • Sisäänrakennettu tyyppikokoelma sisältää listan, sanelun ja tuplen, joita voidaan käyttää perustyyppeinä ilman tuontia kirjoitusmoduulista. Nuo. kirjoittamisen sijaan.Lista, kirjoittaminen.Dict ja kirjoittaminen.Tuple voit nyt määrittää
    vain luettelo, sanelu ja monikko:

    def greet_all(nimet: lista[str]) -> Ei mitään:
    nimille nimissä:
    tulosta ("Hei", nimi)

  • Tarjotaan joustavat työkalut funktioiden ja muuttujien merkitsemiseen. Annotaatioiden liittämistä varten kirjoitusmoduuliin on lisätty uusi Annotated-tyyppi, joka laajentaa olemassa olevia tyyppejä lisämetatiedoilla, joita voidaan käyttää staattiseen analyysiin tai ajonaikaisiin optimointiin. Jotta koodista voidaan käyttää metatietoja, include_extras-parametri on lisätty typing.get_type_hints()-metodiin.

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

  • Hillitty kieliopilliset vaatimukset sisustajille - mitä tahansa ilmaisua, joka sopii käytettäväksi jos ja kun -palikoita voidaan nyt käyttää koristeena. Muutos paransi merkittävästi PyQt5-koodin luettavuutta ja yksinkertaisti tämän moduulin ylläpitoa:

    Se oli:
    button_0 = painikkeet[0] @button_0.clicked.connect

    Nyt voit kirjoittaa:
    @buttons[0].clicked.connect

  • Tavalliseen kirjastoon lisätty moduuli vyöhyketiedot, joka sisältää tiedot IANA-aikavyöhyketietokannasta.

    >>> ZoneInfosta tuodaan ZoneInfo
    >>> päivämäärä-ajan tuonnista päivämäärä-aika, aikadelta
    >>> # Kesäaika
    >>> dt = päivämääräaika (2020, 10, 31, 12, tzinfo=ZoneInfo("Amerikka/Los_Angeles"))
    >>> tulosta (dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    "PDT"

    >>> # Normaali aika
    >>> dt += aikadelta(päivää=7)
    >>> tulosta (dt)
    2020-11-07 12:00:00-08:00

    >>> tulosta(dt.tzname())
    PST

  • Lisätty graphlib-moduuli, jossa toteutettu tuki graafien topologiselle lajittelulle.
  • Ehdotettu uudet menetelmät etuliitteiden ja rivien päätteiden poistamiseen - str.removeprefix(prefix) ja str.removesuffix(suffix). Menetelmiä on lisätty str-, tavu-, bytearray- ja collections.UserString-objekteihin.

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

  • Mukana uusi jäsentäjä PEG (Parsing Expression Grammar), joka korvasi jäsentimen LL(1). Uuden jäsentimen käyttö mahdollisti joidenkin LL(1) rajoitusten ohittamiseen käytetyistä "hakkereista" pääsemisen eroon ja vähensi merkittävästi jäsentimen ylläpidon työvoimakustannuksia. Suorituskyvyltään uusi jäsentäjä on suunnilleen samalla tasolla kuin edellinen, mutta on huomattavasti edellä sitä joustavuuden suhteen, mikä antaa sinun tuntea olosi vapaammaksi uusien kieliominaisuuksien suunnittelussa. Vanha jäsennyskoodi säilytetään toistaiseksi ja se voidaan palauttaa "-X oldparser" -lipulla tai "PYTHONOLDPARSER=1" -ympäristömuuttujalla, mutta se poistetaan julkaisussa 3.10.
  • Edellyttäen C-laajennusmenetelmien mahdollisuus päästä käsiksi moduulien tilaan, jossa ne on määritetty, käyttämällä suoraa osoittimen viittausta sen sijaan, että etsittäisiin moduulin tilaa PyState_FindModule-funktiolla. Muutoksen avulla voit lisätä C-moduulien suorituskykyä vähentämällä tai poistamalla kokonaan moduulin tilan tarkistamisesta aiheutuvat lisäkustannukset. Moduulin liittämiseksi luokkaan ehdotetaan C-funktiota PyType_FromModuleAndSpec(), moduulin ja sen tilan saamiseksi ehdotetaan C-funktioita PyType_GetModule() ja PyType_GetModuleState() sekä menetelmän tarjoamista, jolla on pääsy luokkaan. jossa se on määritelty, ehdotetaan C-funktiota PyCMethod ja METH_METHOD-lippu.
  • Roskankerääjä toimitettu lukitsemalla kokoelmia, jotka sisältävät reanimoituja objekteja, jotka ovat ulkoisesti käytettävissä viimeistelytoiminnon suorittamisen jälkeen.
  • Lisätty menetelmä os.pidfd_open, jonka avulla Linux-ytimen alijärjestelmää "pidfd" voidaan käyttää PID-uudelleenkäyttötilanteen käsittelemiseen (pidfd liittyy tiettyyn prosessiin eikä muutu, kun taas PID voidaan liittää toiseen prosessiin sen jälkeen, kun tähän PID:hen liittyvä nykyinen prosessi päättyy ).
  • Unicode-määrityksen tuki on päivitetty versioon 13.0.0.
  • Eliminoitu muistivuoto kun Python-tulkki alustetaan uudelleen samassa prosessissa.
  • Sisäänrakennettujen tyyppien, tuple, set, frozenset, list ja dict suorituskyky on optimoitu. toteutettu käyttämällä Vectorcall-pikakuvakeprotokollaa C-kielellä kirjoitettujen objektien nopeampaa pääsyä varten.
  • Moduulit _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operaattori, resurssi, aika ja _weakref ladataan alustus useissa vaiheissa.
  • Tavalliset kirjastomoduulit audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios ja zlib on muutettu käyttämään rajoitettua vakaa ABI, joka ratkaisee Pythonin eri versioiden laajennusmoduulien toimivuusongelman (versiota päivitettäessä laajennusmoduuleja ei tarvitse rakentaa uudelleen, ja versiolle 3.9 käännetyt moduulit voivat toimia 3.10-haarassa).
  • Asyncio-moduuli on poistanut tuen reuse_address-parametrille mahdollisten tietoturvaongelmien vuoksi (SO_REUSEADDR:n käyttö UDP:lle Linuxissa mahdollistaa eri prosessien liittämisen kuunteluliitäntöihin UDP-porttiin).
  • Uusia optimointeja on lisätty, esimerkiksi parannettu signaalinkäsittelijöiden suorituskyky monisäikeisissä sovelluksissa, lisääntynyt aliprosessimoduulin nopeus FreeBSD-ympäristössä ja nopeampi tilapäisten muuttujien osoittaminen (muuttujan määrittäminen lausekkeessa "for y in [lauseke" ]" on nyt yhtä tehokas kuin lauseke "y = lau" "). Yleensä suurin osa testeistä show Suorituskyvyn lasku verrattuna haaraan 3.8 (nopeutumista havaitaan vain write_local- ja write_deque-testeissä):

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

    Muuttujien ja määritteiden lukuoikeus:
    lue_paikallinen 7.1 7.1 5.4 5.1 3.9 4.0
    lue_ei-paikallinen 7.1 8.1 5.8 5.4 4.4 4.8
    lue_maailmanlaajuinen 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
    lue_luokka_luokasta 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
    lue_esiintymämuuttuja 32.4 33.1 28.0 26.3 25.4 27.7
    lue_esiintymän_paikat 27.8 31.3 20.8 20.8 20.2 24.5
    lue_nimetty tupla 73.8 57.5 ​​45.0 46.8 18.4 23.2
    luku_sidottu menetelmä 37.6 37.9 29.6 26.9 27.7 45.9

    Muuttujien ja määritteiden kirjoitusoikeudet:
    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

    Tietorakenteen lukuoikeus:
    lue_lista 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
    lue_sana 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

    Tietorakenteen kirjoitusoikeus:
    kirjoituslista 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
    kirjoitus_sanelu 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

    Pino (tai jono) -toiminnot:
    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

    Ajoitussilmukka:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Poistettu monet Python 2.7 -funktiot ja -menetelmät, jotka olivat aiemmin vanhentuneet ja johtivat Deprecation Warning -ilmoitukseen edellisessä julkaisussa, mukaan lukien unescape()-menetelmä tiedostossa html.parser.HTMLParser,
    tostring() ja fromstring() array.arrayssa, isAlive() ketjutuksessa.Thread, getchildren() ja getiterator() ElementTreessä, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() ja base64.decodestring().

Lähde: opennet.ru

Lisää kommentti