Наконец вышел новый релиз языка программирования Python 3.9, и в этой статье мы увидим что нового появилось в нём.
Этот релиз готовился год, и это первый выпуск после объявления о переходе на новый цикл обновлений, теперь новая версия Python выпускаться через год, а не через полтора, как было раньше.
Что нового в Python 3.9:
- В словарях, определённых при помощи встроенного класса dict, появилась поддержка операторов слияния «|» и обновления «|=», которые дополняют методы
{**d1, **d2}
иdict.update
, ранее предлагавшиеся для объединения словарей.
12345678>>> 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
:
123def greet_all(names: list[str]) -> None:for name in names:print("Hello", name) - Предоставлены гибкие средства для аннотирования функций и переменных. Для прикрепления аннотаций в модуль
typing
добавлен новый типAnnotated
, расширяющий существующие типы дополнительными метаданными, которые могут использоваться при статическом анализе или для оптимизаций во время выполнения. Для доступа к метаданным из кода в методtyping.get_type_hints()
добавлен параметрinclude_extras
.
12charType = Annotated[int, ctype("char")]UnsignedShort = Annotated[int, struct2.ctype('H')] - Смягчены грамматические требования к декораторам — любое выражение, подходящее для использование в блоках if и while, теперь может быть использовано как декоратор. Изменение позволило заметно улучшить читаемость кода PyQt5 и упростить сопровождение данного модуля:
123456# Теперь можно писать:@buttons[0].clicked.connect# Было:button_0 = buttons[0]@button_0.clicked.connect - В стандартную библиотеку добавлен модуль zoneinfo, включающий информацию из базы часовых поясов IANA.
1234567891011121314151617>>> from zoneinfo import ZoneInfo>>> from 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
.
123>>> 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()
, а для предоставления методу доступа к классу, в котором он определён, Си-функцияPyCMethod
и флагMETH_METHOD
. - Сборщик мусора избавлен от блокировки коллекций, включающих реанимированные объекты, которые остаются доступными извне после запуска финализатора.
- Добавлен метод
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
):
123456789101112131415161718192021222324252627282930313233343536373839404142Версия 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.0read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8read_global 15.5 19.0 14.3 13.6 7.6 7.7read_builtin 21.1 21.6 18.5 19.0 7.5 7.7read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5read_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9Variable and attribute write access:write_local 8.7 9.3 5.5 5.3 4.3 4.2write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9write_global 19.7 21.2 18.0 18.0 15.8 17.2write_classvar 92.9 96.0 104.6 102.1 39.2 43.2write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7Data structure read access:read_list 24.2 24.5 20.8 20.8 19.0 21.1read_deque 24.7 25.5 20.2 20.6 19.8 21.6read_dict 24.3 25.7 22.3 23.0 21.0 22.5read_strdict 22.6 24.3 19.5 21.2 18.9 21.6Data structure write access:write_list 27.1 28.5 22.5 21.6 20.0 21.6write_deque 28.7 30.1 22.7 21.8 23.5 23.2write_dict 31.4 33.3 29.3 29.2 24.7 27.8write_strdict 28.4 29.9 27.5 25.2 23.1 29.8Stack (or queue) operations:list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5Timing 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()
.
Вывод:
Здесь вы прочитали что нового в новом релизе языка программирования Python 3.9, думаю вам было очень интересно.
Источник: OpenNet.