+38/050/370-3627
+38/067/502-3306
+38/044/257-2444
Новости

Python 3.8 - представлен значительный релиз языка программирования Python

Python 3.8 - представлен значительный релиз языка программирования Python

Представлен значительный релиз языка программирования Python 3.8. Корректирующие обновления для ветки Python 3.8 планируется выпускать в течение 18 месяцев. Критические уязвимости будут исправляться 5 лет до октября 2024 года. Корректирующие обновления для ветки 3.8 будут выходить раз в два месяца, на декабрь намечен первый корректирующий релиз Python 3.8.1.

Среди добавленных новшеств:

  • Поддержка операций присвоения внутри сложных выражений. При помощи нового оператора ":=" появилась возможность выполнять операции присвоения значений внутри других выражений, например, чтобы избежать двойного вызова функций в условных операторах и при определении циклов:
       if (n := len(a)) > 10:
          ...
    
       while (block := f.read(256)) != '':
          ...
    
  • Поддержка нового синтаксиса задания аргументов функции. При перечислении аргументов во время определения функции теперь можно указывать признак "/", позволяющий отделить аргументы, значения которым могут быть присвоены только на основе порядка перечисления значений во время вызова функции, от аргументов, допускающих присвоение в произвольном порядке (синтаксис "переменная=значение"). С практической стороны новая возможность позволяет в функциях на языке Python полностью эмулировать поведение существующих функций на языке Си, а также избежать привязок к конкретным именам, например, если имя параметра планируется изменить в будущем.

    Флаг "/" дополняет собой ранее добавленный признак "*", отделяющий переменные, для которых применимо только присвоение в форме "переменная=значение". Например, в функции "def f(a, b, /, c, d, *, e, f):" переменные "a" и "b" могут быть присвоены только в порядке перечисления значений, переменные "e" и "f", только через присвоение "переменная=значение", а переменные "c" и "d" любым из указанных способов:

       f(10, 20, 30, 40, e=50, f=60)
       f(10, 20, с=30, d=40, e=50, f=60)
    
  • Добавлен новый Си API для настройки параметров инициализации Python, позволяющий полностью контролировать всю конфигурацию и предоставляющий расширенные средства обработки ошибок. Предложенный API упрощает встраивание функциональности интерпретатора Python в другие приложения на языке Си;
  • Реализован новый протокол Vectorcall для более быстрого обращения к объектам, написанным на языке Си. В CPython 3.8 доступ к Vectorcall пока ограничен внутренним использованием, перевод в разряд публично доступных API намечен в CPython 3.9;
  • Добавлены вызовы Runtime Audit Hooks, предоставляющие приложениям и фреймворкам на языке Python доступ к низкоуровневой информации о ходе выполнения скрипта для проведения аудита выполняемых действий (например, можно отследить импорт модулей, открытие файлов, использовании трассировки, обращения к сетевым сокетам, запуск кода через exec, eval и run_mod);
  • В модуле pickle обеспечена поддержка протокола Pickle 5, используемого для сериализации и десериализации объектов. Pickle позволяет оптимизировать передачу больших объёмов данных между процессами Python в многоядерных и многоузловых конфигурациях, сократив число операций копирования памяти и применяя дополнительные техники оптимизации, такие как задействование специфичных для определённых данных алгоритмов сжатия. Пятая версия протокола примечательна добавлением режима отделённой передачи (out-of-band), при которого данные могут передаваться отдельно от основного потока pickle.
  • По умолчанию активирована четвёртая версия протокола Pickle, которая по сравнению с ранее предлагавшейся по умолчанию третьей версией позволяет добиться более высокой производительности и сокращения размера передаваемых данных;
  • В модуле typing представлено несколько новых возможностей:
    • Класс TypedDict для ассоциативных массивов, в которых для связываемых с ключами данных явно задаётся информация о типе ("TypedDict('Point2D', x=int, y=int, label=str)").
    • Тип Literal, позволяющий ограничить параметр или возвращаемое значение несколькими предопределёнными значениями ("Literal['connected', 'disconnected']").
    • Конструкция "Final", дающая возможность определить значения переменных, функций, методов и классов, которые не могут быть изменены или переназначены ("pi: Final[float] = 3.1415926536").
  • Добавлена возможность назначения кэша для скомпилированных файлов с байткодом, сохраняемого в отдельном дереве ФС и отделённого от каталогов с кодом. Путь для сохранения файлов с байткодом задаётся через переменную PYTHONPYCACHEPREFIX или опцию "-X pycache_prefix";
  • Реализована возможность создания отладочных сборок Python, использующих идентичный с релизом ABI, что позволяет в отладочных сборках загружать написанные на языке СИ расширения, собранные для стабильных выпусков;
  • В f-строках (форматируемые литералы с префиксом 'f') обеспечена поддержка оператора "=" (например, "f'{expr=}'"), позволяющего преобразовать выражение в текст для упрощения отладки. Например:
       ››› user = 'eric_idle'
       ››› member_since = date(1975, 7, 31)
       ››› f'{user=} {member_since=}'
       "user='eric_idle' member_since=datetime.date(1975, 7, 31)"
    
  • Выражение "continue" разрешено использовать внутри блока finally;
  • Добавлен новый модуль multiprocessing.shared_memory, позволяющий использовать сегменты разделяемой памяти в многопроцессных конфигурациях;
  • На платформе Windows реализация asyncio переведена на использование класса ProactorEventLoop;
  • Производительность инструкции LOAD_GLOBAL увеличена примерно на 40% за счёт использования нового механизма кэширования объектного кода.

Другие новости