LangChain → LangGraph: новый стек для Python-разработчика
Если вы всё ещё пишете линейные цепочки на
Вместо хардкода
—
—
—
Это превращает скрипт в надёжную систему. На курсе учим проектировать такие архитектуры и деплоить их.
Записаться на курс
Разбор архитектуры и кода — в открытом доступе.
Смотрите вводный урок бесплатно.
Если вы всё ещё пишете линейные цепочки на
LangChain, вы отстали. Продакшн требует LangGraph — надстройки для создания агентов с циклами и сохранением состояния.Вместо хардкода
if/else вы описываете граф:—
State: контекст, который передаётся между узлами;—
Nodes: функции Python, выполняющие работу;—
Edges: логика переходов (включая условные).Это превращает скрипт в надёжную систему. На курсе учим проектировать такие архитектуры и деплоить их.
Записаться на курс
Разбор архитектуры и кода — в открытом доступе.
Смотрите вводный урок бесплатно.
😁5
PyCharm теперь с поддержкой Google Colab
IDE всё плотнее дружит с облаком: можно работать с Colab-проектами из привычного интерфейса.
Интроспекция в Python на реальных примерах
Как код узнаёт сам о себе: атрибуты, объекты, метаданные и прочая магия, на которой держатся ORM, фреймворки и половина «умных» библиотек.
threading vs multiprocessing vs asyncio
Классический треугольник страданий разобран без мифов.
Аннотации и модуль typing
Систематизация всего, что произошло с типами в Python за последние годы.
Дескрипторы — скрытый механизм Python
Тема не из лёгких, но именно здесь Python превращается из «простого» в «элегантно хитрый».
Готовые промпты для программистов
Подборка шаблонов для работы с ИИ в задачах разработки.
💼 Вакансии
Python-разработчик — от 200 000 до 300 000 ₽/мес на руки, офис/гибрид (Москва)
Старший разработчик сервисов данных (Python), офис/гибрид (Москва)
Senior Backend-разработчик, удалёнка
📍 Навигация: Вакансии • Задачи • Собесы
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
🔥 Топовые GitHub-репозитории по Python, которые реально помогут
Сохраняй — это готовый roadmap из практики, алгоритмов и best practices.
1️⃣ Коллекция полезных Python-скриптов, туториалов и разных полезностей — как большой набор инструментов под рукой.
2️⃣ Огромный curated-список лучших Python-фреймворков, библиотек, софта и ресурсов. Почти вся экосистема в одном месте.
3️⃣ Та же awesome-подборка, но со статистикой stars и forks — помогает быстро понять, что реально популярно и живо.
4️⃣ Все алгоритмы на Python — идеально для изучения структур данных и подготовки к техсобесам.
5️⃣ Список туториалов, где учат создавать приложения с нуля — полноценная практика, а не разрозненные куски кода.
6️⃣ Python-скрипты по темам: примеры кода, объяснения, кейсы использования и ссылки на дополнительные материалы. Отличный справочник.
7️⃣ 100+ задач и челленджей по Python — чтобы закрепить знания через практику.
8️⃣ Хэндбук по best practices: установка, настройка и повседневная работа с Python без боли.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Сохраняй — это готовый roadmap из практики, алгоритмов и best practices.
1️⃣ Коллекция полезных Python-скриптов, туториалов и разных полезностей — как большой набор инструментов под рукой.
2️⃣ Огромный curated-список лучших Python-фреймворков, библиотек, софта и ресурсов. Почти вся экосистема в одном месте.
3️⃣ Та же awesome-подборка, но со статистикой stars и forks — помогает быстро понять, что реально популярно и живо.
4️⃣ Все алгоритмы на Python — идеально для изучения структур данных и подготовки к техсобесам.
5️⃣ Список туториалов, где учат создавать приложения с нуля — полноценная практика, а не разрозненные куски кода.
6️⃣ Python-скрипты по темам: примеры кода, объяснения, кейсы использования и ссылки на дополнительные материалы. Отличный справочник.
7️⃣ 100+ задач и челленджей по Python — чтобы закрепить знания через практику.
8️⃣ Хэндбук по best practices: установка, настройка и повседневная работа с Python без боли.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
🦆 NumPy с уточками: когда код превращается в игру
Если вы когда-нибудь пытались освоить NumPy, то знаете: поначалу удержать в голове логику работы с массивами бывает непросто. Документация полезна, но иногда хочется чего-то более наглядного.
Знакомьтесь с Numpy Ducky — проектом в духе знаменитого Flexbox Froggy.
Здесь вы учитесь работать с данными, помогая милым уточкам добраться до воды.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Если вы когда-нибудь пытались освоить NumPy, то знаете: поначалу удержать в голове логику работы с массивами бывает непросто. Документация полезна, но иногда хочется чего-то более наглядного.
Знакомьтесь с Numpy Ducky — проектом в духе знаменитого Flexbox Froggy.
Здесь вы учитесь работать с данными, помогая милым уточкам добраться до воды.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12😁3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁26💯5👍2🤔1
🚀 Pillow стал быстрее: как профилировщик из Python 3.15 помог ускорить открытие изображений
При обычном
1. Вызывает
2. Импортирует плагины форматов (PNG, GIF, JPEG и др.)
3. Проверяет, подходит ли каждый плагин под файл
4. Если нет — вызывает
📦 Сейчас в Pillow 47 плагинов форматов.
Даже если ты открываешь один PNG, библиотека могла импортировать кучу ненужного кода.
Идея оптимизации -> вместо загрузки всех плагинов — сделать lazy loading по расширению файла.
👉 Сначала быстрый lookup:
Только если:
— нет расширения
— расширение неверное
→ тогда используется старый механизм с перебором.
⭐️ Улучшение войдёт в Pillow 12.2.0
🔗 Ссылка на материал с деталями реализации
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
При обычном
Image.open() Pillow:1. Вызывает
preinit()2. Импортирует плагины форматов (PNG, GIF, JPEG и др.)
3. Проверяет, подходит ли каждый плагин под файл
4. Если нет — вызывает
init() и грузит все остальные плагины📦 Сейчас в Pillow 47 плагинов форматов.
Даже если ты открываешь один PNG, библиотека могла импортировать кучу ненужного кода.
Идея оптимизации -> вместо загрузки всех плагинов — сделать lazy loading по расширению файла.
👉 Сначала быстрый lookup:
расширение файла → нужный плагинТолько если:
— нет расширения
— расширение неверное
→ тогда используется старый механизм с перебором.
⭐️ Улучшение войдёт в Pillow 12.2.0
🔗 Ссылка на материал с деталями реализации
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1🤩1
🛠 Шпаргалка: как проверить, запущен ли Python-скрипт с повышенными правами
Иногда скрипту нужны root (Linux/macOS) или admin (Windows) права. Если их нет — лучше сразу завершиться, а не падать позже на системных операциях.
🐧 Linux / macOS — проверка на root
В Unix-системах всё просто: UID = 0 → это root
📌 Использует встроенную функцию
🪟 Windows — проверка на администратора
В Windows нет UID 0, поэтому используем вызов системной функции через
📌 Вызывает Windows API:
🌍 Универсальная функция
Если нужен один метод под все ОС:
⚠️ В продакшене часто делают так:
Просто, быстро и спасает от странных ошибок дальше по коду.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Иногда скрипту нужны root (Linux/macOS) или admin (Windows) права. Если их нет — лучше сразу завершиться, а не падать позже на системных операциях.
🐧 Linux / macOS — проверка на root
В Unix-системах всё просто: UID = 0 → это root
import os
def is_root() -> bool:
"""True, если скрипт запущен с root-правами (Linux/macOS)."""
if os.name == "posix":
return os.getuid() == 0
return False
📌 Использует встроенную функцию
os.getuid().🪟 Windows — проверка на администратора
В Windows нет UID 0, поэтому используем вызов системной функции через
ctypes:
import ctypes
import os
def is_admin() -> bool:
"""True, если скрипт запущен с правами администратора (Windows)."""
if os.name == "nt":
return ctypes.windll.shell32.IsUserAnAdmin() != 0
return False
📌 Вызывает Windows API:
IsUserAnAdmin.🌍 Универсальная функция
Если нужен один метод под все ОС:
import os
import ctypes
def has_elevated_privileges() -> bool:
if os.name == "posix":
return os.getuid() == 0
elif os.name == "nt":
return ctypes.windll.shell32.IsUserAnAdmin() != 0
return False
⚠️ В продакшене часто делают так:
if not has_elevated_privileges():
print("Требуются права администратора/root")
exit(1)
Просто, быстро и спасает от странных ошибок дальше по коду.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🤔3
Шпаргалка.jpeg
222.5 KB
📌 Для новичков: короткая и понятная шпаргалка по Python 3, где есть весь базовый синтаксис, который нужен на старте
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔1🤩1
🐞 Как один тест помог найти баг в Django 6.0
Представьте: вы настроили идеальный конвейер. uv летает, Renovate тихонько обновляет зависимости в фоне, автомёрж работает, жизнь прекрасна.
💥 И тут прилетает Django 6.0. Один тест из всех падает.
Тест проверял ссылку с мульти-значениями в query-параметрах: /?content_type=1&content_type=2
Оказалось, что в Django 6.0 вместо этого стало рендериться: /?content_type=2 — выживало только последнее значение.
😡 Ребята хотели как лучше. В новой версии Django тег {% querystring %} научился принимать несколько позиционных аргументов. В ходе рефакторинга разработчики начали итерироваться по QueryDict.items(). Проблема в том, что .items() у QueryDict возвращает только последнее значение для каждого ключа.
Автор этой истории, мог бы просто ругаться на сырой релиз. Но его спас «правильно ленивый» тест, написанный ещё во времена Django 4.2.
Самое интересное здесь не сам баг, а то, как он был пойман:
1️⃣ Тест не вызывал метод модели напрямую, а проверял итоговый HTML через BeautifulSoup.
2️⃣ Когда-то в проекте был кастомный метод для формирования URL, который позже заменили на стандартный тег Django. Тест при этом не меняли — и он продолжил работать, проверяя именно то, что видит пользователь.
3️⃣ Если бы тест проверял только внутреннюю логику метода, он бы никогда не узнал, что обновление библиотеки сломало отображение на фронтенде.
💡 Выводы для нас:
➡️ Автоматизируйте апдейты: инструменты вроде Renovate превращают обновление в поток мелких правок, а не в «десантную операцию» раз в полгода.
➡️ Пишите «эмпатичные» тесты: тесты должны жить дольше, чем код, который они проверяют. Хороший тест фокусируется на поведении системы, а не на том, как вы назвали переменную.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Представьте: вы настроили идеальный конвейер. uv летает, Renovate тихонько обновляет зависимости в фоне, автомёрж работает, жизнь прекрасна.
Тест проверял ссылку с мульти-значениями в query-параметрах: /?content_type=1&content_type=2
Оказалось, что в Django 6.0 вместо этого стало рендериться: /?content_type=2 — выживало только последнее значение.
Автор этой истории, мог бы просто ругаться на сырой релиз. Но его спас «правильно ленивый» тест, написанный ещё во времена Django 4.2.
Самое интересное здесь не сам баг, а то, как он был пойман:
1️⃣ Тест не вызывал метод модели напрямую, а проверял итоговый HTML через BeautifulSoup.
2️⃣ Когда-то в проекте был кастомный метод для формирования URL, который позже заменили на стандартный тег Django. Тест при этом не меняли — и он продолжил работать, проверяя именно то, что видит пользователь.
3️⃣ Если бы тест проверял только внутреннюю логику метода, он бы никогда не узнал, что обновление библиотеки сломало отображение на фронтенде.
💡 Выводы для нас:
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
🐍 Вышли Python 3.14.3 и 3.13.12
Это уже третий технический релиз в ветке 3.14. Внутри — почти 300 исправлений багов и доработок.
Но если вы пропустили старт 3.14, напомню, почему эта серия — большой шаг вперед:
📌 Free-threaded Python: Теперь «многопоточность без GIL» (Global Interpreter Lock) официально поддерживается. Это историческое событие для производительности.
📌 t-strings (PEP 750): Помните f-строки? Теперь появились t-строки для кастомной обработки строк.
📌 Zstandard в «коробке»: В стандартную библиотеку добавили модуль
📌 Улучшенный C API и JIT: Официальные сборки для Windows и macOS теперь включают экспериментальный JIT-компилятор.
А что с 3.13.12?
Это двенадцатое (!) техническое обновление ветки 3.13. Около 250 исправлений. Эта ветка сейчас считается «рабочей лошадкой» для тех, кому важна стабильность, но хочется использовать современные фичи (например, улучшенный REPL или официальную поддержку Android-сборок).
⚠️ Важный нюанс для Windows
Команда Python постепенно меняет привычный инсталлятор на новый Install Manager (можно взять в Windows Store). Старый добрый
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#свежак
Это уже третий технический релиз в ветке 3.14. Внутри — почти 300 исправлений багов и доработок.
Но если вы пропустили старт 3.14, напомню, почему эта серия — большой шаг вперед:
📌 Free-threaded Python: Теперь «многопоточность без GIL» (Global Interpreter Lock) официально поддерживается. Это историческое событие для производительности.
📌 t-strings (PEP 750): Помните f-строки? Теперь появились t-строки для кастомной обработки строк.
📌 Zstandard в «коробке»: В стандартную библиотеку добавили модуль
compression.zstd. Больше никаких лишних зависимостей для быстрой компрессии.📌 Улучшенный C API и JIT: Официальные сборки для Windows и macOS теперь включают экспериментальный JIT-компилятор.
А что с 3.13.12?
Это двенадцатое (!) техническое обновление ветки 3.13. Около 250 исправлений. Эта ветка сейчас считается «рабочей лошадкой» для тех, кому важна стабильность, но хочется использовать современные фичи (например, улучшенный REPL или официальную поддержку Android-сборок).
⚠️ Важный нюанс для Windows
Команда Python постепенно меняет привычный инсталлятор на новый Install Manager (можно взять в Windows Store). Старый добрый
.exe пока останется с нами в версиях 3.14 и 3.15, но пора потихоньку привыкать к новому инструменту.📍 Навигация: Вакансии • Задачи • Собесы
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5🎉2
🤖 7 библиотек Python для автоматизации
Вот ваш стартовый набор «ленивого» (читай: эффективного) разработчика:
🖱 Экран и ввод
PyAutoGUI — управление мышью и клавиатурой. Идеально для кликеров и заполнения форм в софте, где нет API.
Pyperclip — программная работа с буфером обмена. Можно встроить автозамену или парсинг текста прямо в Ctrl+C.
🌐 Веб и Сеть
Requests — база для работы с API. Скачать данные, проверить статус сервиса или отправить уведомление.
Selenium — полноценный контроль браузера. Поможет там, где нужно залогиниться, проскроллить страницу или нажать на хитрую кнопку.
📊 Таблицы и Файлы
Openpyxl — если нужно создавать или редактировать именно .xlsx файлы с формулами и стилями.
Shutil — ваш программный файловый менеджер. Копирование, перемещение и бэкап папок по расписанию.
⏱ Планирование
Schedule — простой и понятный планировщик. Превращает скрипт в мини-сервис, который сам запускает отчеты в 9:00 или чистит кэш каждый час.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Вот ваш стартовый набор «ленивого» (читай: эффективного) разработчика:
🖱 Экран и ввод
PyAutoGUI — управление мышью и клавиатурой. Идеально для кликеров и заполнения форм в софте, где нет API.
Pyperclip — программная работа с буфером обмена. Можно встроить автозамену или парсинг текста прямо в Ctrl+C.
🌐 Веб и Сеть
Requests — база для работы с API. Скачать данные, проверить статус сервиса или отправить уведомление.
Selenium — полноценный контроль браузера. Поможет там, где нужно залогиниться, проскроллить страницу или нажать на хитрую кнопку.
📊 Таблицы и Файлы
Openpyxl — если нужно создавать или редактировать именно .xlsx файлы с формулами и стилями.
Shutil — ваш программный файловый менеджер. Копирование, перемещение и бэкап папок по расписанию.
⏱ Планирование
Schedule — простой и понятный планировщик. Превращает скрипт в мини-сервис, который сам запускает отчеты в 9:00 или чистит кэш каждый час.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1🤔1
Курс «Разработка ИИ-агентов»: группа стартовала
Набор ещё открыт. Если сомневаетесь, потянет ли ваш стек или насколько актуальна программа — посмотрите первое занятие. Оно в свободном доступе.
Это не обучение промпт-инжинирингу. Это полноценный технический трек для Python-разработчиков по созданию автономных систем.
Что внутри:
— работа с фреймворками
— реализация мультиагентных паттернов и протоколов
— настройка
—
Для прохождения нужны уверенные знания Python (классы, асинхронность), опыт работы с REST API и понимание того, как работают эмбеддинги.
Записаться на курс
Смотреть первую лекцию
Набор ещё открыт. Если сомневаетесь, потянет ли ваш стек или насколько актуальна программа — посмотрите первое занятие. Оно в свободном доступе.
Это не обучение промпт-инжинирингу. Это полноценный технический трек для Python-разработчиков по созданию автономных систем.
Что внутри:
— работа с фреймворками
LangFlow, LangGraph, AutoGen;— реализация мультиагентных паттернов и протоколов
MCP / A2A;— настройка
RAG и интеграция векторных баз данных;—
AgentOps: мониторинг, оптимизация и безопасность решений.Для прохождения нужны уверенные знания Python (классы, асинхронность), опыт работы с REST API и понимание того, как работают эмбеддинги.
Записаться на курс
Смотреть первую лекцию
😁2
На собеседованиях по Python любят давать задачу: реализовать класс, который ведет себя как встроенный
range. ❌ В чем ошибка?
Чаще всего реализуют класс, который является одновременно и итерируемым объектом (`Iterable`), и итератором (`Iterator`):
class RangeLike:
def __init__(self, start, stop):
self.start, self.stop = start, stop
self.current = start
def __iter__(self):
return self # Возвращаем сам объект
def __next__(self):
if self.current < self.stop:
val = self.current
self.current += 1
return val
raise StopIteration
Проблема: При первом проходе
list(r) состояние self.current доходит до максимума. Так как объект «хранит» свой прогресс внутри себя, второй вызов вернет пустой список. Итераторы в Python — одноразовые.✅ Как сделать правильно?
Нужно разделить контейнер (который хранит границы) и итератор (который хранит текущее состояние обхода). При каждом вызове
__iter__ контейнер должен создавать новый экземпляр итератора:
class RangeIterator:
def __init__(self, start, stop):
self.current, self.stop = start, stop
def __iter__(self): return self
def __next__(self):
if self.current < self.stop:
val = self.current
self.current += 1
return val
raise StopIteration
class RangeLike:
def __init__(self, start, stop):
self.start, self.stop = start, stop
def __iter__(self):
# Каждый раз создаем свежий итератор
return RangeIterator(self.start, self.stop)
В Python существует четкое разделение ролей:
1. Iterable (Итерируемый объект): Это «записная книжка». В ней есть данные, но она не знает, на какой странице вы сейчас читаете. Пример:
list, dict, range.2. Iterator (Итератор): Это «палец», который указывает на текущую строку. У него есть состояние, и он движется только вперед.
Встроенный
range — это именно Iterable. Когда вы запускаете цикл for, Python вызывает iter(range_obj), который генерирует новый «палец»-итератор. Именно поэтому по range можно проходить бесконечное количество раз.💡 Лайфхак: Самый простой способ сделать объект ре-итерируемым в современном Python — использовать генератор внутри
__iter__:
def __iter__(self):
curr = self.start
while curr < self.stop:
yield curr
curr += 1
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2