PythonTalk
4.99K subscribers
1.6K photos
50 videos
6 files
1.37K links
Привет, меня зовут Олег Булыгин 👋

🐍 Здесь я делюсь полезной информацией для тех, кто пишет код на Python: от разработки до Data Science.

По вопросам: @obulygin91
Download Telegram
unittest vs pytest

unittest — встроенная в 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.

#итоги_месяца
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥41🙏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
4👍32🔥1
📊 Рынок труда в IT: итоги 3 квартала 2025. Гайки закручиваются.

Подводим квартальные итоги по рынку, и картина, мягко говоря, не очень радостная.

1️⃣ Зарплаты (болото)

Начнём с данных Getmatch по питонистам. Тут стабильность, которую мы не заказывали. Цифры почти не изменились, а это значит, что с учётом инфляции реальные доходы продолжают падать.

▪️ Медианная зарплата по всем уровням – 205к (было 200к)
▫️ Джуны – 100к (без изменений)
▫️ Мидлы – 190к (без изменений)
▫️ Синьоры – 300к (без изменений)
▫️ Тимлиды – 350к (без изменений)

▫️ В Москве – 215к (было 210к)
▫️ Питер – 200к (без изменений)
▫️ Удалёнщики – 225к (было 220к)

Рост на уровне статистической погрешности. Движения нет.

2️⃣ Общая картина (мясорубка) 🥩

А теперь самое интересное — общая температура по 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🙈21🔥1🙉1🙊1🤷11
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-скрипты 🐍

#годный_опенсорс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍221
Ruff: современный стандарт линтинга и форматирования в Python

Годами стандартный набор для 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🔥321👏1🙏1
Пятничный сеанс экзорцизма в рубрике #код_курильщика объявляется открытым вот с таким 🤬 из интернетов:

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.

Задача тривиальная. Реализация — специфичная 🤪

Почему это преступление против человечности:


1️⃣ Одержимость однострочниками. Классическая ошибка, когда "компактно" путают с "хорошо".
2️⃣ Немыслимая вложенность. Чтобы понять, какой класс создаётся, нужно совершить ментальную акробатику и пройти по цепочке из трёх словарей. Дебажить такое — чистое страдание.
3️⃣ Вероятные баги. Судя по всему, 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👨‍💻21👍1🙏1
🤯 API для ChatGPT нахаляву?

Как насчет OpenAI-совместимого API, которое работает от вашей подписки ChatGPT Plus и не требует покупки токенов? Да, так можно было.

Наткнулся на проект ChatMock — локальный прокси-сервер, который делает ровно это. Вы логинитесь через свой аккаунт, а он прокидывает запросы на настоящий бэкенд ChatGPT.

Что это дает на выходе:
1️⃣Совместимость: Эндпоинты, идентичные OpenAI и Ollama. Можно подключить любой привычный клиент или библиотеку.
2️⃣Доступ к gpt-5: Можно дергать последнюю модель программно, как будто у вас есть API-ключ.
3️⃣Фичи: Поддерживается vision, tool calling и даже "усилия на размышление" (reasoning effort) — можно подкрутить, насколько сильно модель будет "думать".

Конечно, есть нюансы:
1. Нужна платная подписка ChatGPT Plus/Pro. Халява не совсем халява.
2. Рейт-лимиты будут ниже, чем у полноценного API. Для личных пет-проектов — топ, для прода — вряд ли.
3. Проект, разумеется, не аффилирован с OpenAI и существует на свой страх и риск, это серая зона.

Устанавливается через Homebrew, Docker или просто как python-скрипт.

#годный_опенсорс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍22😐1
История о том, как язык-клей, созданный для скриптов и автоматизации, случайно зашёл на чужую территорию и вынес оттуда "короля" статистики — язык 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
🔥188👍7🙏1