Коробка с питоном
537 subscribers
49 photos
128 links
Заметки от Python-разработчика: сниппеты, обзоры пакетов, новости и другая полезная информация.
Download Telegram
Коробка с питоном pinned «Запоздалый итог января! 🔗 Ссылочки: - Про путь attrs - Алгоритмы на нашем любимом - Готовим Celery правильно 📰 Новости: - CPython скомпилировали в WASM 📚 Библиотеки: - Impler - класспатчер для имплементации методов как в Rust 🗒 Заметки: - Про дженерики»
В Python 3.11 для асинхронщины появятся TaskGroup 🎉!

Зачем они нужны?

1. Это более крутая замена asyncio.gather(), так как TaskGroup имеют более понятный, удобный и безопасный API.
2. Как и asyncio.gather(), он необходим чтобы выполнить набор каких-то задач. Если одна из них упадет с ошибкой - остальные задачи могут быть отменены.

С нетерпением ждем :)

#новости #asyncio
1
CPython собирается мигрировать свой баг-трекер (bugs.python.org, BPO) на GitHub Issues.

Ожидается, что этот перенос данных сделает взаимодействие с проектом более удобным и простым, сделает порог входа в проект ниже для новичков. Все-таки к гитхабу уже все успели привыкнуть, и не нужно будет отдельно регистрироваться в странной старомодной системе и учиться с ней работать. Ещё одна причина здесь, конечно же, в том, что BPO застряло на форке от старой версии RoundUp ещё на Python 2, и поддерживать и развивать это сейчас уже довольно проблематично.

В старом баг-трекере уже накопилось около 50k тредов, а некоторые из них ещё и достаточно длинные. По предварительным оценкам, миграция всех этих данных займёт 4-7 дней. Сам процесс сложный и состоит из нескольких шагов, для некоторых придётся привлекать сотрудников GitHub. В итоге, новые ишью будут существовать только на гитхабе, а старый трекер останется существовать в режиме read-only.

Эту миграцию обсуждают и подготавливают уже минимум два года. Звучит как что-то настолько же эпичное, как и переименование главной ветки из master в main. Да, на больших проектах любые манёвры всегда проходят непросто. Надеюсь, в этот раз гитхаб не сломается!

https://discuss.python.org/t/github-issues-migration-is-coming-soon/13791
Совершенно недавно Bloomberg открыл интересный проект - профилировщик memray.

Что может:
- Трассирует каждый вызов функции, поэтому умеет показать стек вызовов.
- Обрабатывает вызовы в C/C++ библиотеках!
- Очень быстрый. Профилирование не вызывает ощутимого замедления программы.
- Генерирует графики и отчеты по использованию памяти.
- Работает с питоновскими и нативными тредами.

Выглядит очень сочно. Может помочь в таких ситуациях:
- Анализировать что именно кушает память в вашей программе, особенно найти участки где происходит много аллокаций.
- Естественно, найти утечки памяти.

#профилировщик
Тут часть ядра pydantic переписали на Rust и он стал в 17 раз быстрее (код бенчмарка тут) чем обычный Pydantic.

Пока что WIP, выглядит многообещающее, но нет самой интеграции с pydantic, поэтому схемы могут делаться только через словари. Целью стоит увеличение скорости работы в ДЕСЯТЬ раз.
1
Почти во всех крупных и средних компаниях встречаю Microsoft Exchange Web Services (EWS) в качестве сервера почты, календаря и так далее.

Совершенно недавно мне попалась задача, где нужно было получать из папки новые письма, парсить их содержимое и выносить исходя из этого содержимого решения - перенаправить их в чат, переслать на почтовый ящик, создать встречу и так далее. И тут мне повезло - в компании использовался EWS.

Поможет автоматизировать взаимодействие с ним exchangelib. Библиотека представляет из себя в основном ORM в джанговском стиле. У неё отличная документация, написаны тесты и что самое главное - для моей задачи там реализована система подписки на эвенты.

#библиотека
Очень хороший доклад про SQLAlchemy. Автор рассказывает о Query, состоянии запроса внутри сессии, техниках загрузок связанных таблиц, отношениях и о многих других полезных вещах.
Не смотря на то, что докладу уже 2 года, многие вещи (всё таки работа с асинком поменялась) до сих пор актуальны.

#посмотреть #sqlalchemy
Сегодня пост будет об ORM'ке - piccolo, которая работает с Postgres и SQLite. А еще в асинхронщину умеет.

