Библиотека питониста | Python, Django, Flask
38.4K subscribers
3.14K photos
92 videos
56 files
4.83K links
Все самое полезное для питониста в одном канале.

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

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

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

#WXSSA
Download Telegram
📱 Python новости за последние 7 дней

📊 Pandas: от CSV до продвинутой аналитики за одну статью
Большой разбор по pandas — от чтения CSV до группировок, агрегаций и более сложной аналитики. Хороший материал, чтобы систематизировать базу.

🏆 Сделка с совестью на хакатоне: как победить с нерабочим кодом?
Живая история команды, которая выиграла хакатон, несмотря на технические проблемы. Много инсайтов про презентацию, стратегию и то, как на самом деле оцениваются проекты.

🎭 Декораторы в Python — просто о сложном
Разбор декораторов в Python — от объяснения для новичков до чуть более продвинутых кейсов.

🤔 Python уже не торт?
Размышления о том, как меняются приоритеты разработчиков и почему вокруг Python стало больше дискуссий.

💾 Работа с объёмными данными в Python для начинающих
Вводный материал про обработку больших данных в Python: базовые подходы, инструменты и ограничения.

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤩1
🏭 Паттерн «Фабрика» в Python: как перестать плодить спагетти-код

Если в вашем коде то и дело встречаются бесконечные цепочки if-elif-else для создания разных объектов, пришло время познакомиться с Factory Pattern. Это один из самых полезных порождающих паттернов, который берет на себя всю грязную работу по созданию экземпляров классов.

💡 В чем суть

Вместо того чтобы вызывать конструктор класса напрямую (`EmailNotifier()`), вы обращаетесь к специальному методу-фабрике. Он сам решает, какой объект создать, основываясь на входных данных или конфигурации.

Представьте ресторан: вы не идете на кухню готовить блюдо сами (не создаете объект). Вы делаете заказ официанту (фабрике), и кухня возвращает вам готовый результат, не нагружая вас деталями рецепта.

3 способа сделать вашу фабрику лучше:
1. Словари вместо if-elif: Чтобы код не превращался в «лесенку», используйте словарь, где ключи — это типы, а значения — сами классы.
2. Передача параметров: Хорошая фабрика умеет не только создавать объект, но и сразу прокидывать в него нужные настройки (например, заголовок документа или автора).
3. Абстрактные базовые классы (ABC): Используйте модуль abc, чтобы гарантировать, что все объекты, созданные фабрикой, имеют одинаковый набор методов (например, send() или `connect()`).

🛠 Реальный пример: Фабрика подключений к БД

Это, пожалуй, самый практичный кейс. Вы можете создать метод create_from_config(config), который сам поймет, нужно ли подключаться к MySQL, PostgreSQL или SQLite, просто прочитав файл настроек.


# Пример вызова
db = DatabaseFactory.create_from_config(production_config)
print(db.connect())



Когда использовать:
🔛 Когда у вас много родственных классов с общим интерфейсом.
🔛 Когда решение о том, какой класс создать, принимается только в момент работы программы (runtime).
🔛 Когда процесс создания объекта слишком сложен и вы хотите скрыть эту логику.

🔗 Полный гайд с примерами кода:

А вы используете паттерны в своих проектах или считаете их лишней абстракцией для Python?

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
7👏4👍2
🏎 Юнит-тестирование производительности: ловим регрессии по числу инструкций CPU

Бенчмарки в CI — это отлично, но они сообщают о проблеме слишком поздно. Идеально было бы получать сигнал о том, что код стал работать медленнее, прямо во время запуска локальных тестов. Но как сделать это стабильным, если время выполнения (`elapsed time`) постоянно скачет?

Автор в статье предлагает использовать количество инструкций CPU вместо времени.

Если вы изменили код, количество инструкций CPU (почти всегда) изменится:
🔛 Это не гарантирует, что код стал медленнее (влияют кэши, предсказания переходов и т.д.), но это верный признак того, что производительность могла измениться.
🔛 Это дает гораздо более стабильные цифры, чем замер времени, особенно на одной и той же машине.

Для Linux можно использовать библиотеку py-perf-event, которая дает доступ к системному вызову perf_event_open().

Пример теста:

from py_perf_event import measure, Hardware
from wordcount import wordcount

def test_speed():
[instruction_count] = measure(
[Hardware.INSTRUCTIONS],
wordcount,
DATA
)
# Сравниваем с эталоном (округление помогает избежать шума)
assert round(instruction_count / 100_000) == 3127, "Скорость изменилась!"



