Udgivelse af programmeringssproget Python 3.9

Efter et års udvikling præsenteret betydelig udgivelse af programmeringssprog Python 3.9. Python 3.9 var den første udgivelse efter overgang projekt på ny cyklus forberedelse og support af udgivelser. Nye større udgivelser vil nu blive genereret en gang om året, og korrigerende opdateringer vil blive frigivet hver anden måned. Hver væsentlig filial vil blive understøttet i halvandet år, hvorefter yderligere tre et halvt år vil blive udviklet til at rette op på sårbarheder.

Arbejdet med en ny filial begynder nu fem måneder før udgivelsen af ​​den næste filial, dvs. falder sammen med udgivelsen af ​​Python 3.9 begyndte alfa-test af Python 3.10-grenen. Python 3.10-grenen vil være i alfa-udgivelse i syv måneder, hvor nye funktioner vil blive tilføjet og fejl rettet. Herefter vil betaversioner blive testet i tre måneder, hvor det er forbudt at tilføje nye funktioner, og al opmærksomhed vil blive rettet mod at rette fejl. De sidste to måneder før udgivelsen vil filialen være på udgivelseskandidatstadiet, hvor den endelige stabilisering vil blive udført.

blandt tilføjet innovationer i Python 3.9:

  • I ordbøger defineret ved hjælp af den indbyggede dict-klasse, optrådte understøttelse af fletteoperatører "|" og "|="-opdateringer, som supplerer metoderne {**d1, **d2} og dict.update, der tidligere er foreslået til sammenlægning af ordbøger.

    >>> 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 indbyggede samling af typer inkluderer list, dict og tuple, som kan bruges som basistyper uden at importere fra indtastningsmodulet. De der. i stedet for at taste.List, typing.Dict og typing.Tuple kan du nu angive
    bare list, dikt og tuple:

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

  • Er forudsat fleksible værktøjer til at kommentere funktioner og variabler. For at vedhæfte annoteringer er der tilføjet en ny kommenteret type til indtastningsmodulet, der udvider eksisterende typer med yderligere metadata, der kan bruges til statisk analyse eller til kørselstidsoptimeringer. For at få adgang til metadata fra kode er include_extras-parameteren blevet tilføjet til typing.get_type_hints()-metoden.

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

  • Nedtonet grammatiske krav til dekoratører - ethvert udtryk, der egner sig til brug i hvis og mens blokke kan nu bruges som dekoratør. Ændringen forbedrede markant læsbarheden af ​​PyQt5-koden og forenklede vedligeholdelsen af ​​dette modul:

    Var:
    button_0 = knapper[0] @button_0.clicked.connect

    Nu kan du skrive:
    @knapper[0].klikket.tilslut

  • Til standardbiblioteket tilføjet modul zoneinfo, som omfatter oplysninger fra IANAs tidszonedatabase.

    >>> 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'

    >>> # Standardtid
    >>> dt += tidsdelta(dage=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tznavn())
    PST

  • Tilføjet graphlib-modul, hvori implementeret understøttelse af topologisk sortering af grafer.
  • Foreslog nye metoder til at fjerne præfikser og linjeafslutninger - str.removeprefix(prefix) og str.removesuffix(suffix). Metoder er blevet tilføjet til str, bytes, bytearray og collections.UserString-objekter.

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

  • Involveret ny parser PEG (Parsing Expression Grammar), som erstattede parseren LL(1). Brugen af ​​den nye parser gjorde det muligt at slippe af med nogle af de "hacks", der blev brugt til at omgå restriktionerne i LL(1), og reducerede markant arbejdsomkostningerne for at vedligeholde parseren. Ydeevnemæssigt er den nye parser omtrent på samme niveau som den forrige, men er markant foran sig med hensyn til fleksibilitet, som giver dig mulighed for at føle dig mere fri, når du designer nye sprogfunktioner. Den gamle parserkode bevares indtil videre og kan returneres ved at bruge "-X oldparser"-flaget eller miljøvariablen "PYTHONOLDPARSER=1", men vil blive fjernet i version 3.10.
  • Stillet til rådighed muligheden for C-udvidelsesmetoder til at få adgang til tilstanden for de moduler, hvor de er defineret ved hjælp af direkte pointer-dereference i stedet for at søge efter modultilstanden ved hjælp af PyState_FindModule-funktionen. Ændringen giver dig mulighed for at øge ydeevnen af ​​C-moduler ved at reducere eller helt eliminere omkostningerne ved at kontrollere modulets tilstand. For at associere et modul med en klasse, foreslås C-funktionen PyType_FromModuleAndSpec(), for at opnå modulet og dets tilstand foreslås C-funktionerne PyType_GetModule() og PyType_GetModuleState() og for at give en metode med adgang til klassen hvor det er defineret, foreslås C-funktionen PyCMetod og METH_METHOD flaget.
  • Skraldemand leveret fra låsning af samlinger, der indeholder genoplivede objekter, der forbliver eksternt tilgængelige, efter at færdiggørelsen er kørt.
  • Tilføjet metode os.pidfd_open, som gør det muligt for Linux-kerne-undersystemet "pidfd" at blive brugt til at håndtere PID-genbrugssituationen (pidfd er knyttet til en specifik proces og ændres ikke, mens en PID kan associeres med en anden proces, efter at den aktuelle proces, der er knyttet til det PID, afsluttes ).
  • Understøttelse af Unicode-specifikationen er blevet opdateret til version 13.0.0.
  • Elimineret hukommelsestab ved geninitialisering af Python-fortolkeren i samme proces.
  • Ydeevnen for de indbyggede typer range, tuple, set, frozenset, list og dict er blevet optimeret. implementeret gennem brug af Vectorcall-genvejsprotokollen for hurtigere adgang til objekter skrevet på C-sproget.
  • Modulerne _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, ressource, time og _weakref indlæses fra initialisering i flere faser.
  • Standardbiblioteksmodulerne audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios og zlib er blevet konverteret til use restricted stabil ABI, som løser problemet med driften af ​​samlinger af udvidelsesmoduler til forskellige versioner af Python (når du opdaterer versionen, er der ingen grund til at genopbygge udvidelsesmoduler, og moduler kompileret til 3.9 vil kunne fungere i 3.10-grenen).
  • Asyncio-modulet har forældet understøttelse af parameteren reuse_address på grund af potentielle sikkerhedsproblemer (ved at bruge SO_REUSEADDR til UDP på ​​Linux tillader forskellige processer at tilslutte lyttesockets til en UDP-port).
  • Nye optimeringer er tilføjet, for eksempel forbedret ydeevne af signalhandlere i multi-threaded applikationer, øget hastighed af subproces modulet i FreeBSD miljøet, og hurtigere tildeling af midlertidige variabler (tildeling af en variabel i udtrykket "for y i [udtr. ]” er nu lige så effektiv som udtrykket “y = expr” "). Generelt er de fleste tests show ydelsesfald sammenlignet med branch 3.8 (speedup observeres kun i write_local og write_deque testene):

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

    Variabel og attribut læseadgang:
    læs_lokal 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
    læs_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 attribut skriveadgang:
    skriv_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
    write_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 læseadgang:
    læseliste 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 skriveadgang:
    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
    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

    Stak- (eller kø) handlinger:
    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

    Timing loop:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Fjernet mange Python 2.7-funktioner og -metoder, der tidligere var forældet og resulterede i en DeprecationWarning i den tidligere udgivelse, inklusive 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

Tilføj en kommentar