Release van de programmeertaal Python 3.9

Na een jaar van ontwikkeling ingediend aanzienlijke release van programmeertaal Python 3.9. Python 3.9 was de eerste release daarna overgang projecteren op nieuwe cyclus voorbereiding en ondersteuning van releases. Nieuwe grote releases zullen nu één keer per jaar worden gegenereerd en corrigerende updates zullen elke twee maanden worden uitgebracht. Elke belangrijke tak zal anderhalf jaar lang worden ondersteund, waarna nog eens drieënhalf jaar zal worden ontwikkeld om kwetsbaarheden te verhelpen.

Het werk aan een nieuwe vestiging begint nu vijf maanden vóór de release van de volgende vestiging, d.w.z. die samenviel met de release van Python 3.9 begon alfatesten van de Python 3.10-tak. De Python 3.10-tak zal zeven maanden in alpha-release zijn, gedurende welke nieuwe functies zullen worden toegevoegd en bugs zullen worden verholpen. Hierna worden de bètaversies gedurende drie maanden getest, waarbij het toevoegen van nieuwe features verboden is en alle aandacht uitgaat naar het oplossen van bugs. De laatste twee maanden vóór de release bevindt de vestiging zich in de release candidate-fase, waarin de definitieve stabilisatie zal worden uitgevoerd.

