Python Community
13K subscribers
1.25K photos
27 videos
15 files
719 links
Python Community RU - СНГ сообщество Python-разработчиков

Чат канала: @python_community_chat

Сотрудничество: @cyberJohnny и @Sergey_bzd

РКН реестр:
https://knd.gov.ru/license?id=67847dd98e552d6b54a511ed&registryType=bloggersPermission
Download Telegram
🖥 py-pglite — PostgreSQL без установки, тестируй как с SQLite!

py-pglite — обёртка PGlite для Python, позволяющая запускать настоящую базу PostgreSQL прямо при тестах. Без Docker, без настройки — просто импортируй и работай.

📌 Почему это круто:
- 🧪 Ноль конфигурации: никакого Postgres и Docker, только Python
- Молниеносный старт: 2–3 с против 30–60 с на традиционные подходы :contentReference[oaicite:2]{index=2}
- 🔐 Изолированные базы: новая база для каждого теста — чисто и безопасно
- 🏗️ Реальный Postgres: работает с JSONB, массивами, оконными функциями
- 🔌 Совместимость: SQLAlchemy, Django, psycopg, asyncpg — любая связка :contentReference[oaicite:3]{index=3}

💡 Примеры установки:

pip install py-pglite
pip install py-pglite[sqlalchemy] # SQLAlchemy/SQLModel
pip install py-pglite[django] # Django + pytest-django
pip install py-pglite[asyncpg] # Асинхронный клиент
pip install py-pglite[all] # Всё сразу


🔧 Пример (SQLAlchemy)

python
def test_sqlalchemy_just_works(pglite_session):
user = User(name="Alice")
pglite_session.add(user)
pglite_session.commit()
assert user.id is not None


py‑pglite — идеальный инструмент для unit- и интеграционных тестов, где нужен настоящий Postgres, но без всей админской рутины.

Полноценный PostgreSQL — без его тяжеловесности.

