Выпуск мовы праграмавання Python 3.9

Пасля года распрацоўкі прадстаўлены значны выпуск мовы праграмавання Python 3.9. Python 3.9 стаў першым выпускам пасля пераходу праекта на новы цыкл падрыхтоўкі і суправаджэння рэлізаў. Новыя значныя выпускі зараз будуць фарміравацца раз на год, а карэкціруючыя абнаўленні выпускацца раз на два месяцы. Кожная значная галінка будзе падтрымлівацца на працягу паўтара года, пасля чаго яшчэ тры з паловай гады для яе будуць фармавацца выпраўленні з ухіленнем уразлівасцяў.

Праца над новай галінкай зараз пачынаецца за пяць месяцаў да рэлізу чарговай галінкі, г.зн. адначасова з выпускам Python 3.9 пачалося альфа-тэставанне галінкі Python 3.10. Ветка Python 3.10 будзе знаходзіцца на стадыі альфа-выпускаў на працягу сямі месяцаў, падчас якіх будуць дадавацца новыя магчымасці і здзяйсняцца выпраўленне памылак. Пасля гэтага на працягу трох месяцаў будзе праводзіцца тэставанне бэта-версій, падчас якога даданне новых магчымасцяў будзе забаронена і ўся ўвага будзе надавацца выпраўленню памылак. Апошнія два месяцы перад рэлізам галіна будзе знаходзіцца на стадыі кандыдата ў рэлізы, на якой будзе выканана фінальная стабілізацыя.