onder toegevoegd innovaties in Python 3.9:

  • In woordenboeken die zijn gedefinieerd met behulp van de ingebouwde dict-klasse, verscheen ondersteuning voor samenvoegoperatoren "|" en "|=" updates, die een aanvulling vormen op de methoden {**d1, **d2} en dict.update die eerder zijn voorgesteld voor het samenvoegen van woordenboeken.

    >>> x = {"sleutel1": "waarde1 uit x", "sleutel2": "waarde2 uit x"}
    >>> y = {"sleutel2": "waarde2 uit y", "sleutel3": "waarde3 uit y"}

    >>> x | j
    {'key1': 'waarde1 uit x', 'key2': 'waarde2 uit y', 'key3': 'waarde3 uit y'}

    >>> j | X
    {'key2': 'waarde2 uit x', 'key3': 'waarde3 uit y', 'key1': 'waarde1 uit x'}

  • De ingebouwde verzameling typen omvat list, dict en tuple, die als basistypen kunnen worden gebruikt zonder vanuit de typmodule te importeren. Die. in plaats van typen.List, typen.Dict en typen.Tuple kunt u nu opgeven
    gewoon opsommen, dicteren en tupelen:

    def greet_all(namen: lijst[str]) -> Geen:
    voor naam in namen:
    print("Hallo", naam)

  • Voorzien flexibele tools voor het annoteren van functies en variabelen. Voor het bijvoegen van annotaties is een nieuw Annotated-type toegevoegd aan de typmodule, waarmee bestaande typen worden uitgebreid met extra metadata die kunnen worden gebruikt voor statische analyse of voor runtime-optimalisaties. Om toegang te krijgen tot metadata uit code, is de parameter include_extras toegevoegd aan de methode typeing.get_type_hints().

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

  • Afgezwakt grammaticale vereisten voor decorateurs - elke uitdrukking die geschikt is voor gebruik in if en while-blokken kan nu als decorateur worden gebruikt. De wijziging verbeterde de leesbaarheid van de PyQt5-code aanzienlijk en vereenvoudigde het onderhoud van deze module:

    Het was:
    button_0 = knoppen[0] @button_0.klikte.connect

    Nu kun je schrijven:
    @buttons[0].klikte.verbinden

  • Naar de standaardbibliotheek toegevoegd module zoneinfo, die informatie bevat uit de IANA-tijdzonedatabase.

    >>> van zoneinfo importeer ZoneInfo
    >>> van datumtijd importeer datumtijd, tijddelta
    >>> # Zomertijd
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Amerika/Los_Angeles"))
    >>> afdrukken(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tznaam()
    'PDT'

    >>> # Standaardtijd
    >>> dt += tijddelta(dagen=7)
    >>> afdrukken(dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tznaam())
    PST

  • Graphlib-module toegevoegd, waarin geïmplementeerd ondersteuning voor topologische sortering van grafieken.
  • Voorgesteld nieuwe methoden voor het verwijderen van voorvoegsels en regeleinden - str.removeprefix(voorvoegsel) en str.removesuffix(achtervoegsel). Er zijn methoden toegevoegd aan str, bytes, bytearray en collections.UserString-objecten.

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

  • Betrokken nieuwe parseerder PEG (Parsing Expression Grammar), die de parser verving LL(1). Het gebruik van de nieuwe parser maakte het mogelijk om een ​​aantal van de “hacks” te verwijderen die werden gebruikt om de beperkingen in LL(1) te omzeilen, en verminderde de arbeidskosten voor het onderhouden van de parser aanzienlijk. Qua prestaties bevindt de nieuwe parser zich ongeveer op hetzelfde niveau als de vorige, maar loopt hij aanzienlijk voor op het gebied van flexibiliteit, waardoor u zich vrijer kunt voelen bij het ontwerpen van nieuwe taalfuncties. De oude parsercode blijft voorlopig behouden en kan worden geretourneerd met de vlag "-X oldparser" of de omgevingsvariabele "PYTHONOLDPARSER=1", maar zal in release 3.10 worden verwijderd.
  • Mits de mogelijkheid voor C-uitbreidingsmethoden om toegang te krijgen tot de status van de modules waarin ze zijn gedefinieerd met behulp van directe pointer-dereferentie in plaats van te zoeken naar de modulestatus met behulp van de PyState_FindModule-functie. Met deze wijziging kunt u de prestaties van C-modules verbeteren door de overhead van het controleren van de modulestatus te verminderen of volledig te elimineren. Om een ​​module aan een klasse te koppelen, wordt de C-functie PyType_FromModuleAndSpec() voorgesteld, om de module en zijn status te verkrijgen, worden de C-functies PyType_GetModule() en PyType_GetModuleState() voorgesteld, en om een ​​methode te voorzien van toegang tot de klasse waarin het is gedefinieerd, worden de C-functie PyCMethod en de METH_METHOD-vlag voorgesteld.
  • Vuilnisman afgeleverd van het vergrendelen van collecties met gereanimeerde objecten die extern toegankelijk blijven nadat de finalizer is uitgevoerd.
  • Methode toegevoegd os.pidfd_open, waarmee het Linux-kernelsubsysteem "pidfd" kan worden gebruikt om de PID-hergebruiksituatie af te handelen (pidfd is geassocieerd met een specifiek proces en verandert niet, terwijl een PID kan worden geassocieerd met een ander proces nadat het huidige proces dat aan die PID is gekoppeld, is beëindigd ).
  • Ondersteuning voor de Unicode-specificatie is bijgewerkt naar versie 13.0.0.
  • Uitgeschakeld geheugenlek bij het opnieuw initialiseren van de Python-interpreter in hetzelfde proces.
  • De prestaties van de ingebouwde typen, tuple, set, frozenset, list en dict zijn geoptimaliseerd. geïmplementeerd door het gebruik van het Vectorcall-snelkoppelingsprotocol voor snellere toegang tot objecten geschreven in de C-taal.
  • Modules _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time en _weakref worden geladen vanuit initialisatie in verschillende fasen.
  • De standaardbibliotheekmodules audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios en zlib zijn geconverteerd om beperkte stabiele ABI, wat het probleem van de bruikbaarheid van assemblages van uitbreidingsmodules voor verschillende versies van Python oplost (bij het updaten van de versie is het niet nodig om uitbreidingsmodules opnieuw op te bouwen, en modules die voor 3.9 zijn gecompileerd, kunnen in de 3.10-branch werken).
  • De asyncio-module heeft de ondersteuning voor de parameter hergebruik_adres beëindigd vanwege mogelijke beveiligingsproblemen (door SO_REUSEADDR voor UDP op Linux te gebruiken kunnen verschillende processen luistersockets aan een UDP-poort koppelen).
  • Er zijn nieuwe optimalisaties toegevoegd, bijvoorbeeld verbeterde prestaties van signaalbehandelaars in multi-threaded applicaties, verhoogde snelheid van de subprocesmodule in de FreeBSD-omgeving, en snellere toewijzing van tijdelijke variabelen (het toewijzen van een variabele in de uitdrukking “for y in [expr ]” is nu net zo performant als de uitdrukking “y = expr” "). Over het algemeen de meeste tests tonen prestatievermindering vergeleken met branch 3.8 (versnelling wordt alleen waargenomen in de write_local en write_deque tests):

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

    Leestoegang voor variabelen en attributen:
    lees_lokaal 7.1 7.1 5.4 5.1 3.9 4.0
    lees_niet-lokaal 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_ingebouwd 21.1 21.6 18.5 19.0 7.5 7.7
    lees_klassevar_uit_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
    lees_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
    leesnaampaar 73.8 57.5 ​​45.0 46.8 18.4 23.2
    read_boundmethode 37.6 37.9 29.6 26.9 27.7 45.9

    Schrijftoegang voor variabelen en attributen:
    schrijf_lokaal 8.7 9.3 5.5 5.3 4.3 4.2
    schrijf_niet-lokaal 10.5 11.1 5.6 5.5 4.7 4.9
    schrijf_globaal 19.7 21.2 18.0 18.0 15.8 17.2
    schrijf_klassevar 92.9 96.0 104.6 102.1 39.2 43.2
    schrijf_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

    Datastructuur leestoegang:
    leeslijst 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_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Schrijftoegang tot de datastructuur:
    schrijflijst 27.1 28.5 22.5 21.6 20.0 21.6
    schrijf_deque 28.7 30.1 22.7 21.8 23.5 23.2
    schrijf_dict 31.4 33.3 29.3 29.2 24.7 27.8
    schrijf_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Stapelbewerkingen (of wachtrijbewerkingen):
    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

    Timinglus:
    lus_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Verwijderd veel Python 2.7-functies en -methoden die eerder verouderd waren en resulteerden in een DeprecationWarning in de vorige release, inclusief de unescape() -methode in html.parser.HTMLPaser,
    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 een reactie