Коробка с питоном
Открыть в Telegram
Заметки от Python-разработчика: сниппеты, обзоры пакетов, новости и другая полезная информация. Автор: @kiriharu
Больше462
Подписчики
-124 часа
Нет данных7 дней
-530 день
Архив постов
Раз уж заговорили об ORMках, оказывается существуют ORMки даже для MongoDB! Одна из них, под наш любимый питон - это Beanie.
Сама библиотека представляет из себя очередное скрещивание ежа с ужом базирована на Motor и Pydantic, с миграциями схемы прямиком из под коробки. А ещё она асинхронная.
По опыту использования могу сказать что она не такая уж и удобная как mongoengine, в котором была нужная для меня фишка - document inheritance. Это когда вы можете наследовать классы документов без боли и со всякими удобными фишками. Например, если вам нужно посчитать все объекты Page в БД, даже которые имеются в
DatedPage(Page) (да, тут DatedPage наследует модель Page) вы просто делаете Page.objects().count() и они считаются. Вообще, рекомендую почитать вот это issue, там есть довольно интересное решение со стороны Pydantic.
Как по мне - библиотека довольно удобная, а если возникнут вопросы по использованию - можно обратиться к автору в дискорд-канал библиотеки, он действительно там сидит и отвечает на вопросы.
#библиотекаСегодня пост будет об ORM'ке - piccolo, которая работает с Postgres и SQLite. А еще в асинхронщину умеет.
Отличается эта ORM от остальных тем, что внутри её огромная куча батареек - моделька юзера, аутентификация, миграции, админка и ещё многое другое. Прям как Джанга!
Прекрасно подходит, если вам нужно быстро набросать какой-то REST API. Умеет из под коробки работать с FastAPI, BlackSheep и Xpresso.
Я вот смотрю на все это многообразие и думаю - неужели Django скоро станет архаизмом?
#библиотека
Очень хороший доклад про SQLAlchemy. Автор рассказывает о Query, состоянии запроса внутри сессии, техниках загрузок связанных таблиц, отношениях и о многих других полезных вещах.
Не смотря на то, что докладу уже 2 года, многие вещи (всё таки работа с асинком поменялась) до сих пор актуальны.
#посмотреть #sqlalchemy
Почти во всех крупных и средних компаниях встречаю Microsoft Exchange Web Services (EWS) в качестве сервера почты, календаря и так далее.
Совершенно недавно мне попалась задача, где нужно было получать из папки новые письма, парсить их содержимое и выносить исходя из этого содержимого решения - перенаправить их в чат, переслать на почтовый ящик, создать встречу и так далее. И тут мне повезло - в компании использовался EWS.
Поможет автоматизировать взаимодействие с ним exchangelib. Библиотека представляет из себя в основном ORM в джанговском стиле. У неё отличная документация, написаны тесты и что самое главное - для моей задачи там реализована система подписки на эвенты.
Тут часть ядра pydantic переписали на Rust и он стал в 17 раз быстрее (код бенчмарка тут) чем обычный Pydantic.
Пока что WIP, выглядит многообещающее, но нет самой интеграции с pydantic, поэтому схемы могут делаться только через словари. Целью стоит увеличение скорости работы в ДЕСЯТЬ раз.
Совершенно недавно Bloomberg открыл интересный проект - профилировщик memray.
Что может:
- Трассирует каждый вызов функции, поэтому умеет показать стек вызовов.
- Обрабатывает вызовы в C/C++ библиотеках!
- Очень быстрый. Профилирование не вызывает ощутимого замедления программы.
- Генерирует графики и отчеты по использованию памяти.
- Работает с питоновскими и нативными тредами.
Выглядит очень сочно. Может помочь в таких ситуациях:
- Анализировать что именно кушает память в вашей программе, особенно найти участки где происходит много аллокаций.
- Естественно, найти утечки памяти.
#профилировщик
Repost from Питонические атаки
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В Python 3.11 для асинхронщины появятся TaskGroup 🎉!
Зачем они нужны?
1. Это более крутая замена
asyncio.gather(), так как TaskGroup имеют более понятный, удобный и безопасный API.
2. Как и asyncio.gather(), он необходим чтобы выполнить набор каких-то задач. Если одна из них упадет с ошибкой - остальные задачи могут быть отменены.
С нетерпением ждем :)
#новости #asyncioЗапоздалый итог января!
🔗 Ссылочки:
- Про путь attrs
- Алгоритмы на нашем любимом
- Готовим Celery правильно
📰 Новости:
- CPython скомпилировали в WASM
📚 Библиотеки:
- Impler - класспатчер для имплементации методов как в Rust
🗒 Заметки:
- Про дженерики
Получение типа дженерика (работает с Pydantic)
Сегодня будет небольшой пост со звездочкой, а именно про дженерики. Если вы не знаете что такое дженерики, то вот вам краткое описание - это особенный механизм языка, который позволяет функциям и классам работать с разными типами данных без изменения своего кода.
Зачем нужны дженерики? Дженерики нужны, например, когда вам нужно в зависимости от переданного типа сериализовать данные по разному. Например, у вас есть есть ответ от сервера, но схема поля data меняется в зависимости от ответа. Тут и на помощь приходят дженерики.
В Python дженериков в “чистом виде” (как в Java, например) нет. Все дженерики реализуются через type hints и ими же являются.
Самый базовый вопрос, который может появиться у человека который хочет использовать дженерики - каким образом можно получить тип, который передан в дженерик (в тайпхинт)?
Допустим, у нас есть следующий код:
import typing as ty
T = ty.TypeVar('T')
class ExtractType(ty.Generic[T]):
def extract_type(self):
print("Как получить тип класса в дженерике?")
et = ExtractType[int]()
et.extract_type()
Здесь мы в описании класса ExtractType передаем тайпхинт Generic[T] который покажет, что мы принимаем некий тип как дженерик(тайпхинт) при создании экземпляра. Ниже в качестве типа для дженерика при описании экземпляра класса мы передаем int. А как получить этот int в методе extract_type?
И вот один из способов. Для этого нам понадобится две вещи - метод ty.get_args который умеет получать тайпхинты и аттрибут __orig_class__ который получит наш класс с уже прописанным типом. Меняем метод extract_type следующим образом:
def extract_type(self):
generic_type = ty.get_args(self.__orig_class__)[0]
print(f"Сейчас тут передан{generic_type}")
Запускаем и видим, что всё работает, как нам нужно!
Сейчас тут передан <class 'int'>
Обратите внимание на циферку 0 - ty.get_args возвращает список из типов, поэтому мы можем получить какое угодно количество типов.
А какие вы знаете классные фишки, связанные с тайпхинтами в Python? Пишите в комменты, буду рад пообщаться!
#typehints #записки🐍 CPython скомпилировали в WASM!
WASM - это такой бинарный формат, результат компиляции какого-то языка который позволяет запустить его в браузере при помощи специальной виртуальной машины.
Так вот, наш Python REPL запустили в браузере, можно потыкать. Возможно, скоро мы сможем писать фронтенд на Python, который будет запускаться через WASM...
#новости
Немного старая (2019 год), но все же актуальная статья о том, как правильно готовить Celery.
#статья #habr
Очень интересный пакет, вдохновленный Rust - impl_pattern. Может использоваться если вы хотите расширить класс (в основном какой-то библиотечный) какими-то методами.
Вы можете зарегистрировать метод для класса с использованием этой библиотеки следующим образом:
from impl_pattern import impl
class Sample:
def __init__(self):
self.value = 10
@impl(Sample)
def plus_one(self: Sample):
self.value += 1
s = Sample()
s.plus_one()
print(s.value)
# 11
Не знаю кто будет это использовать, но как POC выглядит красиво и элегантно.
#библиотекаС новым 2022 годом! 🎅
В этом году я буду пытаться подтянуть алгоритмы, поэтому первый пост будет про них.
Вот вам репозиторий на github в котором реализовано огромное количество алгоритмов на Python - от сортировок, до отправки и приёма файлов.
Все примеры отлично откомментированы на английском, поэтому проблем с их пониманием возникнуть не должно.
#ссылочки
Очень крутой пост про путь такой библиотеки как attrs - можно сказать прародителя датаклассов.
#статья
Немного занят, чуть позже начну заливать посты в канал. Только сейчас вспомнил, что хотел 2 недели назад хотел подвести итоги ноября, но подвожу их только сейчас 😕
В этом месяце было очень много Django. Возможно, дальше будет чуть больше.
🔗 Ссылочки:
- What the f*ck, Python?
- Django Styleguide
- Python и чистая архитектура в 2021 году
📚 Библиотеки:
- Ormar - ещё одна асинхронная ORM
- Faker - генерируем фейковые данные
- django-import-export
- tablib
- django-simple-history
Небольшой хинт, да, снова #django.
У меня есть небольшая задача, в которой мне нужно изменять файл в Celery задаче. Дефолтный update менеджера модели работать не будет, поэтому устанавливаем атрибуты и вызываем save на объекте.
Работать он не будет, потому что
QuerySet.update() не вызывает save() на модели, поэтому механизмы сохранения файлов в сторадже отрабатывать не будут.
Первая картинка - моделька, вторая - как оно работает. Ваши варианты можете кидать в коменты, интересно послушать.Нашел очень хорошую статью на хабре о том, как чуть чуть улучшить код при помощи небольших паттернов, которые можно применять в любом проекте.
DTO, Value Object и другое - в статье.
#статья
Скучали по Django? Вот вам ещё пакетик.
Если вам нужно реализовать историю изменения данных в моделях, то django-simple-history может это сделать для вас.
GitHub | Документация
#django #библиотека
Задача - проверять является ли строка содержащая отрицательное число, как бы это не звучало, числом. Choose your hero, а почему - расскажи в комментариях.
