Python 3.11: функционал, который вам понравится

В Python 3.11 включены интересные нововведения. Вот полная документация всех предложений по улучшению Python (PEP). Рассмотрим пять из них и еще одно суперкрутое улучшение.

PEP 657: локатор трассировки ошибок

Раньше, до Python 3.11, при вызове исключения в трассировке ошибок содержалась лишь строка с описанием ошибки. Например:

x, y, z = 1, 2, 0
a, b, c = 3, 4, 5
result = (x / y / z) * (a / b / c)

В этом коде выдается ошибка, потому что при делении X/Y на Z получается 0.

Это сообщение об ошибке неинформативно: неизвестно, какой частью кода ошибка вызвана.

В Python 3.11 вы увидите:

С локатором ошибок ~~^~~ выясняется первопричина: Y или Z равен нулю. В коде посложнее эти аннотированные трассировки мощнее.

PEP 673: тип self

Подсказки типа. Чтобы сослаться на сам текущий класс, раньше приходилось явно определять переменную типа:

В версии 3.11 на сам инкапсулирующий класс ссылается тип Self и определять переменную типа не нужно:

Доработан асинхронный менеджер контекста {asyncio}

При асинхронном программировании код выполняется поэтапно. Чтобы не ждать завершения этапа до перехода к следующему, в Python используется модуль {asyncio}.

Создаем асинхронные задачи, ждем запуска каждой и собираем их с помощью asyncio.gather():

## Задачи: [start_time, duration]
errandsDict = {
'Grocery Shopping': [11, 2],
'Return Packages': [9, 1],
'Pick Up Kids': [6, 1],
}

async def errands_log(task, start_time, time_to_finish):
await asyncio.sleep(start_time)
print(f"({task}) starting at {start_time}am")

await asyncio.sleep(time_to_finish)
print(f"({task}) done at {start_time+time_to_finish}am\n ======;")

## Асинхронные задачи
async def run_errands():
errands = []

for errand, (start_time, time_to_finish) in errandsDict.items():
errands.append(errands_log(errand, start_time, time_to_finish))

## Сбор всей информации после запуска
await asyncio.gather(*errands)

asyncio.run(run_errands())

При запуске в терминале получаем:

Но отслеживать список задач вручную и затем собирать их с asyncio.gather затруднительно. В Python 3.11 появилась новая функция/класс TaskGroup():

## With asyncio.TaskGroup
async def run_errands():
async with asyncio.TaskGroup() as tg:
for errand, (start_time, time_to_finish) in errandsDict.items():
tg.create_task(errands_log(errand,
start_time,
time_to_finish))

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

PEP 654: группа исключений

В версии 3.11 добавлена группа исключений  —  аналог функции «группировки» для их обработки. Это несколько исключений, обернутых в одно.

Когда ошибка приводит к вызову ExceptionGroup, вызываются оба обернутых исключения, отображаемые в собственной области группы исключений:

Для обработки ошибок, обернутых в ExceptionGroup, в Python 3.11 добавлено ключевое слово except*:

Эта функция эффективнее в {asyncio} со множеством запускаемых вместе асинхронных задач.

PEP 678: настраиваемые примечания об исключениях

Другая новая функция для обработки ошибок  —  примечания об исключениях с добавлением (при помощи add_note) настраиваемых сообщений:

PEP 659: увеличенная скорость выполнения

Благодаря инициативе Faster CPython Python 3.11 ожидается на 10–60% быстрее прошлых версий.

В итоге: переходить на Python 3.11 или нет?

Не обновляйте эксплуатационную среду, если у используемых в ваших проектах библиотек нет совместимости с Python 3.11.

Проверить это рекомендую в Google colab. Чтобы перейти на Python 3.11, запустите:

!sudo apt-get update -y
!sudo apt-get install python3.11
!sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1
!sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2

Мы рассмотрели самые интересные новые функции, все улучшения и изменения смотрите в официальной документации к выпуску.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Kat Li: Python 3.11: New Features That You Will Truly Enjoy

Предыдущая статьяГенерация видео из текста стала возможной
Следующая статьяРуководство по применению паттерна Event Bus в архитектуре React