Utgivelse av programmeringsspråket Python 3.9

Etter et år med utvikling presentert betydelig utgivelse av programmeringsspråk Python 3.9. Python 3.9 var den første utgivelsen etter overgang prosjekt på ny syklus forberedelse og støtte for utgivelser. Nye store utgivelser vil nå bli generert en gang i året, og korrigerende oppdateringer vil bli utgitt annenhver måned. Hver betydelig gren vil bli støttet i ett og et halvt år, hvoretter ytterligere tre og et halvt år vil bli utviklet for å fikse sårbarheter.

Arbeidet med ny filial starter nå fem måneder før utgivelsen av neste filial, d.v.s. sammenfallende med utgivelsen av Python 3.9 begynte alfatesting av Python 3.10-grenen. Python 3.10-grenen vil være i alfa-utgivelse i syv måneder, hvor nye funksjoner vil bli lagt til og feil fikset. Etter dette vil betaversjoner bli testet i tre måneder, hvor det er forbudt å legge til nye funksjoner, og all oppmerksomhet vil bli viet til å fikse feil. De siste to månedene før utgivelsen vil filialen være på utgivelseskandidatstadiet, hvor endelig stabilisering vil bli utført.

Blant la til innovasjoner i Python 3.9:

  • I ordbøker definert ved hjelp av den innebygde dict-klassen, dukket opp støtte for fletteoperatører "|" og "|="-oppdateringer, som utfyller metodene {**d1, **d2} og dict.update tidligere foreslått for sammenslåing av ordbøker.

    >>> x = {"key1": "value1 from x", "key2": "value2 from 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'}

  • Den innebygde samlingen av typer inkluderer list, dict og tuple, som kan brukes som basistyper uten å importere fra skrivemodulen. De. i stedet for typing.List, typing.Dict og typing.Tuple kan du nå spesifisere
    bare liste, dikt og tuple:

    def greet_all(navn: liste[str]) -> Ingen:
    for navn i navn:
    print("Hei", navn)

  • Er gitt fleksible verktøy for å kommentere funksjoner og variabler. For å legge ved merknader er det lagt til en ny annotert type i skrivemodulen, som utvider eksisterende typer med ekstra metadata som kan brukes til statisk analyse eller for kjøretidsoptimaliseringer. For å få tilgang til metadata fra kode, er include_extras-parameteren lagt til typing.get_type_hints()-metoden.

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

  • Nedtonet grammatiske krav til dekoratører - ethvert uttrykk som egner seg for bruk i if and while blokker kan nå brukes som dekoratør. Endringen forbedret lesbarheten til PyQt5-koden betydelig og forenklet vedlikeholdet av denne modulen:

    Det var:
    button_0 = knapper[0] @button_0.clicked.connect

    Nå kan du skrive:
    @buttons[0].clicked.connect

  • Til standardbiblioteket la til modul soneinfo, som inkluderer informasjon fra IANAs tidssonedatabase.

    >>> fra zoneinfo importer ZoneInfo
    >>> fra datetime import datetime, timedelta
    >>> # Sommertid
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Standard tid
    >>> dt += tidsdelta(dager=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

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

  • Lagt til graphlib-modul, der implementert støtte for topologisk sortering av grafer.
  • Foreslått nye metoder for å fjerne prefikser og linjeavslutninger - str.removeprefix(prefix) og str.removesuffix(suffiks). Metoder er lagt til str, bytes, bytearray og collections.UserString-objekter.

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

  • Involvert ny parser PEG (Parsing Expression Grammar), som erstattet parseren LL(1). Bruken av den nye parseren gjorde det mulig å kvitte seg med noen av "hakkene" som ble brukt for å omgå restriksjonene i LL(1), og reduserte arbeidskostnadene for vedlikehold av parseren betydelig. Ytelsesmessig er den nye parseren omtrent på samme nivå som den forrige, men er betydelig foran seg når det gjelder fleksibilitet, noe som gjør at du kan føle deg mer fri når du designer nye språkfunksjoner. Den gamle parserkoden beholdes inntil videre og kan returneres ved å bruke flagget "-X oldparser" eller miljøvariabelen "PYTHONOLDPARSER=1", men vil bli fjernet i versjon 3.10.
  • sørget for muligheten for C-utvidelsesmetoder for å få tilgang til tilstanden til modulene der de er definert ved hjelp av direkte peker-dereference i stedet for å søke etter modultilstanden ved å bruke PyState_FindModule-funksjonen. Endringen lar deg øke ytelsen til C-moduler ved å redusere eller helt eliminere kostnadene ved å kontrollere modultilstanden. For å assosiere en modul med en klasse, foreslås C-funksjonen PyType_FromModuleAndSpec(), for å få modulen og dens tilstand, foreslås C-funksjonene PyType_GetModule() og PyType_GetModuleState(), og for å gi en metode med tilgang til klassen der den er definert, foreslås C-funksjonen PyCMetod og METH_METHOD flagget. .
  • Søppelmann levert fra å låse samlinger som inneholder reanimerte gjenstander som forblir eksternt tilgjengelige etter at ferdiggjøreren er kjørt.
  • Lagt til metode os.pidfd_open, som gjør at Linux-kjerneundersystemet "pidfd" kan brukes til å håndtere PID-gjenbrukssituasjonen (pidfd er assosiert med en spesifikk prosess og endres ikke, mens en PID kan assosieres med en annen prosess etter at den gjeldende prosessen knyttet til den PID-en avsluttes ).
  • Støtte for Unicode-spesifikasjonen er oppdatert til versjon 13.0.0.
  • Eliminert hukommelsestap når du reinitialiserer Python-tolken i samme prosess.
  • Ytelsen til de innebygde typene range, tuple, set, frozenset, list og dict har blitt optimalisert. implementert gjennom bruk av Vectorcall-snarveisprotokollen for raskere tilgang til objekter skrevet på C-språket.
  • Modulene _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time og _weakref lastes inn fra initialisering i flere stadier.
  • Standard bibliotekmodulene audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios og zlib har blitt konvertert til bruk begrenset stabil ABI, som løser problemet med driften av sammenstillinger av utvidelsesmoduler for forskjellige versjoner av Python (når du oppdaterer versjonen, er det ikke nødvendig å gjenoppbygge utvidelsesmoduler, og moduler kompilert for 3.9 vil kunne fungere i 3.10-grenen).
  • Asyncio-modulen har avviklet støtte for reuse_address-parameteren på grunn av potensielle sikkerhetsproblemer (ved å bruke SO_REUSEADDR for UDP på ​​Linux tillater forskjellige prosesser å koble lyttesockets til en UDP-port).
  • Nye optimaliseringer er lagt til, for eksempel forbedret ytelse for signalbehandlere i flertrådede applikasjoner, økt hastighet på delprosessmodulen i FreeBSD-miljøet, og raskere tilordning av midlertidige variabler (tilordning av en variabel i uttrykket "for y i [uttr. ]” er nå like effektiv som uttrykket “y = expr” "). Generelt, de fleste tester showet ytelsesreduksjon sammenlignet med gren 3.8 (speedup observeres bare i write_local og write_deque-testene):

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

    Variabel og attributt lesetilgang:
    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
    les_klassevar_fra_klasse 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

    Variabel og attributt skrivetilgang:
    skrive_lokalt 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
    skrive_global 19.7 21.2 18.0 18.0 15.8 17.2
    skrive_klassevar 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

    Datastruktur lesetilgang:
    leseliste 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

    Datastruktur skrivetilgang:
    skriveliste 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
    skrive_dikt 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

    Stable (eller kø) operasjoner:
    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

    Tidssløyfe:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Fjernet mange Python 2.7-funksjoner og metoder som tidligere ble avviklet og resulterte i en DeprecationWarning i forrige utgivelse, inkludert unescape()-metoden i html.parser.HTMLParser,
    tostring() og fromstring() i array.array, isAlive() i threading.Thread, getchildren() og getiterator() i ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() og base64.decodestring().

Kilde: opennet.ru

Legg til en kommentar