Сярод дададзеных навін у Python 3.9:

  • У слоўніках, вызначаных пры дапамозе ўбудаванага класа dict, з'явілася падтрымка аператараў зліцця «|» і абнаўленні «|=», якія дапаўняюць метады {**d1, **d2} і dict.update, якія раней прапаноўваліся для аб'яднання слоўнікаў.

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

  • Ва ўбудаваную калекцыю тыпаў уключаны list, dict і tuple, якія можна выкарыстоўваць як базавыя тыпы без імпарту з модуля typing. Г.зн. замест typing.List, typing.Dict і typing.Tuple зараз можна ўказваць
    проста list, dict і tuple:

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

  • Прадастаўлены гнуткія сродкі для анатавання функцый і зменных. Для прымацавання анатацый у модуль typing дададзены новы тып Annotated, які пашырае існуючыя тыпы дадатковымі метададзенымі, якія могуць выкарыстоўвацца пры статычным аналізе або для аптымізацый падчас выканання. Для доступу да метададзеных з кода ў метад typing.get_type_hints() дададзены параметр include_extras.

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

  • Змякчэлыя граматычныя патрабаванні да дэкаратараў - любы выраз, прыдатны для выкарыстання ў блоках if і while, зараз можа быць выкарыстана як дэкаратар. Змена дазволіла прыкметна палепшыць чытальнасць кода PyQt5 і спрасціць суправаджэнне дадзенага модуля:

    было:
    button_0 = buttons[0] @button_0.clicked.connect

    Цяпер можна пісаць:
    @buttons[0].clicked.connect

  • У стандартную бібліятэку дададзены модуль інфармацыя аб зоне, Які ўключае інфармацыю з базы гадзінных паясоў IANA.

    >>> ад zoneinfo import ZoneInfo
    >>> ад datetime import datetime, timedelta
    >>> # Летні час
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo(«America/Los_Angeles»))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Стандартны час
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

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

  • Дададзены модуль graphlib, у якім рэалізавана падтрымка тапалагічнай сартавання графаў.
  • Прапанаваны новыя метады для выдалення прэфіксаў і канчаткаў радкоў - str.removeprefix(prefix) і str.removesuffix(suffix). Метады дададзены ў аб'екты str, bytes, bytearray і collections.UserString.

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

  • Задзейнічаны новы парсер PEG (Parsing Expression Grammar), які прыйшоў на змену парсеру LL(1). Ужыванне новага парсера дазволіла пазбавіцца ад некаторых "хакаў", выкарыстоўваных для абыходу абмежаванняў у LL(1), і істотна знізіла працавыдаткі на суправаджэнне парсера. Па прадукцыйнасці новы парсер знаходзіцца прыкладна на адным узроўні з мінулым, але значна апярэджвае яго ў плане гнуткасці, што дазваляе больш вольна пачувацца пры праектаванні новых магчымасцяў мовы. Код старога парсера пакуль захаваны і можа быць вернуты пры дапамозе сцяга "-X oldparser" ці зменнай асяроддзі "PYTHONOLDPARSER=1", але будзе выдалены ў выпуску 3.10.
  • Прадастаўлена магчымасць доступу метадаў Сі-пашырэнняў да стану модуляў, у якіх яны вызначаны, з ужываннем прамога разнаймення паказальнікаў замест пошуку стану модуля пры дапамозе функцыі PyState_FindModule. Змена дазваляе падвысіць прадукцыйнасць модуляў на Сі за рахунак паніжэння ці поўнага выключэння накладных выдаткаў на праверку стану модуля. Для асацыявання модуля з класам прапанавана Сі-функцыя PyType_FromModuleAndSpec(), для атрымання модуля і яго стану Сі-функцыі PyType_GetModule() і PyType_GetModuleState(), а для падавання метаду доступу да класа, у якім ён вызначаны, Сі-функцыя PTH .
  • Зборшчык смецця пазбаўлены ад блакіроўкі калекцый, якія ўключаюць рэаніміраваныя аб'екты, якія застаюцца даступнымі звонку пасля запуску фіналізатара.
  • Дададзены метад os.pidfd_open, Які дазваляе выкарыстоўваць падсістэму ядра Linux "pidfd" для апрацоўкі сітуацыі з паўторным выкарыстаннем PID (pidfd звязваецца з пэўным працэсам і не змяняецца, у той час як PID можа быць прывязаны да іншага працэсу пасля завяршэння бягучага працэсу, асацыяванага з гэтым PID).
  • Падтрымка спецыфікацыі Unicode абноўлена да версіі 13.0.0.
  • Ухілена уцечка памяці пры паўторнай ініцыялізацыі інтэрпрэтатара Python у адным працэсе.
  • Праведзена аптымізацыя прадукцыйнасці ўбудаваных тыпаў range, tuple, set, frozenset, list і dict, рэалізаваная за кошт прымянення пратакола хуткага выкліку Vectorcall для больш хуткага звароту да аб'ектаў, напісаных на мове Сі.
  • Модулі _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time і _weakref перакладзены на загрузку з ініцыялізацыяй у некалькі стадый.
  • Модулі стандартнай бібліятэкі audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios і zlib перакладзены на выкарыстанне абмежаванага стабільнага ABI, Які вырашае праблему працаздольнасці зборак модуляў-пашырэнняў для розных версій Python (пры абнаўленні версіі не патрабуецца перазбіраць модулі-пашырэння, і модулі сабраныя для 3.9, змогуць працаваць у галінцы 3.10).
  • У модулі asyncio з-за патэнцыйных праблем з бяспекай спыненая падтрымка параметра reuse_address (выкарыстанне SO_REUSEADDR для UDP у Linux дазваляе розным працэсам прымацоўваць якія слухаюць сокеты да UDP-порту).
  • Дададзены новыя аптымізацыі, напрыклад, падвышаная прадукцыйнасць апрацоўшчыкаў сігналаў у шматструменных прыкладаннях, падвышаная хуткасць працы модуля subprocess у асяроддзі FreeBSD і паскорана прысваенне часавых зменных (прызначэнне зменнай у выразе «for y in [expr]» зараз не саступае па прадукцыйнасці выразу «y = expr »). У цэлым большасць тэстаў паказваюць зніжэнне прадукцыйнасці ў параўнанні з галінкай 3.8 (паскарэнне назіраецца толькі ў тэстах write_local і write_deque):

    Версія Python 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — —

    Variable and attribute read access:
    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

    Variable and attribute write access:
    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

    Data structure read access:
    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

    Data structure write access:
    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 (or queue) operations:
    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

  • Выдалены шматлікія функцыі і метады Python 2.7, якія раней былі адзначаны састарэлымі і ў мінулым выпуску прыводзілі да высновы папярэджання DeprecationWarning, уключаючы метад unescape() у html.parser.HTMLParser,
    tostring() і fromstring() у array.array, isAlive() у threading.Thread, getchildren() і getiterator() у ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() і base64.decodestring().

Крыніца: opennet.ru

Дадаць каментар