Github (https://github.com/wey-gu/py-pglite)



#python #sql #PostgreSQL #opensource

@Python_Community_ru
June 15
June 16
June 17
🖥 Вышел Git 2.50

Вот основные обновления:
1. Новый уровень работы с cruft packs
- Git хранит неиспользуемые (невидимые) объекты в специальных “cruft packs”.
- Раньше управлять ими было сложно: чтобы добавить или объединить объекты, нужно было всё перепаковывать, что занимало много времени и места.
- Теперь появился флаг --combine-cruft-below-size: можно легко объединять мелкие cruft packs в один, постепенно “чистить” репозиторий.
- Исправлена важная ошибка: раньше такие объекты могли случайно удаляться раньше времени — теперь это под контролем.

2. Быстрее для больших репозиториев — многослойные битмапы
- В больших проектах Git создаёт специальные “карты” (bitmaps), чтобы быстро понимать, какие объекты нужны для определённых коммитов.
- Новая версия поддерживает “инкрементальные” битмапы для multi-pack index — можно добавлять новые данные быстро, не пересоздавая всю структуру.

3. Новый движок слияния ORT
- Старый движок recursive полностью удалён: теперь слияния (`merge`) обрабатывает только быстрый и надёжный ORT.
- Это упростит разработку, повысит скорость merge и уменьшит количество ошибок.

4. Улучшения в утилитах и команде cat-file
- Теперь можно фильтровать объекты по типу, например, быстро получить только “деревья” (tree) с помощью --filter='object:type=tree'.
- Команда для удаления reflog стала интуитивной: вместо сложных параметров просто пишем git reflog delete .

5. Больше контроля над сетевыми соединениями
- Добавлены настройки для TCP Keepalive, теперь можно гибко управлять поведением Git в нестабильных сетях.

6. Меньше Perl — проще тестировать и собирать
- Git ещё больше избавился от зависимостей на Perl: тесты и документация теперь проще и стабильнее, особенно на системах без Perl.

7. Работа с разреженными (sparse) репозиториями стала удобнее
- Команды вроде git add -p теперь не требуют полной загрузки содержимого — удобно при работе с огромными проектами.

8. Косметические улучшения
- При ребейзе (rebase -i) названия коммитов теперь оформляются как комментарии — так ясно, что это просто для ориентира.

9. Быстрее клонируем через bundle-uri
- Git стал лучше справляться с ускоренным клонированием через *.bundle: теперь клиент правильно учитывает все ссылки, ускоряя загрузку репозитория.

Git 2.50 — это не просто исправление багов, а реальное ускорение и упрощение работы для всех, кто ведёт большие проекты, часто сливает ветки и заботится о “чистоте” репозитория. Новые команды делают жизнь проще, а старые баги — ушли в прошлое.

➡️ Почитать про все обновления (https://github.blog/open-source/git/highlights-from-git-2-50/)



@Python_Community_ru
June 17
🙌🙌🙌🙌 15+ документов для тех, кто в диджитал

В преддверии новой активности мы собрали в одну папку 18 Telegram-каналов известных профессионалов и попросили их авторов подготовить для вас документы, которые помогут:

🔴Создать рабочий лид-магнит;
🔴Подготовить сайт к требованиям РКН;
🔴Подготовиться к любому выступлению;
🔴Удержать проект в сроках и рамках бюджета;
🔴Организовать эффективное участие в тендерах;
🔴Чек-лист сдачи этапов разработки;
🔴и еще много много всего!

❗️ Сохранив единожды папку «Документы для тех, кто в диджитал», вы сможете спокойно пройтись по всем каналам и скачать множество авторских документов, которые точно пригодятся в работе.
Please open Telegram to view this post
VIEW IN TELEGRAM
June 18
June 18
June 18
🎯 Практическое руководство: Signals — реактивное управление состоянием в Python

Недавно вышло отличное руководство «The Missing Manual for Signals: State Management for Python Developers», где автор показывает, как внедрять реактивную модель на Python с помощью библиотеки

Почему Signals полезны

Стандартный подход—императивный—скрывает зависимости между переменными, что ведёт к ошибкам:


class OrderService:
def add_order(self, order):
self.orders.append(order)
self.total += order.amount
self.avg = self.total / len(self.orders)
self.notify_if_needed()
self.track_analytics()


Если забыть обновить одно значение — всё сломается.

Как работают Signals

Signals = реактивные переменные, которые:

1. Хранят значение (`Signal`)
2. Автоматически вычисляют производные (`Computed`)
3. Выполняют побочные действия (`Effect`) на изменениях

Пример:


from reaktiv import Signal, Computed, Effect

orders = Signal([])
total = Computed(lambda: sum(o.amount for o in orders()))
avg = Computed(lambda: total() / len(orders()) if orders() else 0)
Effect(lambda: notify(avg()) if avg() > 100 else None)

orders.update(lambda os: os + [new_order])


Теперь всё обновляется автоматически — вручную ничего делать не нужно.

Когда стоит применять

* Сложные производные значения, зависящие от нескольких источников
* Реальные Cascading-настройки, например, конфиг, кэши, соединения
* Сценарии real-time: дашборды, метрики, воркфлоу

Когда лучше не использовать

* Простые последовательные преобразования
* Одноразовые API-вызовы
* Прямолинейные функции (например, вычисление налога)

Основные преимущества

- Чёткое, декларативное управление зависимостями
- Обновления только нужных значений благодаря ленивому пересчёту
- Упрощение тестирования и устранение ошибок обновления

Реальные примеры

- Управление конфигурацией микросервисов
- Реализация real-time дашбордов
- Мониторинг состояния кластера, триггеры скейлинга

💡 Итог: Signals — отличная альтернатива громоздкому императиву.
Декларируешь связь один раз, и система сама поддерживает согласованность.

Полезно как для backend‑разработчиков, так и для ML‑инженеров.
📚 Материал — ~16 минут чтения, и он того стоит

📌 Читать (https://bui.app/the-missing-manual-for-signals-state-management-for-python-developers/)



@Python_Community_ru
June 19