Коробка с питоном
534 subscribers
49 photos
128 links
Заметки от Python-разработчика: сниппеты, обзоры пакетов, новости и другая полезная информация.
Download Telegram
🐍 CPython скомпилировали в WASM!

WASM - это такой бинарный формат, результат компиляции какого-то языка который позволяет запустить его в браузере при помощи специальной виртуальной машины.

Так вот, наш Python REPL запустили в браузере, можно потыкать. Возможно, скоро мы сможем писать фронтенд на Python, который будет запускаться через WASM...

#новости
Коробка с питоном 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