Отличается эта ORM от остальных тем, что внутри её огромная куча батареек - моделька юзера, аутентификация, миграции, админка и ещё многое другое. Прям как Джанга!

Прекрасно подходит, если вам нужно быстро набросать какой-то REST API. Умеет из под коробки работать с FastAPI, BlackSheep и Xpresso.

Я вот смотрю на все это многообразие и думаю - неужели Django скоро станет архаизмом?

Github | Пример с FastAPI

#библиотека
Раз уж заговорили об ORMках, оказывается существуют ORMки (точнее ODMки, в комментариях поправили) даже для MongoDB! Одна из них, под наш любимый питон - это Beanie.

Сама библиотека представляет из себя очередное скрещивание ежа с ужом базирована на Motor и Pydantic, с миграциями схемы прямиком из под коробки. А ещё она асинхронная.

По опыту использования могу сказать что в некоторых случаях она не такая уж и удобная как mongoengine, в котором была нужная для меня фишка - document inheritance. Это когда вы можете наследовать классы документов без боли и со всякими удобными фишками. Например, если вам нужно посчитать все объекты Page в БД, даже которые имеются в DatedPage(Page) (да, тут DatedPage наследует модель Page) вы просто делаете Page.objects().count() и они считаются. Вообще, рекомендую почитать вот это issue, там есть довольно интересное решение со стороны Pydantic.

В базовых случаях, как по мне - всё сделано удобно, а если возникнут вопросы по использованию - можно обратиться к автору в дискорд-канал библиотеки, он действительно там сидит и отвечает на вопросы.

#библиотека
Опять пост про ORM, надеюсь пока последний (хотя, кто его знает...)

Новая фича с рекомендациями репозиториев на гитхабе меня радует. Нашел вот такой cheatsheet для Django ORM, описывает пример запроса и генерируемый SQL-код. Очень полезно, если вы знаете SQL, но не знаете как выразить тот или иной запрос через Django ORM.

#ссылочки #django
🔥1
Если у вас был вопрос, как организовать очередь задач, которая умеет из под коробки в async - у меня для вас прекрасная новость.

Есть такой проект arq - это очередь задач, построенная на asyncio. Так как она асинхронная, с помощью неё можно добавлять задачи в очередь не блокируя основной поток, а сами задачи могут быть корутинами.

Либа очень маленькая, сам автор раньше контрибутил в rq. А еще, это тот же человек, который написал pydantic 👀.

#библиотека
У меня тут небольшая хотелка возникла, я захотел исходя из описаний полей в Pydantic модели генерировать запрос на выборку с фильтрацией из БД.

Оказывается, кто-то уже сделал похожее для Django. Выглядит неплохо, но всё же саму генерацию запроса я бы вынес в отдельный класс :)

#django #pydantic #eng #статья
Я нашел новый годный фреимворк, называется он Starlite, и сейчас я вам расскажу, чем он мне понравился.

Starlite - это новый, гибкий асинхронный фреимворк для API, построенный на Pydantic и Starlette. Нет, это не очередной клон FastAPI, потому что у него совершенно другая философия.
По большей части фреимворк испытал влияние NestJS, например у него в основном используются классы-контроллеры, которые уже содержат в себе роуты для сущности и всякие компоненты.

Что ещё здесь есть?

- DI. Он очень прикольный, все зависимости описываются в контроллере.
- Мидлвари построены на мидлварях Starlette и это однозначно плюс.
- Guards, это такие вызываемые функции для работы с ролями, которые управляют доступами к ресурсам.
- Плагины! Например можно сделать кастомную валидацию или парсинг входящих данных.
- DTOFactory с ремаппингом, расширением и так далее. DTO это вообще полезный паттерн, для передачи данных между подсистемами, который исключает какую либо логику в инстансе класса кроме хранения данных и их де/сериализации.
- Классы для создания тестов из под коробки.
- Кеширование ответов с выбором бекенда (есть Redis, Memcached и Etcd).
- А ещё вебсокеты, OpenAPI и многое другое!

Фреимворк очень быстрый, активно развивается, контрибуторы помогают в проблемах с ним. Фреимворк так же задает базовую структуру проекта, (например только в контроллере у тебя должны быть вьюшки для сущности), а это позволяет не "наломать дров" при попытке придумать свою структуру.

В общем, выглядит круто. Буду продолжать наблюдать.
#библиотека
Кто-то решил сравнить скорость работы list() vs. [], и почему что-то из вышеперечисленного быстрее. Очень занятное исследование, там так же есть про наши любимые однострочники с "list comp", почитайте.

