Vydání programovacího jazyka Python 3.9

Po roce vývoje byl představen významné vydání programovacího jazyka Python 3.9. Python 3.9 se stal prvním vydáním po přechodu projektu na nový cyklus přípravy a podpory verzí. Nové významné verze nyní budou vytvářeny jednou ročně a opravy budou vydávány každé dva měsíce. Každá významná větev bude podporována po dobu jeden a půl roku, po kterém bude po dobu dalších tří a půl let poskytováno opravy pro odstranění zranitelností.

Práce na nové větvi nyní začíná pět měsíců před vydáním další větve, tj. současně s vydáním Python 3.9 začalo alfa-testování větve Python 3.10. Větev Python 3.10 bude v alfa-vydáních po dobu sedmi měsíců, během kterých budou přidávány nové funkce a prováděny opravy chyb. Poté během tří měsíců proběhne beta-testování, během kterého bude přidávání nových funkcí zakázáno a veškerá pozornost bude věnována opravám chyb. Poslední dva měsíce před uvolněním bude větev v kandidátní verzi, kde proběhne konečná stabilizace.

Mezi přidané novinky v Python 3.9:

  • Ve slovech definovaných pomocí vestavěné třídy dict, se objevila podpora operátorů sloučení „|“ a aktualizace „|=“, které doplňují metody {**d1, **d2} a dict.update, které byly dříve navrženy pro spojování slovníků.

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

  • Mezi vestavěné sbírky typů patří list, dict a tuple, které lze používat jako základní typy bez importu z modulu typing. Tj. místo typing.List, typing.Dict a typing.Tuple je nyní možné uvádět
    prostě list, dict a tuple:

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

  • Poskytovány flexibilní prostředky pro anotaci funkcí a proměnných. Pro připojení anotací byl do modulu typing přidán nový typ Annotated, který rozšiřuje stávající typy o další metadata, která mohou být použita při statické analýze nebo pro optimalizace během běhu. Pro přístup k metadatům z kódu byla do metody typing.get_type_hints() přidána volba include_extras.

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

  • Zjemněno gramatické požadavky na dekorátory — jakýkoli výraz vhodný pro použití v blocích if a while lze nyní použít jako dekorátor. Tato změna výrazně zlepšila čitelnost kódu PyQt5 a zjednodušila údržbu tohoto modulu:

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

    Nyní je možné psát:
    @buttons[0].clicked.connect

  • Do standardní knihovny přidán modul zoneinfo, zahrnující informace z databáze časových pásem IANA.

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

    >>> dt.tzname()
    'PDT'

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

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

  • Byl přidán modul graphlib, který obsahuje byla implementována podporu topologického třídění grafů.
  • Byly navrhnuty nové metody pro odstraňování prefixů a postfixů řetězců — 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'

  • Zapnut nový parser PEG (Parsing Expression Grammar), který nahradil parser LL(1).Použití nového parseru umožnilo zbavit se některých 'hacků', které byly používány k obcházení omezení v LL(1), a výrazně snížilo náklady na údržbu parseru. Z hlediska výkonu je nový parser přibližně na stejné úrovni jako minulý, ale výrazně ho předčí co do flexibility, což umožňuje větší volnost při navrhování nových funkcionalit jazyka. Kód starého parseru je prozatím uchován a může být obnoven pomocí příznaku '-X oldparser' nebo proměnné prostředí 'PYTHONOLDPARSER=1', ale bude odstraněn ve verzi 3.10.
  • Byla poskytnuta možnost přístupu metod C-rozšíření k stavu modulů, v nichž jsou definovány, pomocí přímého dereference ukazatelů místo vyhledávání stavu modulu pomocí funkce PyState_FindModule. Změna umožňuje zvýšení výkonu modulů psaných v C snížením nebo úplným vyloučením režijních nákladů na kontrolu stavu modulu. Pro asociaci modulu s třídou byla navržena C-funkce PyType_FromModuleAndSpec(), pro získání modulu a jeho stavu C-funkce PyType_GetModule() a PyType_GetModuleState(), a pro poskytnutí přístupu metodě ke třídě, ve které je definována, existuje C-funkce PyCMethod a příznak METH_METHOD.
  • Sběrač odpadu zbaven od blokování kolekcí zahrnujících znovu aktivované objekty, které zůstávají přístupné zvenčí po spuštění finalizátoru.
  • Byla přidána metoda os.pidfd_open, což umožňuje využít subsystém jádra Linux „pidfd“ pro řešení situace s opětovným použitím PID (pidfd je svázán s konkrétním procesem a nemění se, zatímco PID může být přiřazen jinému procesu po dokončení aktuálního procesu přidruženého k tomuto PID).
  • Podpora specifikace Unicode byla aktualizována na verzi 13.0.0.
  • Odstraněna únik paměti při opětovné inicializaci interpretátoru Python v jednom procesu.
  • Byla provedena optimalizace výkonu vestavěných typů range, tuple, set, frozenset, list a dict, realizovaná díky aplikaci protokolu rychlého volání 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 byly převezeny na načítání s inicializací ve více fázích.
  • Moduly standardní knihovny audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios a zlib byly převedeny na používání omezeného stabilního ABI, který řeší problém funkčnosti sestavení modulů rozšíření pro různé verze Pythonu (při aktualizaci verze není třeba znovu sestavovat moduly rozšíření a moduly sestavené pro 3.9 budou fungovat v větvi 3.10).
  • V modulu asyncio byla z důvodu potenciálních bezpečnostních problémů ukončena podpora parametru reuse_address (použití SO_REUSEADDR pro UDP v Linuxu umožňuje různým procesům připojit naslouchající sokety k UDP portu).
  • Byly přidány nové optimalizace, například byla zvýšena výkonnost obslužných rutin signálů v vícero procesních aplikacích, zvýšena rychlost modulu subprocess v prostředí FreeBSD a urychleno přiřazení dočasných proměnných (přiřazení proměnné ve výrazu „for y in [expr]“ nyní neustupuje rychlostí expresi „y = expr“). Celkově většina testů ukazují snižuje výkon ve srovnání s větví 3.8 (zrychlení je pozorováno pouze v testech write_local a write_deque):

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

    Přístup k proměnným a atributům:
    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
    číst_classvar_z_class 25.6 26.5 20.7 19.5 18.4 18.6
    číst_classvar_z_instance 22.8 23.5 18.8 17.1 16.4 20.1
    číst_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    číst_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    číst_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
    číst_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Přístup k proměnným a atributům pro zápis:
    zapsat_local 8.7 9.3 5.5 5.3 4.3 4.2
    zapsat_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    zapsat_global 19.7 21.2 18.0 18.0 15.8 17.2
    zapsat_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    zapsat_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    zapsat_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Přístup k datovým strukturám:
    číst_list 24.2 24.5 20.8 20.8 19.0 21.1
    číst_deque 24.7 25.5 20.2 20.6 19.8 21.6
    číst_dict 24.3 25.7 22.3 23.0 21.0 22.5
    číst_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Přístup k zápisu do datových struktur:
    zapsat_list 27.1 28.5 22.5 21.6 20.0 21.6
    zapsat_deque 28.7 30.1 22.7 21.8 23.5 23.2
    zapsat_dict 31.4 33.3 29.3 29.2 24.7 27.8
    zapsat_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Operace se zásobníky (nebo frontami):
    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ání smyčky:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Odstraněno mnoho funkcí a metod Pythonu 2.7, které byly dříve označeny jako zastaralé a v minulém vydání vyvolávaly varování DeprecationWarning, 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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster