Пасля года распрацоўкі прадстаўлены значны выпуск мовы праграмавання Python 3.9. Python 3.9 стаў першым выпускам пасля пераходу праекта на новы цыкл падрыхтоўкі і суправаджэння рэлізаў. Новыя значныя выпускі зараз будуць фарміравацца раз на год, а карэкціруючыя абнаўленні выпускацца раз на два месяцы. Кожная значная галінка будзе падтрымлівацца на працягу паўтара года, пасля чаго яшчэ тры з паловай гады для яе будуць фармавацца выпраўленні з ухіленнем уразлівасцяў.
Праца над новай галінкай зараз пачынаецца за пяць месяцаў да рэлізу чарговай галінкі, г.зн. адначасова з выпускам Python 3.9 пачалося альфа-тэставанне галінкі Python 3.10. Ветка Python 3.10 будзе знаходзіцца на стадыі альфа-выпускаў на працягу сямі месяцаў, падчас якіх будуць дадавацца новыя магчымасці і здзяйсняцца выпраўленне памылак. Пасля гэтага на працягу трох месяцаў будзе праводзіцца тэставанне бэта-версій, падчас якога даданне новых магчымасцяў будзе забаронена і ўся ўвага будзе надавацца выпраўленню памылак. Апошнія два месяцы перад рэлізам галіна будзе знаходзіцца на стадыі кандыдата ў рэлізы, на якой будзе выканана фінальная стабілізацыя.
У слоўніках, вызначаных пры дапамозе ўбудаванага класа 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.
Змякчэлыя граматычныя патрабаванні да дэкаратараў - любы выраз, прыдатны для выкарыстання ў блоках if і while, зараз можа быць выкарыстана як дэкаратар. Змена дазволіла прыкметна палепшыць чытальнасць кода PyQt5 і спрасціць суправаджэнне дадзенага модуля:
Дададзены модуль 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 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().