Библиотека питониста | Python, Django, Flask
38.8K subscribers
3.1K photos
89 videos
55 files
4.78K links
Все самое полезное для питониста в одном канале.

Список наших каналов: https://t.me/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36

#WXSSA
Download Telegram
➡️ Python Set Methods — шпаргалка

Собрали все основные методы множеств в Python в одном компактном гайде.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔52🤩1
raise PriceIncrease(«Jan 20»)

Завтра стоимость всех программ Proglib.academy станет выше. Забирайте обучение сегодня по старому прайсу, пока конфиги не обновились.

Импортировать новые знания в бэкграунд
🥱32
👇 Как правильно типизировать декораторы в Python

Декораторы — штука мощная, но для типизации долгое время были настоящим кошмаром. Кажется логичным сказать: «декоратор принимает функцию и возвращает такую же функцию». На практике 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 — sys.remote_exec() превращает всё это в почти магию.

sys.remote_exec() позволяет выполнить Python-скрипт внутри уже запущенного процесса:
🔵 без перезапуска
🔵 с полным доступом к памяти, модулям и состоянию
🔵 прямо на лету

Идеально, чтобы вколоть debugpy в живое приложение.

И собственно, debugwand — zero-prep remote debugger для Python в контейнерах:
🔵 Находит нужный pod или контейнер
🔵 Выбирает правильный Python-процесс (учитывает `uvicorn --reload`)
🔵 Инжектит debugpy через sys.remote_exec()
🔵 Сам настраивает port-forwarding
🔵 Ты просто подключаешься из VS Code / nvim / любого DAP-клиента

Подключаешься к localhost:5679 — и у тебя полноценный дебаг: breakpoints, step-by-step, inspect variables.

📱 debugwand

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍153
This media is not supported in your browser
VIEW IN TELEGRAM
seapie: отладчик, где брейкпоинт — это просто `>>>`

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
👍72
This media is not supported in your browser
VIEW IN TELEGRAM
Создаём умного ассистента на Python: RAG vs Fine-tuning

23 января в 19:00 на открытом уроке к курсу «Разработка ИИ агентов» разберём, как научить LLM работать с вашим кодом и документацией. Обсудим, когда достаточно RAG, а когда не обойтись без дообучения модели, чтобы она понимала контекст проекта.

Занятие ведёт Игорь Стурейко, тимлид в «Газпроме» и эксперт с 20-летним опытом в ML. Игорь подготовил видеосообщение о том, как Python-разработчику перейти от написания простых скриптов к созданию сложных автономных агентов.

Технологический стек урока:

— библиотеки LangChain и LlamaIndex для оркестрации;
— векторные базы данных FAISS и Chroma;
— интеграция LLM в реальные бизнес-процессы.

📅 Когда: 23.01 в 19:00 МСК

Узнать подробности
🌚31
Как уменьшить память и ускорить доступ к атрибутам в Python-классах

По умолчанию каждый объект в 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
👍93
🖥 Топ-вакансий для питонистов за неделю

Если вы обещали себе найти новую работу после праздников — вот тот самый «после» 🙂

Python Developer — от 3 000 $, удалёнка

Python developer (SRE Agent), удалёнка

LLM Engineer (Python, RAG) — от 200 000 ₽, удалёнка

🔛 Еще больше топовых вакансий — в нашем канале Python jobs

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3👍1
🐼 Релиз: Pandas 3.0

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
👍115
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-устройствах.

📱 Проект

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
This media is not supported in your browser
VIEW IN TELEGRAM
Пятница, 19:00. Худшее время для деплоя, но идеальное, чтобы научить твой Python-скрипт извлекать знания из PDF и скармливать их нейронке.

Хватит скармливать LLM гигантские простыни текста в промптах. Пора строить нормальный `Python`-пайплайн с использованием RAG.

На открытом уроке мы разберём:

— использование LangChain и LlamaIndex для связки документов и модели;
— работу с векторными базами данных для быстрого поиска контекста;
— написание кода, который заставит бота отвечать на вопросы по вашим файлам.

Один из спикеров — Алексей Яндутов, ML-инженер в поиске Яндекса.

Это вводное занятие курса «Разработка AI-агентов». Без воды и маркетинговых обещаний. Только код.

Записаться на урок
1😁1
🧪 PyTest: как параметризовать тесты с исключениями

Иногда нужно прогнать разные входные данные и проверить, что в одних случаях код работает, а в других — выбрасывает нужное исключение.

✖️ Делать отдельный тест под каждый кейс — не всегда разумно.

Для этого удобно комбинировать 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


Подход простой:
🔵 если исключения не ожидается используется nullcontext
🔵 если ожидается — pytest.raises(...)
🔵 все сценарии живут в одном параметризованном тесте

Метод описан в документации PyTest и обсуждался на StackOverflow, но на практике о нём знают не все.

Хорошо подходит, когда:
🔵 проверки на исключения однотипные
🔵 не хочется раздувать тестовый набор
🔵 нужно аккуратно покрыть все ветки кода

