This media is not supported in your browser
VIEW IN TELEGRAM
😎 Ansible, но на Python и без боли
pyinfra позволяет писать инфраструктурный код на обычном Python, а под капотом он превращает его в shell-команды и выполняет на серверах. Можно запускать ad-hoc команды или описывать декларативные операции. Работает по SSH, локально и с Docker-контейнерами. Масштабируется от одного сервера до тысяч — и делает это быстро.
✔️ По ощущениям это «Ansible, каким он мог бы быть», если бы сразу проектировался под производительность и удобство разработчика. Выполнение предсказуемое и быстрое, вывод stdout/stderr видно в реальном времени (дебаг наконец-то не боль), операции идемпотентны — есть diff и dry-run до применения изменений.
✔️ Отдельный плюс — это всё ещё Python. Можно тянуть любые библиотеки из экосистемы, писать свою логику без костылей и расширять систему как обычный код. Никаких агентов на серверах — только shell-доступ. Есть интеграции с Docker, Terraform, Vagrant и другими инструментами.
📱 Github
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
pyinfra позволяет писать инфраструктурный код на обычном Python, а под капотом он превращает его в shell-команды и выполняет на серверах. Можно запускать ad-hoc команды или описывать декларативные операции. Работает по SSH, локально и с Docker-контейнерами. Масштабируется от одного сервера до тысяч — и делает это быстро.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3
Если коротко: библиотеку packaging, на которой держится pip и почти весь Python-экосистемный тулчейн, разогнали в 2–5 раз. Без переписывания на C, без магии — чистый Python, профилирование и много аккуратной инженерной работы.
Автор статьи вместе с мейнтейнерами pip разобрал самые горячие места: парсинг версий (PEP 440), SpecifierSet, маркеры, Requirement, canonicalize_name. Оказалось, что узкие места — не только regex, но и куча «мелочей»: лишние NamedTuple, повторное создание Version, singledispatch там, где нужен обычный if, генераторы вместо map, regex там, где хватит str.translate.
Результат:
– создание Version — до 2× быстрее
– SpecifierSet.contains — больше 2×
– SpecifierSet.filter — до 5×
– pip-резолвер создаёт в 10+ раз меньше объектов Version
– установка пакетов и резолв зависимостей ощутимо ускоряются «бесплатно» для всех
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4❤🔥1🔥1🤩1
«Этот манёвр будет стоить нам 51 год...»
— или потерю возможности войти в
До понедельника в Proglib Academy сохраняются старые цены на всё обучение:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Выбрать курс
⚠️ Стоимость вырастет 19 января
— или потерю возможности войти в
AI на выгодных условиях. Рынок Python-разработки смещается в сторону нейронок и агентов. Если вы всё ещё не разобрались в математике или архитектуре — пора начинать.До понедельника в Proglib Academy сохраняются старые цены на всё обучение:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Выбрать курс
⚠️ Стоимость вырастет 19 января
❤4😁4🥱2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13❤2💯1👾1
Вышла Python 3.15.0a5 — внеплановый, но важный релиз. Предыдущую альфу случайно собрали не из того снапшота репозитория, поэтому разработчики выпустили дополнительную сборку уже с корректной базой от 14 января 2026.
Что особенно интересно в ветке 3.15:
— +4–5% на x86-64 Linux
— +7–8% на macOS AArch64
Это уже не эксперимент ради галочки, а реальное ускорение интерпретатора.
📆 Следующая альфа (3.15.0a6) запланирована на 10 февраля.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤4🤩2
Python 3.15 уже здесь (alpha 5)
Вышла Python 3.15.0a5 — внепланово, но по уважительной причине: предыдущую альфу собрали не из того снапшота репозитория. Новый билд уже основан на корректной версии от 14 января 2026.
Anthropic инвестирует в безопасность Python
$1.5 млн в Python Software Foundation на два года — и не абстрактно «на развитие», а именно на безопасность экосистемы.
Парсинг сайтов на Python с BeautifulSoup
Классический стек, который до сих пор работает. Хороший вводный материал для тех, кто хочет понять, как аккуратно доставать данные, а не просто копировать чужой код.
Отладка Python-приложения в Docker из VS Code
Тот самый навык, который нужен сразу, а гуглится обычно в панике. Практичный гайд без лишней теории.
Python без Python: как запускать код где угодно
Про упаковку, окружения и способы избавиться от вечного «а у меня не запускается».
Что такое классы в Python на примере 3D-игры
Редкий случай, когда ООП объясняют не через «котиков и собачек», а через что-то реально интересное. Подойдёт и новичкам, и тем, кто хочет освежить базу.
Скрытая цена словарей Python и более безопасные альтернативы
dict — наше всё, но не всегда бесплатно. Хороший разбор, где словари начинают кусаться по памяти и поведению.
Pydantic vs Adaptix
Сравнение двух подходов к валидации и сериализации данных.
📍 Навигация: Вакансии • Задачи • Собесы
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
Собрали все основные методы множеств в Python в одном компактном гайде.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔5❤2🤩1
raise PriceIncrease(«Jan 20»)Завтра стоимость всех программ Proglib.academy станет выше. Забирайте обучение сегодня по старому прайсу, пока конфиги не обновились.
Импортировать новые знания в бэкграунд
🥱3❤2
Декораторы — штука мощная, но для типизации долгое время были настоящим кошмаром. Кажется логичным сказать: «декоратор принимает функцию и возвращает такую же функцию». На практике mypy отвечает ошибками, потому что wrapper теряет исходную сигнатуру.
Вот как обычно пытаются сделать (и почему это ломается):
from functools import wraps
from typing import Any, Callable, TypeVar
F = TypeVar("F", bound=Callable[..., Any])
def info(func: F) -> F:
@wraps(func)
def wrapper(*args: Any, **kwargs: Any) -> Any:
print(func.__name__)
return func(*args, **kwargs)
return wrapper # mypy: incompatible return type
Типизатор видит, что
wrapper — это уже другая функция с Callable[..., Any], а не тот же F.Правильное современное решение —
ParamSpec, который сохраняет параметры исходной функции:
from functools import wraps
from typing import Callable, ParamSpec, TypeVar
P = ParamSpec("P")
R = TypeVar("R")
def info(func: Callable[P, R]) -> Callable[P, R]:
@wraps(func)
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
print(func.__name__)
print(func.__doc__)
return func(*args, **kwargs)
return wrapper
Теперь сигнатура полностью «протаскивается» через декоратор и mypy счастлив.
А в Python 3.12+ это стало ещё красивее благодаря PEP 695:
from functools import wraps
from typing import Callable
def info[**P, R](func: Callable[P, R]) -> Callable[P, R]:
@wraps(func)
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
print(func.__name__)
print(func.__doc__)
return func(*args, **kwargs)
return wrapper
Без лишних объявлений, всё читается почти как generics в статически типизированных языках.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🌚1
🪄 Самая крутая фича Python 3.14 — удалённый дебаг без подготовки
Отладка Python-приложений в Docker и Kubernetes — боль.
Новая фича Python 3.14 —
🔵 без перезапуска
🔵 с полным доступом к памяти, модулям и состоянию
🔵 прямо на лету
Идеально, чтобы вколоть debugpy в живое приложение.
И собственно, debugwand — zero-prep remote debugger для Python в контейнерах:
🔵 Находит нужный pod или контейнер
🔵 Выбирает правильный Python-процесс (учитывает `uvicorn --reload`)
🔵 Инжектит
🔵 Сам настраивает port-forwarding
🔵 Ты просто подключаешься из VS Code / nvim / любого DAP-клиента
Подключаешься к
📱 debugwand
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Отладка Python-приложений в Docker и Kubernetes — боль.
Новая фича Python 3.14 —
sys.remote_exec() превращает всё это в почти магию.sys.remote_exec() позволяет выполнить Python-скрипт внутри уже запущенного процесса:Идеально, чтобы вколоть debugpy в живое приложение.
И собственно, debugwand — zero-prep remote debugger для Python в контейнерах:
debugpy через sys.remote_exec()Подключаешься к
localhost:5679 — и у тебя полноценный дебаг: breakpoints, step-by-step, inspect variables.📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤3
This media is not supported in your browser
VIEW IN TELEGRAM
seapie: отладчик, где брейкпоинт — это просто `>>>`
seapie — это отладчик, который думает как человек, а не как учебник по gdb.
Без зависимостей, ставится одной командой и превращает отладку в обычный Python-REPL:
Идея радикально простая:
брейкпоинт — это не клик мышкой и не спец-синтаксис, а обычный интерактивный
✔️ В seapie много подсказок, понятные ошибки и встроенная помощь, до которой можно дотянуться в любой момент.
✔️ Во-вторых, отладка через намерение, а не шаги.
seapie позволяет сказать: «остановись, когда функция вернёт None и в стеке будет myhelper» — обычным Python-выражением:
✔️ В-третьих, REPL-first по-настоящему.
Посмотреть переменную — это
Поменять —
Команды отладчика живут рядом и не ломают мышление.
А состояние программы — это обычный словарь:
👉 Github
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
seapie — это отладчик, который думает как человек, а не как учебник по gdb.
Без зависимостей, ставится одной командой и превращает отладку в обычный Python-REPL:
pip install seapie
Идея радикально простая:
брейкпоинт — это не клик мышкой и не спец-синтаксис, а обычный интерактивный
>>>.✔️ В seapie много подсказок, понятные ошибки и встроенная помощь, до которой можно дотянуться в любой момент.
✔️ Во-вторых, отладка через намерение, а не шаги.
seapie позволяет сказать: «остановись, когда функция вернёт None и в стеке будет myhelper» — обычным Python-выражением:
>>> !walk (_event_ == "return") and (_return_ is None) and ("myhelper" in _callstack_)
✔️ В-третьих, REPL-first по-настоящему.
Посмотреть переменную — это
print(x) или просто x.Поменять —
x = None.Команды отладчика живут рядом и не ломают мышление.
А состояние программы — это обычный словарь:
>>> _magic_
{
'_line_': 8,
'_source_': ' return round(total_with_tax, 2)',
'_path_': '/home/hirsimak/seapie/test/demo.py',
'_return_': 35.64,
'_exception_': None,
'_event_': 'return',
'_callstack_': ['<module>', 'checkout']
}
👉 Github
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21👍4🤩1
This media is not supported in your browser
VIEW IN TELEGRAM
Создаём умного ассистента на Python: RAG vs Fine-tuning
23 января в 19:00 на открытом уроке к курсу «Разработка ИИ агентов» разберём, как научить LLM работать с вашим кодом и документацией. Обсудим, когда достаточно
Занятие ведёт Игорь Стурейко, тимлид в «Газпроме» и эксперт с 20-летним опытом в ML. Игорь подготовил видеосообщение о том, как Python-разработчику перейти от написания простых скриптов к созданию сложных автономных агентов.
Технологический стек урока:
— библиотеки
— векторные базы данных
— интеграция LLM в реальные бизнес-процессы.
📅 Когда: 23.01 в 19:00 МСК
Узнать подробности
23 января в 19:00 на открытом уроке к курсу «Разработка ИИ агентов» разберём, как научить LLM работать с вашим кодом и документацией. Обсудим, когда достаточно
RAG, а когда не обойтись без дообучения модели, чтобы она понимала контекст проекта.Занятие ведёт Игорь Стурейко, тимлид в «Газпроме» и эксперт с 20-летним опытом в ML. Игорь подготовил видеосообщение о том, как Python-разработчику перейти от написания простых скриптов к созданию сложных автономных агентов.
Технологический стек урока:
— библиотеки
LangChain и LlamaIndex для оркестрации;— векторные базы данных
FAISS и Chroma;— интеграция LLM в реальные бизнес-процессы.
📅 Когда: 23.01 в 19:00 МСК
Узнать подробности
🌚3❤1
По умолчанию каждый объект в Python хранит атрибуты в
__dict__.Гибко — да. Эффективно — не всегда:
class Point:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
p = Point(1, 2, 3)
print(p.__dict__)
# {'x': 1, 'y': 2, 'z': 3}
У каждого экземпляра — свой словарь. Добавили
p.w = 4 — словарь вырос:
p.w = 4
print(p.__dict__)
# {'x': 1, 'y': 2, 'z': 3, 'w': 4}
🚫 Но если структура объекта фиксированная, мы платим лишнюю цену за эту гибкость.
Решение:
__slots__:
class Point:
__slots__ = ('x', 'y', 'z')
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
Поведение меняется:
p = Point(1, 2, 3)
p.x = 10 # ок
p.w = 4 # ❌ AttributeError
И главное:
p.__dict__
# ❌ AttributeError: object has no attribute '__dict__'
Что меняется:
__dict__Python хранит значения в компактной структуре, а не в словаре.
Используйте __slots__, если:
Не стоит, если:
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3
Если вы обещали себе найти новую работу после праздников — вот тот самый «после»
Python Developer — от 3 000 $, удалёнка
Python developer (SRE Agent), удалёнка
LLM Engineer (Python, RAG) — от 200 000 ₽, удалёнка
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3👍1
Forwarded from Библиотека дата-сайентиста | Data Science, Machine learning, анализ данных, машинное обучение
21 января 2026 вышел pandas 3.0.
Вот что реально стоит знать 👇
✔️ Строки теперь — не
objectРаньше строки в pandas =
object.Туда можно было засунуть что угодно. Медленно. Неявно. Больно.
Теперь по умолчанию:
pd.Series(["a", "b"]).dtype
# str
Что это даёт:
— dtype только для строк
— единая семантика пропусков (`NaN`)
— лучше память и производительность
Это давно назревшее исправление архитектурной ошибки.
✔️ Copy-on-Write: конец адскому chained assignment
Главное правило pandas 3.0: любой срез — ведёт себя как копия:
df2 = df[df.a > 0]
df2["b"] = 10 # больше НИКОГДА не меняет df
Что изменилось:
—
SettingWithCopyWarning — удалён— «а тут view или copy?» — больше нет
— модифицируешь объект → модифицируй его напрямую
Под капотом pandas всё ещё оптимизирует память. Но API теперь честный.
✔️
pd.col() — выражения без лямбдБыло:
df.assign(c=lambda df: df.a + df.b)
Стало:
df.assign(c=pd.col("a") + pd.col("b"))
✔️ Arrow C Interface — zero-copy будущее
Pandas теперь:
— умеет принимать Arrow-таблицы
— умеет отдавать их без копирования
df.__arrow_c_stream__()
✔️ Новый порядок депрекейтов
Теперь всё прозрачно:
—
Pandas4Warning → сломается в 4.0—
Pandas5Warning → сломается в 5.0⚠️ Совет: обновитесь сначала до 2.3, уберите warning’и — и только потом идите в 3.0.
🔗 Ссылка на релиз
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤5
This media is not supported in your browser
VIEW IN TELEGRAM
🤖 LFM2.5-1.2B-Thinking — бронирует билеты сам
Небольшой Python CLI, который ищет и бронирует авиабилеты через tool calling и reasoning.
✍️ Просто пишешь: «найди самый дешёвый рейс из Барселоны в Белград на 2026-01-31» — и агент сам разбивает задачу на шаги и решает её.
Проект — демо возможностей LFM2.5-1.2B-Thinking: маленькой, но умной модели, заточенной под логические задачи, цепочки действий и вызов инструментов.
👌 И да — она может работать на edge-устройствах.
📱 Проект
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Небольшой Python CLI, который ищет и бронирует авиабилеты через tool calling и reasoning.
✍️ Просто пишешь: «найди самый дешёвый рейс из Барселоны в Белград на 2026-01-31» — и агент сам разбивает задачу на шаги и решает её.
Проект — демо возможностей LFM2.5-1.2B-Thinking: маленькой, но умной модели, заточенной под логические задачи, цепочки действий и вызов инструментов.
👌 И да — она может работать на edge-устройствах.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Пятница, 19:00. Худшее время для деплоя, но идеальное, чтобы научить твой Python-скрипт извлекать знания из PDF и скармливать их нейронке.
Хватит скармливать LLM гигантские простыни текста в промптах. Пора строить нормальный `Python`-пайплайн с использованием RAG.
На открытом уроке мы разберём:
— использование
— работу с векторными базами данных для быстрого поиска контекста;
— написание кода, который заставит бота отвечать на вопросы по вашим файлам.
Один из спикеров — Алексей Яндутов, ML-инженер в поиске Яндекса.
Это вводное занятие курса «Разработка AI-агентов». Без воды и маркетинговых обещаний. Только код.
Записаться на урок
Хватит скармливать LLM гигантские простыни текста в промптах. Пора строить нормальный `Python`-пайплайн с использованием RAG.
На открытом уроке мы разберём:
— использование
LangChain и LlamaIndex для связки документов и модели;— работу с векторными базами данных для быстрого поиска контекста;
— написание кода, который заставит бота отвечать на вопросы по вашим файлам.
Один из спикеров — Алексей Яндутов, ML-инженер в поиске Яндекса.
Это вводное занятие курса «Разработка AI-агентов». Без воды и маркетинговых обещаний. Только код.
Записаться на урок
❤1😁1
🧪 PyTest: как параметризовать тесты с исключениями
Иногда нужно прогнать разные входные данные и проверить, что в одних случаях код работает, а в других — выбрасывает нужное исключение.
✖️ Делать отдельный тест под каждый кейс — не всегда разумно.
Для этого удобно комбинировать
Подход простой:
🔵 если исключения не ожидается — используется
🔵 если ожидается —
🔵 все сценарии живут в одном параметризованном тесте
Метод описан в документации PyTest и обсуждался на StackOverflow, но на практике о нём знают не все.
Хорошо подходит, когда:
🔵 проверки на исключения однотипные
🔵 не хочется раздувать тестовый набор
🔵 нужно аккуратно покрыть все ветки кода
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Иногда нужно прогнать разные входные данные и проверить, что в одних случаях код работает, а в других — выбрасывает нужное исключение.
✖️ Делать отдельный тест под каждый кейс — не всегда разумно.
Для этого удобно комбинировать
pytest.mark.parametrize с contextlib.nullcontext:
from contextlib import nullcontext as does_not_raise
import pytest
from pytest import raises
@pytest.mark.parametrize(
["x", "y", "expectation"],
[
(3, 2, does_not_raise()),
(0, 1, does_not_raise()),
(1, 0, raises(ZeroDivisionError)),
(1, "0", raises(TypeError)),
],
)
def test_division(x, y, expectation):
with expectation:
x / y
Подход простой:
nullcontextpytest.raises(...)Метод описан в документации PyTest и обсуждался на StackOverflow, но на практике о нём знают не все.
Хорошо подходит, когда:
nullcontext — не самая очевидная часть стандартной библиотеки, но алиас does_not_raise делает намерение теста понятным с первого взгляда.📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3