Если вы всё ещё не проверяете покрытие тестами — самое время начать. Вот пара свежих примеров, почему это важно.
Пример 1: два одинаковых теста — но один не выполняется:
def test_get_install_to_run_with_platform(patched_installs):
i = installs.get_install_to_run("<none>", None, "1.0-32")
assert i["id"] == "PythonCore-1.0-32"
...
def test_get_install_to_run_with_platform(patched_installs): # дублирующее имя
i = installs.get_install_to_run("<none>", None, "1.0-32", windowed=True)
assert i["id"] == "PythonCore-1.0-32"
...
Копировали тест и забыли переименовать? Первый просто не запускается — и вы даже не заметите без отчёта по покрытию. В отчёте будет видно: тест написан, но не выполнялся.
coverage — баги в тестах могут так и остаться незамеченными.💡 Подсказка: это также ловит ruff F811 и легко решается через
@pytest.mark.parametrize.Пример 2: генератор в тесте, который не сработал:
im = Image.new("RGB", (1, 1))
for colors in (("#f00",), ("#f00", "#0f0")):
    append_images = (Image.new("RGB", (1, 1), color) for color in colors)
    im_reloaded = roundtrip(im, save_all=True, append_images=append_images)
    assert_image_equal(im, im_reloaded)
    assert isinstance(im_reloaded, MpoImagePlugin.MpoImageFile)
    assert im_reloaded.mpinfo is not None
    assert im_reloaded.mpinfo[45056] == b"0100"
    for im_expected in append_images:
        im_reloaded.seek(im_reloaded.tell() + 1)
        assert_image_similar(im_reloaded, im_expected, 1)Генератор был уже использован внутри
roundtrip(), и цикл не выполняется — тест пропускается.coverage — даже не заметите.list(...).coverage run -m pytest && coverage report.Библиотека питониста #буст
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍9❤6🔥5
  Последний шанс залутать курсы Proglib Academy с выгодой 40% и пожизненным доступом.
До 1 августа действует скидка на курсы по математике для Data Science, алгоритмам и структурам данных, обновлённому Python, frontend-разработке с нуля, основам IT для непрограммистов, базовым моделям ML, а также архитектурам и шаблонам проектирования.
Выбираем и забираем 👈
P.S. Акция не распространяется на курсы «AI-агенты для DS-специалистов» и «ML для старта в Data Science».
До 1 августа действует скидка на курсы по математике для Data Science, алгоритмам и структурам данных, обновлённому Python, frontend-разработке с нуля, основам IT для непрограммистов, базовым моделям ML, а также архитектурам и шаблонам проектирования.
Выбираем и забираем 👈
P.S. Акция не распространяется на курсы «AI-агенты для DS-специалистов» и «ML для старта в Data Science».
😁2👍1
  📦 Delivery Manager: кто это и зачем нужен в разработке
В каждой уважающей себя IT-компании есть эта роль — Delivery Manager. Но многие до конца не понимают, чем он занимается: менеджер? Техлид? Или настоящий волшебник?
Давайте разберёмся, кто такие деливери-менеджеры и почему без них современная разработка быстро превращается в хаос.
👉 Хотите узнать больше? Читайте нашу статью: https://proglib.io/sh/9qwbeKQ0dV
В каждой уважающей себя IT-компании есть эта роль — Delivery Manager. Но многие до конца не понимают, чем он занимается: менеджер? Техлид? Или настоящий волшебник?
Давайте разберёмся, кто такие деливери-менеджеры и почему без них современная разработка быстро превращается в хаос.
👉 Хотите узнать больше? Читайте нашу статью: https://proglib.io/sh/9qwbeKQ0dV
😁6🔥3👍2
  Иногда код выглядит идеально — тесты проходят, багов нет, но поведение не соответствует тому, что действительно нужно бизнесу. Особенно если требования меняются или слабо зафиксированы.
Промпт:
Проверь, соответствует ли данный Python-код заданной бизнес-логике:
\[опишите свою бизнес-логику]
Найди расхождения и предложи, как это исправить.
Такой промпт можно использовать, чтобы:
— проверить legacy-код после изменений требований;
— убедиться, что новые разработчики поняли задачу правильно;
— использовать ИИ как «второго аналитика» на проекте.
Пример использования:
Бизнес-логика: если пользователь совершил покупку более чем на 10 000₽ за месяц, ему нужно выдать скидку 5%.
Проверь, что код корректно применяет скидку только в этих случаях.
Библиотека питониста #буст
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍7😁6❤2
  atexit для безопасного завершения Python-приложенийКогда вы работаете с сетевыми приложениями, важно не просто обрабатывать данные, но и корректно завершать работу сервера: сохранять остатки в памяти, закрывать соединения, выгружать данные.