nullcontext — не самая очевидная часть стандартной библиотеки, но алиас does_not_raise делает намерение теста понятным с первого взгляда.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍133
Скрипты копятся, а ты всё ещё вручную «жаришь» каждый вызов библиотеки?

Это работа в забегаловке. Настоящий Шеф не пишет однотипный код вечно — он проектирует Систему. 🐍

В понедельник, 26 января, стартует интенсив по разработке ИИ-агентов на Python. Мы научим создавать автономные решения, которые закроют бэклог, пока ты занимаешься архитектурой.

В программе:

— мультиагентные системы в CrewAI: делегирование задач и автоматическое ревью;
— сложная логика в LangGraph: управление состоянием и работа с графами;
tool use интеграция: подключение Python-агентов к твоим БД и внешним сервисам. 🍳

Записаться на курс
👍1
➡️ Бенчмарк Python API фреймворков: FastAPI vs Django vs Litestar

Свежий бенчмарк сравнивает основные Python API-фреймворки на реальных PostgreSQL-нагрузках, а не на синтетическом JSON. Сложные запросы, вложенные связи, корректный eager loading для каждого стека — всё как в проде.

➡️ Главный вывод довольно отрезвляющий:
разница в производительности схлопывается, как только появляется база данных.
Если на простом JSON разброс достигает ~20×, то на пагинации это уже ~1.7×, а на сложных запросах — всего ~1.3×.

➡️ При правильно оптимизированных запросах FastAPI, Django (DRF, Ninja, Bolt) и Litestar показывают почти одинаковые результаты. Бутылочное горлышко — Database I/O, а не сам фреймворк.

➡️ Тесты запускались в изолированных Docker-контейнерах с жёсткими лимитами по CPU и памяти, на разных продакшен-серверах (Uvicorn, Granian, Gunicorn). Это честное сравнение именно архитектурных различий, а не случайных настроек.

➡️ Bottom line простой:
для database-heavy API имеет смысл тратить время на оптимизацию запросов и моделей данных, а не на бесконечный выбор «самого быстрого» фреймворка — при нормальном коде они все почти равны.

🔗 Код, цифры и воспроизводимый сетап: https://clc.to/D47EDw

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍132
📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих»

Мы написали и собрали для вас в одну подборку все 25 глав и 230 практических заданий!

🐍 Часть 1: Особенности, сферы применения, установка, онлайн IDE
🐍 Часть 2: Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
🐍 Часть 3: Типы данных: преобразование и базовые операции
🐍 Часть 4: Методы работы со строками
🐍 Часть 5: Методы работы со списками и списковыми включениями
🐍 Часть 6: Методы работы со словарями и генераторами словарей
🐍 Часть 7: Методы работы с кортежами
🐍 Часть 8: Методы работы со множествами
🐍 Часть 9: Особенности цикла for
🐍 Часть 10: Условный цикл while
🐍 Часть 11: Функции с позиционными и именованными аргументами
🐍 Часть 12: Анонимные функции
🐍 Часть 13: Рекурсивные функции
🐍 Часть 14: Функции высшего порядка, замыкания и декораторы
🐍 Часть 15: Методы работы с файлами и файловой системой
🐍 Часть 16: Регулярные выражения
🐍 Часть 17: Основы скрапинга и парсинга
🐍 Часть 18: Основы ООП – инкапсуляция и наследование
🐍 Часть 19: Основы ООП – абстракция и полиморфизм
🐍 Часть 20: Графический интерфейс на Tkinter
🐍 Часть 21: Основы разработки игр на Pygame
🐍 Часть 22: Основы работы с SQLite
🐍 Часть 23: Основы веб-разработки на Flask
🐍 Часть 24: Основы работы с NumPy
🐍 Часть 25: Основы анализа данных с Pandas
1👍2
📱 Python новости за последние 7 дней

Flask в 2025: итоги года и состояние экосистемы
Жив ли Flask в эпоху FastAPI? Короткий ответ — да. Длинный — экосистема стала спокойнее, взрослее и менее хайповой.

Claude Code в 2026: гайд для тех, кто ещё пишет код руками
Немного провокационный, но полезный материал о том, как ИИ меняет процесс разработки. После прочтения хочется либо уволиться, либо автоматизировать всё подряд.

CPython — сборка мусора изнутри
Для тех, кто любит знать, что именно происходит под капотом.

Собираем LLM-агента на Python
Практический гайд по созданию AI-агента без лишней теории.

Pandas 3.0 — релиз
21 января 2026 вышел pandas 3.0 — большой апдейт с важными архитектурными изменениями. Обновляться стоит, но сначала лучше прочитать, что именно поменяли, чтобы потом не удивляться внезапным багам.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
Завтра стартуем: курс по разработке ИИ-агентов на Python 🐍

Хватит писать однотипные скрипты — начните проектировать автономные системы. Мы разберём создание мультиагентных связок на CrewAI, стейт-менеджмент в LangGraph и интеграцию агентов с API и базами данных.

👉 Успейте занять место до начала занятий
😁3