Чтобы добиться идеальной точности, можно:
1. Фиксировать PYTHONHASHSEED: чтобы рандом в хешировании словарей не влиял на проход по коду.
2. Отключать ASLR (рандомизацию адресного пространства): через команду setarch x86_64 -R pytest.
3. Использовать один и тот же билд Python: например, через uv python install.

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
🐍 `__str__` vs `__repr__`: два лица одного объекта

Вы наверняка видели это в консоли: <__main__.Point object at 0x10f3a2c50>.

Это стандартный ответ Python, который абсолютно бесполезен и для пользователя, и для разработчика при отладке.

Но в Python есть два метода, которые превращают этот «мусор» в понятные данные.

🔹 __str__() — Для людей

Этот метод вызывается функциями print() и str(). Его цель — выдать максимально чистое, красивое и читаемое описание объекта.

🔹 __repr__() — Для разработчиков

Этот метод вызывается в REPL-консоли, отладчиках и внутри коллекций (например, когда вы печатаете список объектов). Его цель — однозначность.

Идеальный __repr__ должен выглядеть как код, который можно скопировать и вставить, чтобы воссоздать этот же объект.

Золотое правило реализации:
1. Всегда реализуйте __repr__()**. Если вы не определили __str__, Python автоматически использует __repr__ как запасной вариант.
2. Добавляйте __str__() только тогда, когда вам нужно «причесать» вывод для конечного пользователя.

Реальный пример (Data Model):

class Product:
def __init__(self, name, price):
self.name = name
self.price = price

def __repr__(self):
# Однозначно: имя класса и параметры
return f"Product(name='{self.name}', price={self.price})"

def __str__(self):
# Красиво: только для пользователя
return f"{self.name} — всего за {self.price}₽"

p = Product("Кофе", 250)
print(p) # Вывод: Кофе — всего за 250₽
print(repr(p)) # Вывод: Product(name='Кофе', price=250)


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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5
🛠 Git Submodules: как не плодить копипасту в ML-проектах

Представьте: у вас три команды (Fraud Detection, Credit Scoring и Trading). Всем им нужна одна и та же функция calculate_risk_score().

Обычно это превращается в кошмар:
1. Команды копируют код себе.
2. Одна команда находит баг и исправляет его.
3. Остальные два проекта остаются с багами, потому что даже не знают об исправлении.

Итог: «расползание» версий (version drift) и ошибки в продакшене.

Решение: Git Submodules

Это способ вставить одну Git-репозиторий внутрь другого как подпапку. Вы не копируете код, а ссылаетесь на конкретный коммит в общем репозитории библиотек.

🚀 Шпаргалка по командам

1. Добавить общую библиотеку в проект:

git submodule add https://github.com/user/ml-utils.git ml-utils



Это создаст папку ml-utils/ и файл .gitmodules, где прописана ссылка на репозиторий.

2. Клонировать проект со всеми зависимостями:

Если вы просто сделаете git clone, папка с сабмодулем будет пустой. Нужно так:

git clone --recurse-submodules https://github.com/user/main-project.git



3. Обновить общие утилиты до последней версии:

git submodule update --remote ml-utils
git add ml-utils
git commit -m "Update shared ML utils"


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

🐸 Библиотека дата-сайентиста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🥰2
🛡 Вышел Python 3.10.20 (Security Release)

Если ваши проекты всё ещё крутятся на ветке 3.10, пришло время обновиться.

Вчера, 3 марта 2026 года, вышел критический патч безопасности для серии 3.10.

Разработчики закрыли сразу несколько серьезных дыр, которые могли привести к инъекциям и отказам в обслуживании (DoS):


🔛 Исправлены ошибки в email.generator, которые позволяли подделывать заголовки писем.
🔛 Обновлена библиотека libexpat до версии 2.7.4. Это защита от вредоносных XML-файлов, которые могли переполнить память сервера.
🔛 Модули http.cookies и wsgiref теперь жестко блокируют управляющие символы, предотвращая манипуляции с заголовками.
🔛 Исправлены критические ошибки «use-after-free» в модуле ssl и при сравнении списков, которые могли привести к падению интерпретатора или выполнению произвольного кода.

Если вы до сих пор на 3.10 — это серьезный повод запланировать миграцию на Python 3.14 (текущий стабильный релиз). В новых версиях не только безопаснее, но и значительно быстрее.


🔗 Полный чейнджлог: https://clc.to/9505nQ

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103
🐍 Лексикографический порядок в Python

