В 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
Мы рассмотрели самые интересные новые функции, все улучшения и изменения смотрите в официальной документации к выпуску.
Читайте также:
- List Comprehensions в Python за 5 минут
- Python для Android: Как начать делать кроссплатформенные приложения с Kivy
- Прощай, Python! Здравствуй, C#!
Читайте нас в Telegram, VK и Дзен
Перевод статьи Kat Li: Python 3.11: New Features That You Will Truly Enjoy