atexit. Он позволяет регистрировать функции, которые автоматически выполняются при нормальном завершении Python-программы.Это полезно, если нужно:
— Сохранить кэш
— Очистить ресурсы
— Завершить фоновые потоки
— Записать метрики или логи
atexit не срабатывает при аварийном завершении (например, os._exit() или падении интерпретатора). Для этого используйте signal.atexitСервер:
— Получает UDP-пакеты с метриками от клиента
— Сохраняет данные в in-memory SQLite
— Использует
queue.Queue и фоновый daemon-поток для обработки данных— При завершении работы сохраняет все необработанные данные из очереди с помощью
atexitКод:
import atexit
def shutdown_handler():
# Извлекаем всё из очереди
while not ingest_queue.empty():
buffer.append(ingest_queue.get())
# Сохраняем в БД
_persist_data(buffer, conn)
atexit.register(shutdown_handler)
Клиент:
— Отправляет случайные данные (температура, влажность, sensor\_id)
— Работает в бесконечном цикле
— Завершается по
Ctrl+CКод:
while True:
data = {
"sensor_id": ...,
"temperature": ...,
...
}
client_socket.sendto(json.dumps(data).encode(), addr)
time.sleep(0.01)
В продакшн-сервисах вы не хотите терять данные, если:
— Процесс завершился вручную
— Контейнер Docker останавливается
— Система инициирует shutdown
— Используйте
atexit для мягкой очистки: логов, файлов, очередей, соединений— Комбинируйте с
signal, если важно обрабатывать SIGINT, SIGTERM— Даже небольшие скрипты выигрывают от аккуратного завершения
Библиотека питониста #буст
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍9❤5🔥1😍1
  На первый взгляд — крутой проект на GitHub, обещающий ускорение Python в десятки раз. По факту — странный бинарник без исходников, нереалистичные бенчмарки и токсичный автор, удаляющий комментарии.
🚩 Что должно вызывать тревогу
PyPI и GitHub больше не гарантируют безопасность
Теперь важен не только open source, но и open build chain:
— есть ли CI/CD?
— как собираются бинарники?
— воспроизводим ли релиз?
Как обезопасить себя:
— Не ставьте
pip install с непроверенных проектов— Всегда читайте исходники перед установкой, особенно если есть нативный код
— Используйте виртуальные окружения или Docker для тестов
— Сканируйте зависимости через safety или pip-audit
А вы проверяете код, прежде чем ставить библиотеку с GitHub? Кто должен проверять (PyPI / GitHub или же пользователь)?
— ❤️ Всегда
— 😁 Только если мало звёзд
— 👍 Кто вообще так делает, просто pip install
Библиотека питониста #междусобойчик
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍19😁7❤4
  🛡 Runtypes — безопасная валидация структур в TypeScript
Когда вы получаете непроверенные данные (например, из JSON, API, локального хранилища), обычные типы TypeScript никак не защищают вас от ошибок времени выполнения.
😶🌫️  Runtypes позволяют валидировать такие данные на лету, описывая структуру через валидаторы, а не просто типы.
😶🌫️  Пример
Типы на TypeScript:
Валидация через Runtypes:
Проверка данных:
Если структура не соответствует ожидаемой:
— выбрасывается
— доступен объект
  ➡️  где именно ошибка
  ➡️  что ожидалось и что получено
  ➡️  можно использовать для i18n и UI