Почему в Python "apple" > "animal" возвращает True, а "Apple" < "apple" — тоже True? Всё дело в лексикографическом порядке.

Python не просто знает алфавит, он смотрит на Unicode-код каждого символа.

Сравнение идет посимвольно: первая пара, вторая и т.д.
Как только найдено различие — результат готов.
Если одна строка — префикс другой (напр. "cat" и `"catastrophe"`), то та, что короче, считается «меньшей».

Любая последовательность в Python (списки, кортежи, байтовые строки) сравнивается точно так же — индекс за индексом.

Пример с кортежами:


x = (45, 1, 13)
y = (45, 7, 4)
print(x < y) # True, потому что на индексе [1] единица меньше семерки.



Это свойство Python безумно полезно, когда нужно отсортировать данные по нескольким критериям сразу. Просто упакуйте их в кортежи.

Пример: Сортируем студентов по году выпуска, а затем по фамилии:

students = [
(1978, "Little"),
(1978, "Gonzalez"),
(1977, "Anders"),
]


Python сначала сравнит годы, а при равенстве — фамилии sorted_students = sorted(students)
Результат: Anders (1977), затем Gonzalez (1978), затем Little (1978)

Главные выводы:
1. Заглавные буквы в Unicode идут раньше строчных. Чтобы сортировка была честной, используйте .lower().
2. Вы не можете сравнить список и кортеж или строку и число — Python выдаст TypeError.
3. Если нужно отсортировать объекты по приоритету, создайте список кортежей (приоритет, объект).

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
⚡️ Google представил CEL-expr-python: мощный язык правил теперь нативно в Python

Google официально открыл исходный код CEL-expr-python — реализации Common Expression Language (CEL) для Python.

Если вы строите системы, где нужно безопасно вычислять условия «на лету» (например, правила доступа или валидацию данных), этот инструмент станет вашим фаворитом.

CEL (Common Expression Language) — это не-Тьюринг-полный язык выражений. Он специально создан простым, быстрым и, главное, безопасным. В отличие от обычного eval(), CEL гарантирует отсутствие побочных эффектов и всегда завершает выполнение.


💎 Вы можете позволить пользователям писать свои правила (фильтры, политики доступа) и не бояться, что они «положат» сервер бесконечным циклом или украдут данные.
💎 Библиотека написана как обертка над официальной реализацией на C++. Это значит, что вы получаете максимальную производительность и 100% совместимость со стандартами Google.
💎 Выражение, написанное для Python, будет работать точно так же в Go или C++ сервисах.

Где это использовать:
1. Написание гибких правил RBAC/ABAC.
2. Проверка сложных условий, которые приходят из конфигов или БД.
3. Если нужно дать пользователю возможность самому настраивать логику фильтрации в UI.

Пример кода:

from cel_expr_python import cel

# Создаем среду и объявляем переменные
env = cel.NewEnv(variables={"age": cel.Type.INT})

# Компилируем условие
expr = env.compile("age >= 18 ? 'Доступ разрешен' : 'Доступ запрещен'")

# Вычисляем
print(expr.eval(data={"age": 21})) # Доступ разрешен



🔗 Репозиторий

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
This media is not supported in your browser
VIEW IN TELEGRAM
👍 На курсе по контролируемой разработке AI-агентов мы будем разбирать ровно то, о чём говорит Владислав в голосовом, но уже в формате системной практики.

📅 Старт курса — 20 апреля.

Если хотите разобраться, как строить управляемые агентные системы:
➡️ Присоединяйтесь.

P.S. С первого занятия будет практика: код и разбор реальных ошибок, а не только теория.
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🚪 Knock-Knock: кто стучится в мой SSH

Проект Knock-Knock — это стильный и информативный дашборд-медоед (honeypot), который в реальном времени визуализирует атаки на ваш SSH-порт. Вместо скучных логов вы получаете живую ленту «стуков» со всеми подробностями.

Что можно увидеть на дашборде:
— Live Feed: поток попыток входа с указанием логина, пароля, IP и провайдера атакующего.
— 3D-Глобус: визуализация локации последнего «стука» и тепловая карта стран-агрессоров.
— Стена позора (Leaderboards): топы самых популярных паролей, логинов и наглых ISP.

Архитектура проекта проста и эффективна:
1. Honeypot (Python): слушает порт 22 и перехватывает данные.
2. Monitor: обогащает IP данными GeoIP (город, страна, провайдер).
3. Backend (FastAPI + Redis): хранит статистику в SQLite и транслирует живые события через WebSockets.
4. Frontend: адаптивный дашборд, который отлично работает и на десктопе, и на мобилках.