*тык*

#статья #хабр
Анонсирование программы вознаграждения для urllib3

Немного слоупочная новость (неделя прошла), но всё же - у меинтейнеров появилась острая нехватка времени для допиливания urllib3 v2.0, поэтому они очень срочно ищут контрибьюторов и готовы платить от 100$ (большинство за 300$) за решение проблем и внесение фич в библиотеку. Таким образом они пытаются подогреть интерес к проекту и наконец допилить новую версию. Все награды выплачиваются через OpenCollective.

К слову, в прошлый раз они уже попытались это сделать через Твиттер, всё прошло прошло довольно неплохо, теперь пытаются расширить масштаб.
А масштаб там неплохой - как минимум хотят завести OpenSSL 3.0.

Идея звучит очень здраво - есть возможность заработать денег за вклад в опенсурс. Если интересно и найдете в себе силы - обязательно участвуйте!
Ну а если вам не жалко - можете кинуть деньги в фонд, зная что они пойду на оплату времени разработчиков.

#новости
dataset - взаимодействие с реляционными БД для ленивых людей

Управление данными в реляционных БД имеет множество преимуществ (например организация связей), но они довольно редко используются там, где нужно просто сохранить в БД данные, чтобы потом с ними как-то работать. Из-за этого частенько данные сохраняют в CSV или JSON, но с ними в перспективе сложнее работать - обновлять в них данные или использовать поиск.
Другая проблема - изменяемость схемы данных. Постоянно нужно писать миграции если она изменилась.

Решение этих проблем - небольшая библиотека dataset. Она представляет собой обертку над SQLAlchemy, которая обеспечивает абстракцию, которая позволяет работать с реляционной БД как с NoSQL (например как с MongoDB)!

Одна из самых крутых фич в dataset - это изменение схемы налету. Вы можете записать любые данные, и если какой-то колонки в базе нет - библиотека создаст её за вас.
Всё это дело прекрасно работает с SQLite, PostgreSQL и MySQL.

GitHub | Документация

#библиотека
👏63
Коробка с питоном
У меня тут небольшая хотелка возникла, я захотел исходя из описаний полей в Pydantic модели генерировать запрос на выборку с фильтрацией из БД. Оказывается, кто-то уже сделал похожее для Django. Выглядит неплохо, но всё же саму генерацию запроса я бы вынес…
Помните, я тут хотел сделать "классы-фильтры", из которых бы генерировался запрос в базу с фильтрацией? Я, конечно, сделал наколеночный вариант (который крутится в проде!) и пошел искать уже готовые библиотеки. И нашел sqlalchemy-filters.
Тут всё проще - фильтры описываются в словарях. Умеет в джоины, сортировку и пагинацию. Идеально подходит для всяких REST API, поэтому если вам нужно быстрое решение - можно не заниматься велосипедостроением и воспользоваться этой библиотекой.

#библиотека
👏6
Гуглил как мне в Pydantic изменять входящие данные (забыл что это можно делать через валидатор) и натолкнулся на Blue Book - персональную вики одного разработчика, который пишет о различных темах - активизме, здоровье и так далее. Сейчас это обзывают модным словом Digital garden.

Но так как у нас канал о Python, и мы будем говорить о нём, у него есть небольшой раздел связанный с Python, со сниппетами, обсуждением библиотек и концепций.
Очень рекомендую заглянуть!

#ссылочки
👏2
Если вы любите делать игры на Godot или хотите начать их делать, при этом разбираться с GDScript вам лень - вы можете попробовать использовать godot-python. Godot - это прекраснейший движок, чтобы начать разрабатывать игры. Как по мне выглядит получше Unity, особенно для всяких небольших мобильных игр (особенно на фоне последних новостей).

Ребята пытаются добавить поддержку скриптинга на Python в Godot, и судя по тому как развивается проект - получается это у них довольно неплохо.

Из минусов я бы выделил: странный механизм экспорта проекта, вместе с игрой вы экспортите интерпретатор питона (хотя для кого-то это не минус), отсутствие pip из под коробки - его ставить нужно отдельно.

#библиотека #gamedev
Тут сборки PyPy для Python 3.8 и 3.9 зарелизили под маковский M1 (а если быть точнее - macOS ARM64). Отличная новость для разработчиков которые пользуются новыми макбуками!

#новости
2👏1