De uitgave van programmeertaal Python 3.9

Na een jaar van ontwikkeling is gepresenteerd belangrijke release van de programmeertaal Python 3.9. Python 3.9 was de eerste release na de overgang het project op een nieuwe cyclus van voorbereiding en ondersteuning van releases. Nieuwe belangrijke releases worden nu jaarlijks gevormd, terwijl corrigerende updates om de twee maanden worden uitgebracht. Elke belangrijke tak wordt anderhalf jaar ondersteund, waarna er nog drieënhalf jaar correcties voor kwetsbaarheden worden aangeboden.

Het werk aan de nieuwe tak begint nu vijf maanden voor de release van de volgende tak, d.w.z. gelijktijdig met de release van Python 3.9 begon de alfa-testfase van tak Python 3.10. Tak Python 3.10 blijft zeven maanden in de alfa-releasefase, gedurende welke nieuwe mogelijkheden worden toegevoegd en fouten worden verholpen. Vervolgens wordt er drie maanden lang beta-ontwikkeling getest, waarbij het toevoegen van nieuwe mogelijkheden is verboden en alle aandacht gaat naar het corrigeren van fouten. De laatste twee maanden voor de release zal de tak zich in de releasecandidate-fase bevinden, waarin de finale stabilisatie plaatsvindt.

