Vydání programovacího jazyka Python 3.9

Po roce vývoje prezentovány významné vydání programovacího jazyka Python 3.9. Python 3.9 byl prvním vydáním poté přechod projekt na nový cyklus příprava a podpora vydání. Nové hlavní verze budou nyní generovány jednou ročně a opravné aktualizace budou vydávány každé dva měsíce. Každá významná větev bude podporována po dobu jednoho a půl roku a poté bude dalších tři a půl roku vyvíjena na opravu zranitelností.

Práce na nové pobočce nyní začínají pět měsíců před vydáním další pobočky, tzn. současně s vydáním Pythonu 3.9 začal alfa testování větve Python 3.10. Větev Pythonu 3.10 bude ve verzi alfa sedm měsíců, během kterých budou přidávány nové funkce a opraveny chyby. Poté budou betaverze testovány po dobu tří měsíců, během kterých bude zakázáno přidávání nových funkcí a veškerá pozornost bude věnována opravám chyb. Poslední dva měsíce před vydáním bude pobočka ve fázi kandidáta na vydání, kdy bude provedena finální stabilizace.

Mezi přidal inovace v Pythonu 3.9:

  • Ve slovnících definovaných pomocí vestavěné třídy dict, se objevil podpora pro operátory sloučení "|" a aktualizace "|=", které doplňují metody {**d1, **d2} a dict.update dříve navržené pro slučování slovníků.

    >>> x = {"klíč1": "hodnota1 z x", "klíč2": "hodnota2 z x"}
    >>> y = {"klíč2": "hodnota2 z y", "klíč3": "hodnota3 z 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'}

  • Vestavěná kolekce typů zahrnuje seznam, diktát a n-tice, které lze použít jako základní typy bez importu z modulu pro psaní. Tito. místo typing.List, typeing.Dict a typing.Tuple nyní můžete zadat
    stačí vyjmenovat, diktovat a n-tice:

    def greet_all(names: list[str]) -> None:
    pro jméno ve jménech:
    tisknout("Ahoj", jméno)

  • Jsou poskytovány flexibilní nástroje pro anotaci funkcí a proměnných. Pro připojení anotací byl do typovacího modulu přidán nový typ s poznámkami, který rozšiřuje stávající typy o další metadata, která lze použít pro statickou analýzu nebo pro optimalizaci za běhu. Pro přístup k metadatům z kódu byl do metody typing.get_type_hints() přidán parametr include_extras.

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

  • Zmírněno gramatické požadavky na dekoratéry – jako dekoratér lze nyní použít jakýkoli výraz vhodný pro použití v blocích if a while. Změna výrazně zlepšila čitelnost kódu PyQt5 a zjednodušila údržbu tohoto modulu:

    Bylo to:
    button_0 = buttons[0] @button_0.clicked.connect

    Nyní můžete napsat:
    @buttons[0].clicked.connect

  • Do standardní knihovny přidal modulu info o zóně, která obsahuje informace z databáze časových pásem IANA.

    >>> z zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta
    >>> # Letní čas
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Amerika/Los_Angeles"))
    >>> tisk (dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Standardní čas
    >>> dt += timedelta(dny=7)
    >>> tisk (dt)
    2020-11-07 12:00:00-08:00

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

  • Přidán modul graphlib, ve kterém implementováno podpora topologického řazení grafů.
  • Navrženo nové metody odstraňování předpon a zakončení řádků - str.removeprefix(prefix) a str.removesuffix(suffix). Metody byly přidány do objektů str, bytes, bytearray a collections.UserString.

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

  • Zapojený nový parser PEG (Parsing Expression Grammar), který nahradil analyzátor LL(1). Použití nového analyzátoru umožnilo zbavit se některých „hacků“ používaných k obcházení omezení v LL(1) a výrazně snížilo mzdové náklady na údržbu analyzátoru. Z hlediska výkonu je nový parser přibližně na stejné úrovni jako předchozí, ale výrazně před ním z hlediska flexibility, což vám umožňuje cítit se svobodněji při navrhování nových jazykových funkcí. Starý kód analyzátoru je prozatím zachován a lze jej vrátit pomocí příznaku "-X oldparser" nebo proměnné prostředí "PYTHONOLDPARSER=1", ale ve verzi 3.10 bude odstraněn.
  • Pokud schopnost metod rozšíření C přistupovat ke stavu modulů, ve kterých jsou definovány, pomocí přímé dereference ukazatele namísto hledání stavu modulu pomocí funkce PyState_FindModule. Změna umožňuje zvýšit výkon modulů C snížením nebo úplným odstraněním režie na kontrolu stavu modulu. Pro přidružení modulu ke třídě je navržena C-funkce PyType_FromModuleAndSpec(), pro získání modulu a jeho stavu jsou navrženy C-funkce PyType_GetModule() a PyType_GetModuleState() a pro poskytnutí metody s přístupem ke třídě ve kterém je definována, je navržena C-funkce PyCMethod a příznak METH_METHOD.
  • Popelář doručeno z uzamčení kolekcí obsahujících reanimované objekty, které zůstávají po spuštění finalizátoru externě přístupné.
  • Přidána metoda os.pidfd_open, který umožňuje použití linuxového kernelového subsystému „pidfd“ k řešení situace opětovného použití PID (pidfd je spojen s konkrétním procesem a nemění se, zatímco PID může být spojen s jiným procesem poté, co aktuální proces spojený s tímto PID skončí ).
  • Podpora specifikace Unicode byla aktualizována na verzi 13.0.0.
  • Vyřazeno únik paměti při reinicializaci interpretru Pythonu ve stejném procesu.
  • Byl optimalizován výkon vestavěných typů range, tuple, set, frozenset, list a dict. implementováno díky použití zkratkového protokolu Vectorcall pro rychlejší přístup k objektům napsaným v jazyce C.
  • Moduly _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time a _weakref se načítají z inicializace v několika fázích.
  • Standardní knihovní moduly audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios a zlib byly převedeny na omezené použití stabilní ABI, který řeší problém provozuschopnosti sestav rozšiřujících modulů pro různé verze Pythonu (při aktualizaci verze není potřeba přestavovat rozšiřující moduly a moduly zkompilované pro 3.9 budou moci pracovat ve větvi 3.10).
  • Modul asyncio má zastaralou podporu pro parametr reuse_address kvůli potenciálním bezpečnostním problémům (použití SO_REUSEADDR pro UDP na Linuxu umožňuje různým procesům připojit naslouchající sokety k portu UDP).
  • Byly přidány nové optimalizace, například zlepšený výkon signálových handlerů ve vícevláknových aplikacích, zvýšená rychlost modulu subprocess v prostředí FreeBSD a rychlejší přiřazování dočasných proměnných (přiřazení proměnné ve výrazu „for y in [expr ]“ je nyní stejně výkonný jako výraz „y = expr“ “). Obecně většina testů show pokles výkonu ve srovnání s větví 3.8 (zrychlení je pozorováno pouze v testech write_local a write_deque):

    Verze Pythonu 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — — —

    Přístup pro čtení proměnných a atributů:
    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

    Přístup pro zápis proměnných a atributů:
    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
    psát_globálně 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

    Přístup ke čtení datové struktury:
    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

    Přístup k datové struktuře pro zápis:
    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

    Operace zásobníku (nebo fronty):
    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

    Časová smyčka:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Odebráno mnoho funkcí a metod Pythonu 2.7, které byly dříve zastaralé a vedly k upozornění DeprecationWarning v předchozí verzi, včetně metody unescape() v html.parser.HTMLParser,
    tostring() a fromstring() v array.array, isAlive() v threading.Thread, getchildren() a getiterator() v ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() a base64.decodestring().

Zdroj: opennet.ru

Přidat komentář