Что нового в Python 3.12 — функции, обновления и улучшения

Новые функции, обновления и улучшения Python 3.12

Python, динамический язык, известный своей читаемостью, универсальностью и сильным сообществом, снова сделал шаг вперед с новой версией 3.12, выпущенной 2 октября. С многочисленными улучшениями и новыми возможностями вкладчики со всего мира помогли Python сделать еще один большой скачок вперед. Если Вас интересуют последние улучшения этого языка, то этот статья для Вас.

Python выпускает новые версии ежегодно, с функционально замороженной бета-версией в начале года и официальной новой версией в конце года.

Версии Python

Без лишней траты времени давайте посмотрим на улучшения в этой версии.

Улучшенные сообщения об ошибках

Python начал предлагать пользователю предложения о возможных опечатках, что является неотъемлемой частью этого языка. Вот некоторые новые возможности:

  • Модули, которые мы забыли импортировать в свой код, предлагаются в новой версии как часть сообщения об ошибке.

  • В случае опечатки в переменной или имени функции предоставляются предложения в случае возникновения NameError.

  • В исключениях ImportError, вызванных неудачными операторами from <module> import <name>, теперь предлагаются варианты значений <name> на основе потенциально доступных имен в <module>.

  • Сообщения об ошибках синтаксиса улучшены, если пользователь вводит import x from y вместо from x import y.

  • Предложения по ошибке NameError теперь также включают предшествующий self. к имени, когда они возникают внутри экземпляра класса (например, name 'name' не определено. Вы имели в виду 'self.name'?). Это связано с тем, что опущение self, например, переменных, является распространенной причиной ошибок в экземплярах классов.

Улучшения F-строк

F-строки (форматированные строки) были впервые введены в Python 3.6. Они представляют удобный способ форматирования строк. В предыдущих версиях они сильно ограничены в форматировании. Однако в версии 3.12 некоторые ограничения были сняты.

  • Мы теперь можем использовать кавычки (” или “”) внутри F-строки, независимо от предыдущего использования.
Использование в предыдущих версиях
Использование в версии 3.12
  • F-строки могут теперь быть многострочными выражениями, аналогично другим скобкам или кавычкам (например, использование скобок, чтобы выражения распространялись на несколько строк).
  • До сих пор обратный слеш (\) или символы Unicode не разрешены в F-строках, но ограничение снято.
Previous Version
Version 3.12
  • Ошибки внутри выражений f-строк теперь показывают точное местоположение ошибки в заключающем операторе, не только в самом выражении. Это облегчает отслеживание и устранение ошибок в f-строках.

Улучшение типизации

В Python 3.5 был введен синтаксис намеков типов, который позволяет линтинговым инструментам обнаруживать ошибки заранее. Новым дополнением является TypeDict.

from Typing import TypedDict, Unpackclass Employee(TypedDict):    name: str    id: intdef retrieve(**kwargs: Unpack[Employee]) -> None: ...

TypeDict используется для намеков на именованные аргументы. Затем используется дополнение Unpack, добавленное в 3.11, для распаковки TypeDict.

Для обобщенных функций, в которых может быть возвращено различное типированное значение, используется переменная типа (Type variable) для подсказки.

def first[T](elements: list[T]) -> T:    return elements[0]

В приведенной выше функции, если передан список целых чисел, результатом будет целое число. Если мы передаем список строк, то результат будет строкой. Также обратите внимание, что нам не нужно объявлять типизацию в приведенном примере.

Статическая проверка типов также стала более продвинутой в последней версии. Для методов, переопределяющих методы родительского класса в дочерних классах, мы можем использовать @override для обнаружения ошибок типов.

from typing import overrideclass Base:    def get_color(self) -> str:        return "blue"class GoodChild(Base):    @override  # Используется правильно: переопределяет Base.get_color    def get_color(self) -> str:        return "yellow"

Встраивание компрехеншенов

Компрехеншены – это синтаксис, который позволяет быстро создавать списки, словари и множества. Теперь они больше не создают функциональные объекты, используемые единожды; они создаются “встроенными”. Скорость работы увеличилась на около 11% в реальном мире и до двух раз в сверхмаломасштабных тестах.

Ускорение происходит быстрее, чем в версии 3.11. Ускорение означает обнаружение того, что определенный байт-код выполняется несколько раз, и замена общего байт-кода на специализированный.

Подинтерпретаторы

Они позволяют иметь несколько экземпляров интерпретатора, каждый с собственным GIL, работающих параллельно в одном процессе Python. Это будет большим шагом к лучшей параллельности в Python. Однако в версии 3.12 включены только внутренние механизмы CPython, чтобы это стало возможным. Пользовательский интерфейс подинтерпретаторов все еще отсутствует.

Поддержка профилировщика Linux perf

Профилировщик Linux perf, широко используемый инструмент, работает с Python, но возвращает информацию только о том, что происходит на уровне C в Python runtime. Информация о функциях актуальной программы на Python не отображается.

Python 3.12 включает возможность выбора опции, позволяющей perf собирать информацию о программах на Python, а не только о работе среды выполнения. Опцию можно выбрать на уровне окружения или внутри программы Python с помощью функции sys.activate_stack_trampoline.

Другие примечательные функции

  • Введены бессмертные объекты – их счетчик ссылок не изменяется.
  • Меньшие размеры объектов – размер объекта уменьшен до 96 байт.
  • Константы календаря для дней и месяцев.
  • Несколько устаревших и удаленных элементов стандартной библиотеки, таких как distutils, удалены в последней версии.
  • Множество улучшений в асинхронности в последней версии.

Прикрепляем документ релиза, который используется в качестве ссылки — https://www.python.org/downloads/release/python-3120/

Так что стоит ли обновляться до версии 3.12?

Счастливого обучения…