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

Автор Сообщение
news_bot ®

Стаж: 6 лет 3 месяца
Сообщений: 27286

Создавать темы news_bot ® написал(а)
06-Окт-2020 13:30

После года разработки представлен значительный выпуск языка программирования 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 и упростить сопровождение данного модуля:
    Было:
          @buttons[0].clicked.connect
       Теперь можно писать:
          button_0 = buttons[0]
          @button_0.clicked.connect
  • В стандартную библиотеку добавлен модуль zoneinfo, включающий информацию из базы часовых поясов IANA.
  • Предложены новые методы для удаления префиксов и окончаний строк - 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(), а для предоставления методу доступа к классу, в котором он определён, Си-функция PyCMethod и флаг METH_METHOD.
  • Сборщик мусора избавлен от блокировки коллекций, включающих воскрешённые объекты, которые остаются доступными извне после запуска финализатора.
  • Добавлен метод os.pidfd_open, позволяющий использовать подсистему ядра Linux "pidfd" для обработки ситуации с повторным использованием PID (pidfd связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID).
  • Поддержка спецификации Unicode обновлена до версии 13.0.0.
  • В модуле graphlib реализована поддержка топологического поиска в графе.
  • Устранена утечка памяти при повторной инициализации интерпретатора 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).
  • Добавлены новые оптимизации, например, повышена производительность обработчиков сигналов в многопоточных приложениях, повышена скорость работы модуля 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    [b]4.2[/b]
        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   [b]23.2[/b]
        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,
    json.loads(), sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() и base64.decodestring().

===========
Источник:
OpenNet.RU
===========

Похожие новости: Теги для поиска: #_python
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 19-Май 12:12
Часовой пояс: UTC + 5