Бесплатно Экспресс-аудит сайта:

05.10.2023

Версия Python 3.12: что нового для разработчиков и какие перспективы открывает 3.13?

После годовой разработки опубликована значимая версия языка программирования Python 3.12 , поддержка которой продлится полтора года, после чего следует еще три с половиной года обновлений, направленных на устранение уязвимостей.

Разработчики также запустили альфа-тестирование Python 3.13 . Одной из заметных особенностей этой версии стал режим сборки CPython, который работает без глобальной блокировки интерпретатора (GIL). Планируется, что Python 3.13 будет в альфа-версии в течение 7 месяцев, с дальнейшим трёхмесячным тестированием бета-версий. Перед финальным релизом на протяжении двух месяцев версия будет на стадии кандидата в релизы.

Что нового в Python 3.12?

  • Улучшена гибкость разбора f-строк (форматированные литералы с префиксом ‘f’), позволившая избавиться от многих ограничений. Например, теперь можно использовать любые допустимые для Python выражения внутри f-строк, включая многострочные выражения, комментарии, обратные слэши и escape-последовательности для Unicode. Кроме того, теперь можно использовать одинаковые кавычки для обрамления f-строки и для внутренней строки (т.е. теперь можно использовать двойные кавычки внутри двойных кавычек, не переключаясь на одинарные). Улучшена информативность сообщений об ошибках в f-строках, в которых теперь показывается точное место ошибки в строке.
  • Внесены улучшения для работы на многоядерных системах: добавлена поддержка изолированных субинтерпретаторов и отдельных GIL (Global Interpreter Lock) для разных интерпретаторов в одном процессе. Пока эта функция доступна только через C-API.
  • В Python-код теперь можно использовать протокол buffer . Теперь классы, обеспечивающие метод "buffer()", могут быть использованы как типы, напрямую работающие с бинарными данными в памяти.
  • Предложен модуль sys.monitoring для отладки и профилирования, позволяющий с минимальными накладными расходами отслеживать такие события в CPython, как вызовы, возвраты из функций, выполнение произвольных строк кода, исключения и переходы.
  • В интерпретаторе добавлена функция для поддержки Linux ядра perf, что позволяет опознавать имена функций на Python в процессе профилирования с помощью утилиты perf.
  • Улучшена детальность сообщений об ошибках и расширен диапазон исключений, предоставляющих советы по коррекции опечаток. Например, теперь выводятся рекомендации по импорту забытых модулей стандартной библиотеки, показываются подсказки по добавлению префикса "self." в методах, определяется написание "import x from y" вместо "from y import x" и т.п
  • Ведутся работы по улучшению производительности, что привело к увеличению эффективности на 5%.
    • В процесс сборки добавлена экспериментальная поддержка бинарного оптимизатора BOLT, повышающего производительность на 1-5%.
    • Внедрено inline-развёртывание списковых включений ( comprehensions ), до двух раз ускоряющее работу со списковыми включениями (для кода, в котором активно используются списковые включения, тестирование показало общий прирост производительности на 11%).
    • Размер Unicode-элементов сокращен на 8-16 байт.
    • Действия с регулярными выражениями, такие как re.sub(), re.subn() и re.Pattern, теперь выполняются быстрее.
    • Проверки isinstance() для некоторых протоколов теперь в 2-20 раз быстрее.
    • Пакет asyncio стал значительно эффективнее, с ускорением до 75% в некоторых сценариях.
    • Ускорено создание объектов класса asyncio.Task.
    • Функции tokenize.tokenize() и tokenize.generate_tokens() значительно ускорены, в некоторых тестах на 64%.
    • Ускорена загрузка атрибутов и вызов метода super().
  • Представлен усовершенствованный синтаксис аннотаций типов для обобщенных классов и функций.
  • Предоставлен новый способ определения псевдонимов типов при помощи выражения «type».
  • В typing добавлен декоратор @override, информирующий системы проверки типов о том, что метод в подклассе предназначен для переопределения метода или атрибута в суперклассе. Декоратор может использоваться для выявления ошибок, связанных с тем, что предназначенный для переопределения метод не выполняет данное действие.
  • Для усиления безопасности встроенные реализации алгоритмов SHA1, SHA3, SHA2-384, SHA2-512 и MD5 в hashlib заменены на формально верифицированные варианты от проекта HACL* (встроенные реализации применяются только если отсутствует OpenSSL).
  • CPython теперь защищен от переполнения стека.
  • pathlib.Path теперь поддерживает подклассы.
  • Модуль os теперь предоставляет расширенную поддержку для Windows.
  • Модули sqlite3 и uuid получили интерфейсы командной строки.
  • В C-API добавлена поддержка «бессмертных» объектов, для которых не применяется подсчёт ссылок.
  • Реализована концепция нестабильного уровня C API, предназначенного для использования в отладчиках, JIT-компиляторах и прочих низкоуровневых инструментах.
  • Выполнена очистка от устаревших компонентов.
    • Модули asynchat, asyncore, smtpd, imp и distutils были удалены (но distutils по-прежнему доступен в пакете setuptools).
    • В Си-версии unicode-объектов исключены атрибуты wstr и wstr_length.
    • Исключены устаревшие методы из модуля unittest.
    • Избавились от устаревших и неэффективных функций, классов и методов, таких как locale.format(), io.OpenWrapper, ssl.RAND_pseudo_bytes(), ElementTree.Element.copy(), hashlib.pbkdf2_hmac(), gzip.GzipFile и других.
    • Поддержка устаревших браузеров в модуле webbrowser завершена, включая Grail, Mosaic, Netscape, Galeon и другие до Firefox версии 36.
    • С целью будущих оптимизаций пересмотрено внутреннее представление целочисленных значений.