😶🌫️  Что поддерживает Runtypes
— Примитивы
— Объекты и массивы
— Кортежи
— Объединения (
— Пересечения (
— Пользовательские ограничения (например, длина массива)
— Валидация вложенных структур
😶🌫️  Когда пригодится
— Проверка данных из API, JSON, UI
— Сложная вложенная структура, которую нужно валидировать
— Автогенерация UI и ошибок
— Безопасность в рантайме (а не только на этапе компиляции)
🔗 GitHub: https://clc.to/H_xiTA
Библиотека питониста #буст
Когда вы получаете непроверенные данные (например, из JSON, API, локального хранилища), обычные типы TypeScript никак не защищают вас от ошибок времени выполнения.
Типы на TypeScript:
type Vector = [number, number, number]
type Planet = { type: "planet", location: Vector, mass: number, population: number, habitable: boolean }
Валидация через Runtypes:
import { Number, Boolean, Tuple, Literal, Object } from 'runtypes'
const Vector = Tuple(Number, Number, Number)
const Planet = Object({
  type: Literal("planet"),
  location: Vector,
  mass: Number,
  population: Number,
  habitable: Boolean,
})Проверка данных:
Planet.check(someValue) // выбросит ошибку, если структура не совпадает
Если структура не соответствует ожидаемой:
— выбрасывается
ValidationError— доступен объект
failure с подробностями:— Примитивы
— Объекты и массивы
— Кортежи
— Объединения (
Union)— Пересечения (
Intersect)— Пользовательские ограничения (например, длина массива)
— Валидация вложенных структур
— Проверка данных из API, JSON, UI
— Сложная вложенная структура, которую нужно валидировать
— Автогенерация UI и ошибок
— Безопасность в рантайме (а не только на этапе компиляции)
🔗 GitHub: https://clc.to/H_xiTA
Библиотека питониста #буст
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤7👍2🔥1
  💻 Вайб-кодинг: что это такое и как к нему относятся IT-специалисты и работодатели
97% разработчиков уже пробовали использовать ИИ для написания кода.
Но упрощает ли это работу — или мешает развитию? Как «код по вайбу» влияет на качество, обучение и доверие со стороны работодателей?
📝 В статье:
— Что такое вайб-кодинг
— Почему джунам проще, но опаснее
— Как компании смотрят на ИИ-помощников в коде
— Где грань между продуктивной автоматизацией и потерей контроля
📖 Читайте статью: https://proglib.io/sh/vtER5zUeOF
Библиотека питониста #буст
97% разработчиков уже пробовали использовать ИИ для написания кода.
Но упрощает ли это работу — или мешает развитию? Как «код по вайбу» влияет на качество, обучение и доверие со стороны работодателей?
📝 В статье:
— Что такое вайб-кодинг
— Почему джунам проще, но опаснее
— Как компании смотрят на ИИ-помощников в коде
— Где грань между продуктивной автоматизацией и потерей контроля
📖 Читайте статью: https://proglib.io/sh/vtER5zUeOF
Библиотека питониста #буст
😁8👍3❤2👏1
  Почему и когда был создан язык программирования Python?
  Anonymous Quiz
    11%
    В 1985 году для университетского проекта по искусственному интеллекту.
      
    14%
    В 1995 году как лёгкая альтернатива Java для мобильных приложений.
      
    13%
    В 1991 году для разработки серверного ПО по заказу правительства.
      
    62%
    В 1989 году, чтобы развлечься во время рождественских каникул и создать простой язык.
      
    ❤5👍5😁5
  🚨 Важное
— Phishing-атака на PyPI-пользователей — если вы публиковали пакеты на PyPI и указали email в metadata, остерегайтесь писем с темой
"[PyPI] Email verification" от [email protected] (заметили подмену — pyp**j**, а не pyp**i**).📦 Новые и заметные релизы
— llama-index 0.13.0 — интерфейс между LLM и вашими данными
— pip 25.2.0 — свежий апдейт пакетного менеджера
— keras 3.11.0 — глубокое обучение
— flax 0.11.0 — нейросети на JAX
— docutils 0.22.0 — генерация документации из reStructuredText
— trl 0.20.0 — обучение трансформеров с подкреплением
— narwhals 2.0.0 — совместимость Pandas, Polars и других DataFrame
— autogen 0.7.1 — фреймворк для агентного ИИ
— sse-starlette 3.0.0 — поддержка Server-Sent Events в Starlette
— lightning-utilities 0.15.0 — полезности для экосистемы PyTorch Lightning
— optree 0.17.0 — утилиты для PyTree-структур
🔥 Опыт других
— Парсим Авито без ограничений — создание кастомного парсера
— Старая оптимизация больше не работает — как изменения в Python ломают старые подходы
Библиотека питониста #свежак
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤5🔥2👍1
  Forwarded from Библиотека задач по Data Science | тесты, код, задания
❤4😢1
  ML/CV python backend разработчик — от 350 000 до 400 000 ₽, удалёнка
Python Backend Developer — от 250 000 ₽, удалёнка
Middle Python Developer — от 2800 до 3200 $, удалёнка
Senior System Engineer (Python / Golang) — от 400 000 до 460 000 ₽, удалёнка
Python разработчик — от 300 000 ₽, удалёнка
Библиотека питониста
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤1👍1😁1
  🛠 How to: писать проще в Python без лишних классов
Классы — это хорошо, когда они действительно нужны. Но в Python часто можно обойтись без них, используя более простые и питоничные решения.
Вот как можно упростить ваш код:
🔹 Нужно просто хранить данные?
Используйте
🔹 Нужна утилита без состояния?
Пишите обычные функции:
🔹 Хотите сгруппировать настройки или константы?
Создайте модуль:
🔹 Храните простое состояние?
Используйте списки или словари:
🔹 Простая трансформация данных?
Пишите через list comprehension или
Или:
🔹 Работаете с конфигами или сериализацией?
Воспользуйтесь стандартными модулями:
▶️  Когда классы действительно полезны:
• если есть состояние + поведение
• если нужен шаблон для объектов
• если проект требует наследования или композиции
▶️  Пишите просто. Пишите по-Питони.
Класс — это не всегда решение.
Иногда достаточно функции, модуля или словаря.
▶️  Подробнее можно узнать в статье: https://clc.to/onD8-Q
Библиотека питониста #буст
Классы — это хорошо, когда они действительно нужны. Но в Python часто можно обойтись без них, используя более простые и питоничные решения.
Вот как можно упростить ваш код:
🔹 Нужно просто хранить данные?
Используйте
@dataclass или namedtuple:from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(1, 2)
🔹 Нужна утилита без состояния?
Пишите обычные функции:
def add(a, b):
return a + b
🔹 Хотите сгруппировать настройки или константы?
Создайте модуль:
# config.py
HOST = 'localhost'
PORT = 8080'
# main.py
import config
print(config.HOST)
🔹 Храните простое состояние?
Используйте списки или словари:
inventory = []
inventory.append('apple')
🔹 Простая трансформация данных?
Пишите через list comprehension или
lambda:result = [x * 2 for x in data]
Или:
transform = lambda data: [x * 2 for x in data]
🔹 Работаете с конфигами или сериализацией?
Воспользуйтесь стандартными модулями:
import json
config = {'host': 'localhost', 'port': 8080}
with open('config.json', 'w') as f:
json.dump(config, f)
• если есть состояние + поведение
• если нужен шаблон для объектов
• если проект требует наследования или композиции
Класс — это не всегда решение.
Иногда достаточно функции, модуля или словаря.
Библиотека питониста #буст
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤13👍4😁2💯2🤔1🌚1
  🤔 Зачем вообще понимать, как работает ML?
Сейчас многие просто запускают модельку в sklearn — и радуются точности 0.92.
Машинное обучение — это система, которую можно понять.
Если знаешь, что делает градиентный спуск, зачем нужен бустинг и как дерево принимает решения — ты не просто «запускаешь», ты управляешь моделью.
👉 Мы сделали курс, чтобы в это было реально въехать:
— без сложных формул;
— с интуитивными объяснениями;
— от простого к сложному.
Если хочешь перейти от «гуглю код» к «понимаю, как это работает» — ты по адресу!
❗Стартуем в сентябре — бронируй место на курсе уже сейчас
Сейчас многие просто запускают модельку в sklearn — и радуются точности 0.92.
Вроде всё работает… но почему?
А когда сломается — что делать?
Машинное обучение — это система, которую можно понять.
Если знаешь, что делает градиентный спуск, зачем нужен бустинг и как дерево принимает решения — ты не просто «запускаешь», ты управляешь моделью.
👉 Мы сделали курс, чтобы в это было реально въехать:
— без сложных формул;
— с интуитивными объяснениями;
— от простого к сложному.
Если хочешь перейти от «гуглю код» к «понимаю, как это работает» — ты по адресу!
❗Стартуем в сентябре — бронируй место на курсе уже сейчас
❤3👍1
  🚚 Delivery Manager: кто это и зачем он нужен в IT
В каждой IT-компании есть деливери-менеджеры, но чётко объяснить, чем они занимаются, может далеко не каждый. Они не совсем проектные менеджеры, не совсем тимлиды — но без них всё разваливается.
➡️  Это не стартовая позиция, но очень востребованная — особенно в зрелых компаниях и крупных проектах.
🔗  Читайте статью, чтобы понять, стоит ли вам двигаться в эту сторону: https://proglib.io/sh/9qwbeKQ0dV
Библиотека питониста #буст
В каждой IT-компании есть деливери-менеджеры, но чётко объяснить, чем они занимаются, может далеко не каждый. Они не совсем проектные менеджеры, не совсем тимлиды — но без них всё разваливается.
Библиотека питониста #буст
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤2👍2