ar
Feedback
Коробка с питоном

Коробка с питоном

الذهاب إلى القناة على 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. Что может: - Трассирует каждый вызов функции, п
Совершенно недавно Bloomberg открыл интересный проект - профилировщик memray. Что может: - Трассирует каждый вызов функции, поэтому умеет показать стек вызовов. - Обрабатывает вызовы в C/C++ библиотеках! - Очень быстрый. Профилирование не вызывает ощутимого замедления программы. - Генерирует графики и отчеты по использованию памяти. - Работает с питоновскими и нативными тредами. Выглядит очень сочно. Может помочь в таких ситуациях: - Анализировать что именно кушает память в вашей программе, особенно найти участки где происходит много аллокаций. - Естественно, найти утечки памяти. #профилировщик

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

Получение типа дженерика (работает с 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 задаче. Дефолтный
+1
Небольшой хинт, да, снова #django. У меня есть небольшая задача, в которой мне нужно изменять файл в Celery задаче. Дефолтный update менеджера модели работать не будет, поэтому устанавливаем атрибуты и вызываем save на объекте. Работать он не будет, потому что QuerySet.update() не вызывает save() на модели, поэтому механизмы сохранения файлов в сторадже отрабатывать не будут. Первая картинка - моделька, вторая - как оно работает. Ваши варианты можете кидать в коменты, интересно послушать.

Нашел очень хорошую статью на хабре о том, как чуть чуть улучшить код при помощи небольших паттернов, которые можно применять в любом проекте. DTO, Value Object и другое - в статье. #статья

Скучали по Django? Вот вам ещё пакетик. Если вам нужно реализовать историю изменения данных в моделях, то django-simple-histo
Скучали по Django? Вот вам ещё пакетик. Если вам нужно реализовать историю изменения данных в моделях, то django-simple-history может это сделать для вас. GitHub | Документация #django #библиотека

Задача - проверять является ли строка содержащая отрицательное число, как бы это не звучало, числом. Choose your hero, а поче
+1
Задача - проверять является ли строка содержащая отрицательное число, как бы это не звучало, числом. Choose your hero, а почему - расскажи в комментариях.