🔗 Демо в реальном времени: https://clc.to/P8C1mw
📂 GitHub проекта: https://clc.to/cjZX7Q

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
🔍 Сравнение тайп-чекеров: как они «видят» пустые списки

Когда вы пишете x = [], интерпретатор Python знает, что это список, но не знает, что в нем будет лежать. Разные тайп-чекеры решают эту загадку по-разному.

Стратегия 1: Все дозволено (`Any`)

Кто использует: Pyright, Pyre, Ty.
Как работает: Тайп-чекер просто помечает список как list[Any].

Плюс: Минимум ложных ошибок. Можно класть что угодно.
Минус: Нулевая безопасность. Ошибки (например, добавление списка вместо строки) проскочат в продакшен и вызовут краш в рантайме.

Стратегия 2: Анализ всех использований

Кто использует: Pytype.
Как работает: Чекер смотрит на весь код функции. Если вы добавили в список 1, а потом "foo", он выведет тип list[int | str].

Плюс: Максимально близко к поведению Python в рантайме.
Минус: Если ошибка закралась в начале функции, тайп-чекер может подсветить её только в самом конце (на `return`), что затрудняет отладку.

Стратегия 3: Вывод по первому использованию

Кто использует: Mypy, Pyrefly (по умолчанию).
Как работает: Тип фиксируется по первой операции append или add.

Пример: Если сначала добавили число, а потом пытаетесь добавить строку — вы получите ошибку сразу на строке с кодом.
Плюс: Ошибки подсвечиваются именно там, где они возникли. Это делает их максимально понятными и легко исправимыми.

🔗 Полный текст статьи


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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
🐼 Pandas: 4 фатальные ошибки, которые делают 51% разработчиков

Даже в 2026 году Pandas остается главной «головной болью» Python-разработчика. С выходом версий 2.x и 3.x правила игры изменились.

1. Итерация по строкам

iterrows() — забудьте о нем. Он конвертирует каждую строку в pd.Series, создавая дикий overhead.
itertuples() — если цикл неизбежен, он быстрее в 10–100 раз.
Векторизация (np.where) — в 4000 раз быстрее.

> DS-совет: Если логика сложнее обычного сложения — используйте .apply(), но стремитесь к векторизации через NumPy.

2. Переименование

.rename(columns=...) — самый безопасный путь. Не ломается при изменении схемы.
.str.lower().str.replace() — лучший способ массово привести колонки к snake_case.
add_prefix() — спасение при сложных merge, когда нужно быстро разделить признаки из разных таблиц.

3. Война с NaN

NaN — это не просто пустая ячейка, это сигнал о проблеме в данных.

Диагностика: df.isna().sum() — база.
ffill() / bfill() — критически важны для временных рядов (Time Series), чтобы не терять динамику.
fillna(median) — классика для ML-пайплайнов, но всегда проверяйте природу пропусков. Иногда dropna(subset=[...]) — единственный честный путь.

4. Фильтрация

Булевы маски: df[(df['A'] > 0) & (df['B'] < 1)] — классика. Важно: забудьте скобки — получите ошибку приоритета.
`.query()` — читается как SQL, поддерживает переменные через @. Идеально для длинных условий.
.loc[] — единственный верный способ, если нужно одновременно отфильтровать строки и выбрать колонки.

🔗 Ссылка на пост

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5
📚Напоминаем про наш полный курс «Самоучитель по 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
5👍2
🐍 Разминаем мозги: тест на знание основ Python

🐸 Библиотека питониста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73😁1
💥 Открытый вебинар | ИИ-агенты в продакшене: от хайпа к деньгам

Агенты уже везде. Но мало кто признаётся, сколько денег сжёг на бесконечных циклах, галлюцинациях в RAG и отсутствии мониторинга.

Полина Полунина, руководитель AI-направления Альфа-Банка, расскажет честно:

▪️ Чем агент отличается от «просто GPT с промптом» и когда бизнесу достаточно обычного LLM
▪️ 3 реальных кейса из корпоративной среды: что взлетело, а что нет
▪️ Live-демо работающего агента
▪️ ТОП-5 граблей, на которые наступают команды при внедрении

⏱️ 10 марта в 19:00 (МСК)

🎁 Участники получат промокод на скидку на самый полный курс по ИИ-агентам

👉 Регистрируйся
😄 Подборка Python-мемов

🤓 Листайте, улыбайтесь и узнавайте себя.
Если у вас есть свои любимые — делитесь в комментариях

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁71