Выпущена версия Python 3.12: Изучение захватывающих новых возможностей и исправлений

Python 3.12 наконец-то здесь!
Python 3.12 (beta 1), последний крупный выпуск популярного языка программирования, был выпущен 22 мая 2023 года. Выпуск включает в себя несколько новых функций и улучшений, а также исправления ошибок. Разработчикам рекомендуется опробовать эту последнюю версию на непроизводственном коде, чтобы убедиться, что она работает с вашими программами, и получить представление о том, выиграет ли ваш код от новых функций и улучшений производительности в этой последней версии.

Введение
Python – один из самых популярных языков программирования, используемых сегодня. Это универсальный язык высокого уровня, который используется для веб-разработки, анализа данных, искусственного интеллекта и многого другого. С каждой новой версией Python продолжает совершенствоваться и развиваться, предлагая разработчикам новые и интересные возможности.
Python 3.12 не является исключением. Этот выпуск включает в себя несколько новых функций и улучшений, которые, несомненно, облегчат жизнь разработчиков. От структурного сопоставления шаблонов до улучшенных сообщений об ошибках и новых модулей – в этом выпуске есть много интересного.
В этом посте мы подробно рассмотрим самые интересные новые возможности Python 3.12 и то, как их можно использовать для улучшения вашего кода.
Структурное сопоставление шаблонов
Одной из самых интересных новых возможностей в Python 3.12 является структурное сопоставление шаблонов. Эта функция разрабатывалась в течение нескольких лет и наконец-то появилась в языке.
В двух словах, структурное сопоставление шаблонов позволяет разработчикам сопоставлять сложные структуры данных с шаблонами, подобно тому, как регулярные выражения сопоставляют строки. Эта функция может быть использована для упрощения кода и повышения его читабельности.
Вот пример того, как работает структурное сопоставление шаблонов:
def calculate(x, y, operator):
match operator:
case "+":
return x + y
case "-":
return x - y
case "*":
return x * y
case "/":
return x / y
case _:
raise ValueError(f"Invalid operator: {operator}")
В этом примере оператор match используется для сопоставления переменной оператора с различными шаблонами. Если оператор соответствует одному из случаев, выполняется соответствующее выражение. В противном случае возникает ошибка ValueError.
Вот еще один пример:
# Example: Structural pattern matching
data = {'name': 'John', 'age': 25}
# Python 3.12
match data:
case {'name': name, 'age': age}:
print(f"Name: {name}, Age: {age}")
case _:
print("Invalid data structure")
# Python 3.11 and earlier
if isinstance(data, dict) and 'name' in data and 'age' in data:
name = data['name']
age = data['age']
print(f"Name: {name}, Age: {age}")
else:
print("Invalid data structure")
Эту функцию можно использовать для упрощения кода, включающего сложные структуры данных. Это может сделать ваш код более читабельным и легким в сопровождении, что в конечном итоге сэкономит ваше время и усилия.
Улучшенные сообщения об ошибках/работа с ними
Python 3.12 также поставляется с улучшенными сообщениями об ошибках. Это улучшение сделает отладку проще и эффективнее.
При возникновении ошибки Python теперь предоставляет более подробную информацию об ошибке и ее местоположении. Эта информация включает точный номер строки, на которой произошла ошибка, и соответствующий исходный код.
Вот пример улучшенных сообщений об ошибках в действии: # Exception context
try:
# Code that may raise an exception
pass
except Exception as e:
# Python 3.12
print(f"Exception occurred: {e}")
print(f"Exception context: {e.__context__}")
# Python 3.11 and earlier
print(f"Exception occurred: {e}")
В приведенном выше примере Python 3.12 вводит атрибут context, позволяющий получить доступ к подробной информации об исключениях. Используя эту возможность, вы можете получить ценные сведения о причинах, лежащих в основе исключений, что позволит вам быстро выявлять и точно решать проблемы.
Вот еще один пример:
>>> import math
>>> math.sqrt(-1)
Traceback (most recent call last):
...
ValueError: math domain error: sqrt() argument cannot be negative
Did you mean: math.sqrt(abs(-1))?
В этом случае сообщение об ошибке подсказывает, что программист может исправить ошибку, вызвав функцию abs() для отрицательного числа, прежде чем передать его в функцию sqrt().
Это усовершенствование сделает отладку более простой и эффективной. Это поможет вам сэкономить время и силы, когда вы пытаетесь найти ошибку в своем коде.
Поддержка профайлера Linux perf
Python 3.12 теперь поддерживает Linux perf profiler, который можно использовать для профилирования кода Python. Это может помочь вам определить узкие места в производительности вашего кода.
import perf
profiler = perf.Profiler()
profiler.start()
# Do some work here
profiler.stop()
report = profiler.report()
print(report)
В результате будет распечатан отчет, показывающий производительность запущенного кода. Отчет включает информацию о времени, проведенном в каждой функции, а также о количестве вызовов каждой функции.
Более быстрая отладка/контроль профиля
Python 3.12 был оптимизирован для более быстрой отладки и мониторинга профиля. Это поможет вам быстрее отлаживать код и легче выявлять узкие места в производительности.
import timeit
def my_function():
# Do some work here
timeit.timeit("my_function()", number=10000)
Это выведет время, затраченное на выполнение функции my_function() 10 000 раз. В Python 3.12 это будет быстрее, чем в предыдущих версиях Python.
Износ и удаление устаревших функций:
По мере развития Python устаревшие функции, которые больше не считаются лучшими практиками, устаревают или удаляются. Python 3.12 продолжает эту тенденцию, устаревая некоторые функции, побуждая разработчиков использовать более современные и эффективные альтернативы. Это гарантирует, что экосистема Python остается актуальной и побуждает разработчиков следовать рекомендуемым практикам.
Меньшие размеры объектов
В ранних версиях Python базовый размер объекта составлял 208 байт. За последние несколько версий Python объекты были многократно рефакторингованы, чтобы сделать их меньше, что не только позволяет большему количеству объектов жить в памяти, но и помогает локальности кэша. Начиная с Python 3.12, базовый размер объекта теперь составляет 96 байт – меньше половины того, что было раньше.
Сборка мусора
сборки мусора (GC) Python. Раньше GC запускался всякий раз, когда выделялся объект. Однако в последней версии GC теперь работает исключительно во время механизма “eval breaker” в цикле байткода Python. Это означает, что он запускается между выполнением одного байткода и другого. Кроме того, GC запускается всякий раз, когда вызывается механизм проверки обработчиков сигналов CPython. Эти усовершенствования позволяют периодически запускать GC во время длительных обращений к расширениям C за пределами среды выполнения, обеспечивая оптимальное управление памятью в течение всего времени выполнения.
Заключение
Python 3.12 – это крупный релиз, который привнес в язык несколько новых интересных возможностей. От структурного сопоставления шаблонов до улучшенных сообщений об ошибках и новых модулей – в этом выпуске есть много интересного.
Независимо от того, являетесь ли вы опытным разработчиком Python или только начинаете, обновление до Python 3.12 стоит рассмотреть. Благодаря новым возможностям и улучшениям Python остается одним из самых популярных и универсальных языков программирования, используемых сегодня.
Счастливого программирования!