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



Книга 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
======;")

## Асинхронные задачи
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

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



718   0  

Comments

    Ничего не найдено.