unittest vs pytestunittest — встроенная в Python "батарейка". Она просто есть. Всегда была. И на этом её плюсы, в общем-то, заканчиваются 😒pytest — фреймворк, который настолько хорош, что стал стандартом индустрии. Меньше кода, фикстуры, мощная экосистема плагинов.Сравниваем их в карточках
Спойлер: начинать новый проект на
unittest в 2025 году — это странный выбор, граничащий с мазохизмом. #два_стула
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4🙏1👌1
🗓Итоги месяца (сентябрь 2025)
🏆Топовый пост: бесплатная хорошая книжка Think Python для начинающих📖
👀 Топ по просмотрам 👨🏻💻
1️⃣ Релиз модельки HunyuanWorld-Voyager для генерации 3D-миров.
2️⃣ Безжалостное сравнение зарплат айтишников и строителей.
3️⃣ Excel более востребованный, чем Python в IT.
📨 Топ по репостам 📥
1️⃣ Бесплатный курс по программированию с нейронками от Cursor.
2️⃣ Бесплатные курсы от Hugging Face.
3️⃣ Шпаргалка по типам данных в Python.
👍🏻 Топ по реакциям 😍
1️⃣ Исследование популярности Stack Overflow на фоне использования нейросеток.
2️⃣ 13 сентября был День Программиста!🥳
3️⃣ Курсы по хоткеям в IDE.
#итоги_месяца
🏆Топовый пост: бесплатная хорошая книжка Think Python для начинающих
👀 Топ по просмотрам 👨🏻💻
1️⃣ Релиз модельки HunyuanWorld-Voyager для генерации 3D-миров.
2️⃣ Безжалостное сравнение зарплат айтишников и строителей.
3️⃣ Excel более востребованный, чем Python в IT.
📨 Топ по репостам 📥
1️⃣ Бесплатный курс по программированию с нейронками от Cursor.
2️⃣ Бесплатные курсы от Hugging Face.
3️⃣ Шпаргалка по типам данных в Python.
👍🏻 Топ по реакциям 😍
1️⃣ Исследование популярности Stack Overflow на фоне использования нейросеток.
2️⃣ 13 сентября был День Программиста!
3️⃣ Курсы по хоткеям в IDE.
#итоги_месяца
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4❤1🙏1
Вышла GLM-4.6 от Z.ai, кратко по спекам:
▪️ Контекст подрос со 128К до 200К токенов. Пригодится для сложных агентных задач, где нужно держать в голове тонну информации.
▪️ Программирование и логика. Заявляют о серьёзном бусте производительности. Что интересно, в своём же бенчмарке CC-Bench они почти догнали Claude Sonnet 4, но честно признают, что в кодинге до Claude 4.5 ещё не дотягивают.
▪️ Агенты. Улучшили работу с инструментами и интеграцию в агентные фреймворки.
▪️ Эффективность. Задачи решаются на 15% меньшим количеством токенов, чем у прошлой версии.
Что это значит для нас? 💻
GLM Coding Plan предлагает производительность уровня Claude, но стоит в 7 раз дешевле при в 3 раза большей квоте.
Ну и открытость. Они не жмотят веса и данные для оценки:
👉 Поиграться в чате: Z.ai Chat
👉 Дёрнуть по API: Документация (есть и на OpenRouter)
👉 Скачать веса и запустить локально: HuggingFace
👉 Покопаться в данных их бенчмарка: CC-Bench Trajectories
▪️ Контекст подрос со 128К до 200К токенов. Пригодится для сложных агентных задач, где нужно держать в голове тонну информации.
▪️ Программирование и логика. Заявляют о серьёзном бусте производительности. Что интересно, в своём же бенчмарке CC-Bench они почти догнали Claude Sonnet 4, но честно признают, что в кодинге до Claude 4.5 ещё не дотягивают.
▪️ Агенты. Улучшили работу с инструментами и интеграцию в агентные фреймворки.
▪️ Эффективность. Задачи решаются на 15% меньшим количеством токенов, чем у прошлой версии.
Что это значит для нас? 💻
GLM Coding Plan предлагает производительность уровня Claude, но стоит в 7 раз дешевле при в 3 раза большей квоте.
Ну и открытость. Они не жмотят веса и данные для оценки:
👉 Поиграться в чате: Z.ai Chat
👉 Дёрнуть по API: Документация (есть и на OpenRouter)
👉 Скачать веса и запустить локально: HuggingFace
👉 Покопаться в данных их бенчмарка: CC-Bench Trajectories
❤4👍3 2🔥1
Подводим квартальные итоги по рынку, и картина, мягко говоря, не очень радостная.
Начнём с данных Getmatch по питонистам. Тут стабильность, которую мы не заказывали. Цифры почти не изменились, а это значит, что с учётом инфляции реальные доходы продолжают падать.
▪️ Медианная зарплата по всем уровням – 205к (было 200к)
▫️ Джуны – 100к (без изменений)
▫️ Мидлы – 190к (без изменений)
▫️ Синьоры – 300к (без изменений)
▫️ Тимлиды – 350к (без изменений)
▫️ В Москве – 215к (было 210к)
▫️ Питер – 200к (без изменений)
▫️ Удалёнщики – 225к (было 220к)
Рост на уровне статистической погрешности. Движения нет.
А теперь самое интересное — общая температура по IT-больнице от hh.ru.
Разрыв между хотелками и реальностью внезапно сократился! Но радоваться тут нечему.
▫️ Ожидаемые зарплаты (фиолетовая линия на графике) после пика в 110к рухнули обратно до 100к. Кандидаты начали трезветь и умерять аппетиты.
▫️ Предлагаемые (красная линия) мёртво стоят на 90к. Бизнес платить больше не собирается.
Итог: пропасть между ожиданиями и реальностью сократилась с 20к до 10к не потому что работодатели подобрели, а потому что соискатели поняли — жирных офферов на всех не хватит.
Вот тут разворачивается настоящий ад. hh.индекс (количество резюме на одну вакансию) улетел в стратосферу.
▫️ Летом было 12.5 человек на место, и это уже было дико.
▫️ К концу сентября — 16.1.
Напомню, по классификации hh, всё что выше 12 — это «крайне высокий уровень конкуренции». Мы уже далеко за этой чертой. Год назад в это же время было 8.2. Конкуренция за год выросла ВДВОЕ.
Что имеем в сухом остатке?
Зарплаты стоят на месте. Компании не готовы платить больше. А на каждое место теперь претендует не просто толпа, а целый стадион кандидатов, которые от безысходности начинают просить меньше денег.
А теперь накладываем на это отмену льгот IT-компаниям и повышение НДС в 2026 году. ЧТО БЫЛО ДАЛЬШЕ?
#денюжки
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😢10👀4😭2🙈2❤1🔥1🙉1🙊1🤷1 1
This media is not supported in your browser
VIEW IN TELEGRAM
Недавно ребята из Sber AI выкатили в опенсорс Kandinsky 5.0 T2V Lite. Она не только генерит видосы, но и, по заявлениям, лучше всех в опенсорсе понимает русские концепты. Прощайте, кривые чебурашки 😁
Что за зверь?
1️⃣ Модель "лайтовая", всего 2B параметров. Но по бенчмаркам она обходит даже 14-миллиардные модели от Wan.
2️⃣ Генерит видосы до 5 и 10 секунд. 10-секундные модели используют хитрый алгоритм NABLA для ускорения.
3️⃣ Есть сразу 8 (!) вариантов моделей под разные задачи:
- SFT — если нужно максимальное качество.
- CFG-distilled — если надо в 2 раза быстрее.
- Diffusion-distilled — для тех, кому "надо вчера", в 6 раз быстрее SFT на 16 шагах.
- Pretrain — для энтузиастов, кто хочет дообучить под свои нужды.
4️⃣ Под капотом модный стек: DiT (Diffusion Transformer), текстовые эмбеддинги от Qwen2.5-VL + CLIP и 3D VAE от HunyuanVideo.
Но самое главное — это можно потрогать руками. В репозитории лежит готовый воркфлоу для ComfyUI (kandisnky5_lite_T2V.json). Есть и Python-скрипты🐍
#годный_опенсорс
Что за зверь?
- SFT — если нужно максимальное качество.
- CFG-distilled — если надо в 2 раза быстрее.
- Diffusion-distilled — для тех, кому "надо вчера", в 6 раз быстрее SFT на 16 шагах.
- Pretrain — для энтузиастов, кто хочет дообучить под свои нужды.
Но самое главное — это можно потрогать руками. В репозитории лежит готовый воркфлоу для ComfyUI (kandisnky5_lite_T2V.json). Есть и Python-скрипты
#годный_опенсорс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍2 2❤1
Ruff: современный стандарт линтинга и форматирования в Python
Годами стандартный набор для Python-проекта выглядел как зоопарк:
Сейчас уже все используют Ruff — очень быстрый линтер и форматер, написанный на Rust, который создавался с одной целью: быть на порядок лучше существующих инструментов.
Какие у него преимущества?
📦 Тотальная консолидация. Он заменяет собой Flake8, Black, isort, pyupgrade, pydocstyle, autoflake и десятки их плагинов. Один исполняемый файл, одна секция в
⚡️ Феноменальная производительность. Ruff в 10-100 раз быстрее аналогов. Проверка всего codebase CPython занимает у него секунды, а не минуты. Это не просто "удобно", это меняет сам подход к разработке — линтинг становится мгновенной операцией, которую можно безболезненно встроить хоть в pre-commit хук, хоть в CI/CD.
🔧 Автоматическое исправление. Большинство проблем Ruff может исправить сам с помощью флага
🧩 Простая интеграция. Первоклассная поддержка VS Code, pre-commit хуков и GitHub Actions.
Хотите пощупать, не ставя локально? Для этого есть официальная песочница.
Начать использовать — элементарно:
Добавляем в
После этого можно смело удалять старые зависимости из проекта.
Официальная документация 👈🏻
#тулбокс
Годами стандартный набор для Python-проекта выглядел как зоопарк:
Black для форматирования, isort для импортов, Flake8 с десятком плагинов (bugbear, bandit, annotations...) для статического анализа. Это работало, но было медленно и требовало сложной настройки.Сейчас уже все используют Ruff — очень быстрый линтер и форматер, написанный на Rust, который создавался с одной целью: быть на порядок лучше существующих инструментов.
Какие у него преимущества?
📦 Тотальная консолидация. Он заменяет собой Flake8, Black, isort, pyupgrade, pydocstyle, autoflake и десятки их плагинов. Один исполняемый файл, одна секция в
pyproject.toml. Меньше зависимостей, проще конфигурация, нет конфликтов.⚡️ Феноменальная производительность. Ruff в 10-100 раз быстрее аналогов. Проверка всего codebase CPython занимает у него секунды, а не минуты. Это не просто "удобно", это меняет сам подход к разработке — линтинг становится мгновенной операцией, которую можно безболезненно встроить хоть в pre-commit хук, хоть в CI/CD.
🔧 Автоматическое исправление. Большинство проблем Ruff может исправить сам с помощью флага
--fix. Автоматическое удаление неиспользуемых импортов, исправление стиля, обновление синтаксиса — всё из коробки.🧩 Простая интеграция. Первоклассная поддержка VS Code, pre-commit хуков и GitHub Actions.
"Ruff настолько быстр, что я иногда намеренно добавляю баг в код, просто чтобы убедиться, что он действительно работает и проверяет его".
— Себастьян Рамирес, создатель FastAPI
Хотите пощупать, не ставя локально? Для этого есть официальная песочница.
Начать использовать — элементарно:
pip install ruffДобавляем в
pyproject.toml конфиг, который покроет 95% потребностей среднего проекта:[tool.ruff]
# Выбираем правила: E, W (pycodestyle), F (Pyflakes), I (isort), B (flake8-bugbear)
select = ["E", "F", "I", "W", "B"]
line-length = 88
# Добавляем авто-фикс для неиспользуемых импортов
unfixable = ["F841"]
[tool.ruff.format]
# Включаем встроенный форматер, аналог Black
quote-style = "double"
После этого можно смело удалять старые зависимости из проекта.
Официальная документация 👈🏻
#тулбокс
👍5🔥3 2⚡1👏1🙏1
Пятничный сеанс экзорцизма в рубрике #код_курильщика объявляется открытым вот с таким 🤬 из интернетов:
Что эта дичь вообще делает?
Если отмыть код от страданий, то это, по сути, фабрика объектов. Она берёт список каких-то
1. Смотрит его тип в
2. По этому типу через пару словарей находит нужный класс (например,
3. Создаём экземпляр этого класса, скармливая ему весь
4. Все созданные объекты запихивает в новый список
Задача тривиальная. Реализация — специфичная🤪
Почему это преступление против человечности:
1️⃣ Одержимость однострочниками. Классическая ошибка, когда "компактно" путают с "хорошо".
2️⃣ Немыслимая вложенность. Чтобы понять, какой класс создаётся, нужно совершить ментальную акробатику и пройти по цепочке из трёх словарей. Дебажить такое — чистое страдание.
3️⃣ Вероятные баги. Судя по всему,
Комментарий
Это идеальный пример того, как в погоне за "компактностью" полностью убивается главный принцип Python — читаемость. Zen of Python вышел из чата и хлопнул дверью.
А как надо было?
Да просто разбить это на несколько понятных строк. Превращаем чудовище в нормальный, читаемый код, который не заставит ваших коллег вас ненавидеть.
Что мы получили:
- Читаемость. Код читается как проза, а не как шифровка.
- Отлаживаемость. Можно поставить
- Надёжность. Используем
Ставьте👍 , если сразу поняли, что изначальный код делает.
pubcls = main.__all__["publication"]
res = [ main.__all__[pubcls._type_classes[unit["unitType"]]](unit) for unit in
units if unit in pubcls._type_classes and pubcls._type_classes[unit] in main.__all__] # python moment©
Что эта дичь вообще делает?
Если отмыть код от страданий, то это, по сути, фабрика объектов. Она берёт список каких-то
units (похоже, словарей с данными), и для каждого из них:1. Смотрит его тип в
unit["unitType"].2. По этому типу через пару словарей находит нужный класс (например,
Article или NewsItem).3. Создаём экземпляр этого класса, скармливая ему весь
unit.4. Все созданные объекты запихивает в новый список
res.Задача тривиальная. Реализация — специфичная
Почему это преступление против человечности:
unit — это словарь, и его пытаются использовать как ключ. Либо это какой-то кастомный hashable-объект, что делает код ещё более неочевидным, либо автор просто... творит дичь.Комментарий
# python moment© — это самоирония 80-го уровня. Человек создал чудовище, прекрасно это осознал, но все равно оставил его жить.Это идеальный пример того, как в погоне за "компактностью" полностью убивается главный принцип Python — читаемость. Zen of Python вышел из чата и хлопнул дверью.
А как надо было?
Да просто разбить это на несколько понятных строк. Превращаем чудовище в нормальный, читаемый код, который не заставит ваших коллег вас ненавидеть.
def create_objects_from_data(units: list) -> list:
"""
Создаёт список объектов из списка словарей с данными.
"""
# Достаём нужные "реестры" один раз
publication_registry = main.__all__["publication"]
class_name_map = publication_registry._type_classes
result = []
for unit_data in units:
unit_type = unit_data.get("unitType")
if not unit_type:
continue # Пропускаем данные без типа
class_name = class_name_map.get(unit_type)
if not class_name:
continue # Пропускаем неизвестные типы
target_class = main.__all__.get(class_name)
if not target_class:
continue # Пропускаем, если класс не найден
result.append(target_class(unit_data))
return result
Что мы получили:
- Читаемость. Код читается как проза, а не как шифровка.
- Отлаживаемость. Можно поставить
breakpoint на любой строке и посмотреть, что лежит в unit_type, class_name или target_class.- Надёжность. Используем
.get() для безопасной работы со словарями, избегая KeyError.Ставьте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👨💻2⚡1👍1🙏1
🤯 API для ChatGPT нахаляву?
Как насчет OpenAI-совместимого API, которое работает от вашей подписки ChatGPT Plus и не требует покупки токенов? Да, так можно было.
Наткнулся на проект
Что это дает на выходе:
1️⃣ Совместимость: Эндпоинты, идентичные OpenAI и Ollama. Можно подключить любой привычный клиент или библиотеку.
2️⃣ Доступ к gpt-5: Можно дергать последнюю модель программно, как будто у вас есть API-ключ.
3️⃣ Фичи: Поддерживается vision, tool calling и даже "усилия на размышление" (reasoning effort) — можно подкрутить, насколько сильно модель будет "думать".
Конечно, есть нюансы:
1. Нужна платная подписка ChatGPT Plus/Pro. Халява не совсем халява.
2. Рейт-лимиты будут ниже, чем у полноценного API. Для личных пет-проектов — топ, для прода — вряд ли.
3. Проект, разумеется, не аффилирован с OpenAI и существует на свой страх и риск, это серая зона.
Устанавливается через Homebrew, Docker или просто как python-скрипт.
#годный_опенсорс
Как насчет OpenAI-совместимого API, которое работает от вашей подписки ChatGPT Plus и не требует покупки токенов? Да, так можно было.
Наткнулся на проект
ChatMock — локальный прокси-сервер, который делает ровно это. Вы логинитесь через свой аккаунт, а он прокидывает запросы на настоящий бэкенд ChatGPT.Что это дает на выходе:
Конечно, есть нюансы:
1. Нужна платная подписка ChatGPT Plus/Pro. Халява не совсем халява.
2. Рейт-лимиты будут ниже, чем у полноценного API. Для личных пет-проектов — топ, для прода — вряд ли.
3. Проект, разумеется, не аффилирован с OpenAI и существует на свой страх и риск, это серая зона.
Устанавливается через Homebrew, Docker или просто как python-скрипт.
#годный_опенсорс
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - RayBytes/ChatMock: Access OpenAI models programmatically through your ChatGPT subscription.
Access OpenAI models programmatically through your ChatGPT subscription. - RayBytes/ChatMock
🔥7👍2 2😐1
История о том, как язык-клей, созданный для скриптов и автоматизации, случайно зашёл на чужую территорию и вынес оттуда "короля" статистики — язык R.
Это не была честная дуэль. Python даже не знал, что участвует в войне. Он просто оказался более удобным швейцарским ножом, пока R был узкоспециализированным скальпелем, которым никто, кроме хирургов, не умел пользоваться.
Если хотите подробнее, то читайте в статье: Как Python, язык для скриптов, стал королём Data Science и почему R проиграл эту войну◀️
А видеопересказ здесь◀️
#так_сложилось
Это не была честная дуэль. Python даже не знал, что участвует в войне. Он просто оказался более удобным швейцарским ножом, пока R был узкоспециализированным скальпелем, которым никто, кроме хирургов, не умел пользоваться.
Если хотите подробнее, то читайте в статье: Как Python, язык для скриптов, стал королём Data Science и почему R проиграл эту войну
А видеопересказ здесь
#так_сложилось
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤8👍7🙏1