Onder toegevoegd veranderingen in Python 3.9:

  • In woordenboeken, gedefinieerd met behulp van de ingebouwde klasse dict, in de testbuild Canary, en is onlangs overgebracht naar de release. Om het te activeren, moet u naar het gedeelte flags chrome://flags gaan, het vlag 'Filesystem API in Incognito' zoeken via de zoekfunctie en deze inschakelen. Na het opnieuw opstarten van de browser zal de incognito-modus volledig functioneren. ondersteuning voor de samenvoegoperatoren «|» en de update-operator «|=», die de methoden {**d1, **d2} en dict.update aanvullen, die eerder werden aangeboden voor het samenvoegen van woordenboeken.

    >>> 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"}

  • De ingebouwde verzamelingen bevatten list, dict en tuple, die als basisformaten kunnen worden gebruikt zonder importeren uit de typing-module. D.w.z. in plaats van typing.List, typing.Dict en typing.Tuple kan nu eenvoudig
    list, dict en tuple worden gespecificeerd:

    def greet_all(names: list[str]) -> None:
    for name in names:
    print("Hello", name)

  • Er zijn flexibele middelen geboden voor het annoteren van functies en variabelen. Voor het attachen van annotaties is er een nieuw type Annotated aan de typing-module toegevoegd, dat bestaande types uitbreidt met aanvullende metadata die kunnen worden gebruikt bij statische analyse of voor optimalisaties tijdens runtime. Voor toegang tot metadata vanuit de code is een parameter include_extras aan de methode typing.get_type_hints() toegevoegd.

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

  • Verzacht Grammaticale vereisten voor decorateurs - elke expressie die geschikt is voor gebruik in if- en while-blokken kan nu als decorateur worden gebruikt. Deze wijziging heeft de leesbaarheid van de PyQt5-code aanzienlijk verbeterd en het onderhoud van deze module vereenvoudigd:

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

    Nu kan worden geschreven:
    @buttons[0].clicked.connect

  • In de standaardbibliotheek is toegevoegd module zoneinfo, inclusief informatie uit de IANA-tijdzone-database.

    >>> from zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta
    >>> # Zomertijd
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo('America/Los_Angeles'))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Standaardtijd
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

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

  • De graphlib-module is toegevoegd, waarin geïmplementeerd ondersteuning voor topologische sortering van grafen.
  • Nieuwe methoden zijn voorgesteld voor het verwijderen van string-prefixen en -suffixen - str.removeprefix(prefix) en str.removesuffix(suffix). Deze methoden zijn toegevoegd aan de objecten str, bytes, bytearray en collections.UserString. >>> s = 'FooBar'

    >>> s.removeprefix('Foo')
    'Bar'
    Ingevoerd

  • een nieuwe parser PEG (Parsing Expression Grammar), die de LL(1)-parser vervangt. Het gebruik van de nieuwe parser heeft het mogelijk gemaakt om bepaalde 'hacks' te vermijden die werden gebruikt om de beperkingen van LL(1) te omzeilen, en heeft de onderhoudskosten van de parser aanzienlijk verlaagd. Qua prestaties ligt de nieuwe parser ongeveer op hetzelfde niveau als de vorige, maar overtreft deze aanzienlijk in termen van flexibiliteit, waardoor het gemakkelijker is om nieuwe mogelijkheden van de taal te ontwerpen. De code van de oude parser is voorlopig behouden en kan worden hersteld met de flag '-X oldparser' of de omgevingsvariabele 'PYTHONOLDPARSER=1', maar zal worden verwijderd in versie 3.10. GegevenHet gebruik van de nieuwe parser heeft het mogelijk gemaakt om een aantal "hacks" die gebruikt werden om beperkingen in LL(1) te omzeilen, te verwijderen en heeft de werklast voor het onderhouden van de parser aanzienlijk verminderd. Qua prestaties ligt de nieuwe parser ongeveer op hetzelfde niveau als de vorige, maar overtreft deze hem aanzienlijk op het gebied van flexibiliteit, wat meer vrijheid biedt bij het ontwerpen van nieuwe mogelijkheden voor de taal. De code van de oude parser is voorlopig behouden en kan worden hersteld met de vlag "-X oldparser" of de omgevingsvariabele "PYTHONOLDPARSER=1", maar zal worden verwijderd in release 3.10.
  • Verstrekt de mogelijkheid voor C-extensie methoden om toegang te krijgen tot de toestand van de modules waarin ze zijn gedefinieerd, door gebruik te maken van directe dereferentie van pointers in plaats van het opzoeken van de module toestand met de functie PyState_FindModule. Deze wijziging verbetert de prestaties van C-modules door de overhead voor het controleren van de module toestand te verminderen of volledig uit te sluiten. Voor het associëren van een module met een klasse is de C-functie PyType_FromModuleAndSpec() voorgesteld, voor het verkrijgen van de module en zijn toestand zijn de C-functies PyType_GetModule() en PyType_GetModuleState() beschikbaar, en om de methode toegang te bieden tot de klasse waarin deze is gedefinieerd, is er de C-functie PyCMethod en de vlag METH_METHOD.
  • Garbage collector is bevrijd van het vergrendelen van verzamelingen die herstelde objecten bevatten, die beschikbaar blijven van buitenaf na het starten van de finalizer.
  • De methode os.pidfd_open, waarmee de Linux kernel substructuur 'pidfd' kan worden gebruikt om de situatie van PID-hergebruik aan te pakken (pidfd is gekoppeld aan een specifiek proces en verandert niet, terwijl de PID aan een ander proces kan worden gekoppeld nadat het huidige proces, dat met deze PID is geassocieerd, is beëindigd).
  • De ondersteuning voor de Unicode-specificatie is bijgewerkt naar versie 13.0.0.
  • Verholpen geheugenlek bij herinitialisatie van de Python-interpreter binnen één proces.
  • Er zijn prestatie-optimalisaties doorgevoerd voor de ingebouwde typen range, tuple, set, frozenset, list en dict, realisatie door gebruik te maken van het Vectorcall-protocol voor snellere toegang tot objecten die in C zijn geschreven.
  • De modules _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time en _weakref zijn omgezet naar laden met initialisatie in meerdere fasen.
  • De modules van de standaardbibliotheek audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios en zlib zijn omgezet naar gebruik van een beperkte stabiele ABI, die het probleem oplost van de functionaliteit van extensiemodules voor verschillende versies van Python (bij het upgraden van een versie is het niet nodig om de extensiemodules opnieuw te bouwen, en modules die voor 3.9 zijn gebouwd, kunnen werken in de 3.10 tak).
  • In de asyncio-module is de ondersteuning voor de parameter reuse_address stopgezet vanwege potentiële veiligheidsproblemen (het gebruik van SO_REUSEADDR voor UDP in Linux stelt verschillende processen in staat om luisterende sockets aan een UDP-poort te koppelen).
  • Er zijn nieuwe optimalisaties toegevoegd, zoals een verbeterde prestaties van signal handlers in multithreaded applicaties, verhoogde snelheid van de subprocess-module in de FreeBSD-omgeving en versnelling van het toewijzen van tijdelijke variabelen (het toewijzen van een variabele in de expressie «for y in [expr]» is nu niet minder snel dan de expressie «y = expr»). Over het algemeen zijn de meeste testen toont aan prestaties verlaagd in vergelijking met de tak 3.8 (versnellingen worden alleen waargenomen in de testen write_local en write_deque):

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

    Toegang tot variabelen en attributen:
    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
    read_classvar_from_class 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

    Toegang tot variabelen en attributen:
    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

    Toegang tot datastructuren:
    read_list 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

    Toegang tot schrijven aan datastructuren:
    write_list 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

    Stack (of queue) operaties:
    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

  • Verwijderd vele functies en methoden van Python 2.7, die eerder als verouderd waren gemarkeerd en in de vorige release een DeprecationWarning veroorzaakten, waaronder de unescape()-methode 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

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster