39269
Все самое полезное для питониста в одном канале. Список наших каналов: https://t.me/proglibrary/9197 Курс по ML: https://cl Для обратной связи: @proglibrary_feeedback_bot По рекламе: @proglib_adv РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36
🐍 `__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)
🏭 Паттерн «Фабрика» в 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())
Python — это мощь, но готов ли ты построить на нём (и не только) бизнес? 🚀
Proglib App ищет технического кофаундера. Это EdTech-платформа для разработчиков: курсы, интерактивные квизы и ИИ-тьюторы. MVP уже работает, юзеры растут, и нам нужен человек, способный взять на себя техчасть.
Это шанс выйти за пределы скриптов и стать архитектором продукта, которым пользуются тысячи коллег.
🛠️ Стек и инструменты:
TypeScript, React 18, Express 5, PostgreSQL, Drizzle ORM. Используем Claude Code и Cursor.
Твои задачи:
• Проектировать масштабируемую архитектуру и пилить фичи. • Внедрять ИИ-агентов в образовательный процесс. • Работать автономно в связке с основателем.
Ожидания:
• Уверенное владение TS, React, Node.js и SQL. • Понимание, как устроены современные веб-сервисы. • Самостоятельность: взял задачу — довёл до результата.
Удалёнка, гибкий график и полная свобода в принятии технических решений.
Готов делать сервис, который изменит обучение в IT? Пиши о себе и кидай GitHub 👇
@proglibrary_feedback_bot
🎯 Шпаргалка по переводу чисел между базами
Python позволяет легко переключаться между десятичной, двоичной, восьмеричной и шестнадцатеричной системами.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
🛠 Проблема: неопределенность возвращаемого типа
Представьте функцию, которая генерирует конфиг. Если действие — DELETE, она возвращает список путей (`list[str]`), в остальных случаях — словарь (`dict`).
def generate_config(context: dict, action: Action) -> dict | list[str]:
...
dict, тайп-чекер выдаст ошибку, даже если вы уверены в типе.@overload позволяет описать конкретные комбинации входных и выходных данных:
from typing import overload, Literal
@overload
def generate_config(context: dict, action: Literal[Action.DELETE]) -> list[str]: ...
@overload
def generate_config(context: dict, action: Literal[Action.MODIFY, Action.ADD]) -> dict: ...
def generate_config(context: dict, action: Action) -> dict | list[str]:
# Реальная логика здесь
...
🐸 Библиотека питониста
#развлекалово
🌍 icu4py: правильная работа с текстом и локализацией
Если вы хоть раз делали интернационализацию (i18n) в Python, то знаете, какая это боль.
Библиотека ICU (International Components for Unicode) — это мировой стандарт (её используют Chrome, macOS и VS Code), но в Python с ней всегда было сложно: либо древний неудобный API, либо мучения с установкой системных зависимостей.
icu4py вам не нужно писать if count == 1 для каждого языка — библиотека сама знает стандарты Unicode для любой локали.SentenceBreaker понимает контекст и не разрывает предложение на «т. д.» или внутри цитаты.pip install icu4py
🚀 Starlette наконец-то дозрел до версии 1.0
Если вы пишете на Python, то Starlette — это «серый кардинал» вашего стека. Вы можете не использовать его напрямую, но он крутится под капотом у FastAPI, Litestar и еще десятка фреймворков.
Том Кристи создал этот проект почти 8 лет назад (в 2018-м), и всё это время мы жили на версиях 0.x. И вот, наконец, вышел 1.0.0rc1.
Дело не только в красивой цифре. В 2026 году Starlette стал критической деталью в мире ИИ.
✔️ Он — база для Python MCP SDK (Model Context Protocol). Если вы строите агентов, которые должны общаться с внешним миром, вы скорее всего используете Starlette.
✔️ 10 миллионов скачиваний в день. Это буквально фундамент современного асинхронного веба.
В новой версии разработчики вырезали всё старое и неактуальное (deprecated), что копилось годами, и зафиксировали API.
👀 Если у вас FastAPI, просто подождите — обновление прилетит само как зависимость. Если же вы используете Starlette напрямую для своих микросервисов, самое время прогнать тесты на 1.0.0rc1.
🔗 Release Notes: https://clc.to/RevWVg
А вы когда-нибудь пробовали писать на чистом Starlette без FastAPI? Или считаете, что без Pydantic-валидации в вебе делать нечего?
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
🐸 Библиотека питониста
#развлекалово
📚Напоминаем про наш полный курс «Самоучитель по 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
🐍 Переходим с простых скриптов на Python к сложным AI-агентам промышленного уровня
В 2026 году мало просто вызвать openai.chat.completions. Настоящий продакшн требует управления состояниями через LangGraph и жёсткого контроля за token usage.
Мы полностью обновили курс по AI-агентам, превратив его в руководство по превращению Python-кода в стабильную бизнес-систему.
📚 В обновлённой программе:
— продвинутый LangGraph: реализация human-in-the-loop и механизмов отката состояний;
— промышленный RAG: обработка разнородных документов и оптимизация семантического поиска;
— экономика агентов: автоматическое переключение между LLM для оптимизации затрат;
— инжиниринг: логирование, трассировка и работа в рамках 152-ФЗ.
Начните подготовку сразу после оплаты — вы получите доступ к базе знаний для плавного старта.
⏳ Специальные условия до 28 февраля:
— введите промокод Agent для получения скидки 10 000 рублей**;
— участвуйте в **акции «3 курса по цене 1» — выберите два любых курса в дополнение к основному.
👉 Получить доступ к курсу и подаркам
От скриптов на коленке — к enterprise-агентам на Python
Накидать бота на LangChain за вечер может каждый. Но когда выкатываешь это в продакшн, начинаются проблемы: система зацикливается, память течёт, а API-ключи сжигают бюджет.
Мы пересобрали курс по AI-агентам для Python-разработчиков под реалии 2026 года. Это глубокий инженерный гайд, где мы учим превращать нестабильные скрипты в надёжные бэкенд-решения с жёстким контролем ресурсов.
Что мы разберём на практике:
— хардкорный RAG: обработка сырых PDF, тюнинг эмбеддингов под промышленные объёмы;
— продвинутый LangGraph: маршрутизаторы, time-travel, прерывания и human-in-the-loop;
— профилирование LLM: трассировка ошибок, логирование и динамическое переключение моделей;
— автоматизация: пишем агентов, которые сами управляют браузером и legacy-системами;
— безопасный деплой: как развернуть архитектуру без нарушения 152-ФЗ.
До 28 февраля по промокоду Agent доступна скидка 10 000 рублей.
Плюс работает акция «3 курса по цене 1» — забирайте два дополнительных направления бесплатно.
Стать AI-инженером
🛡️ pip install = взлом: почему 56% малвари не ждут импорта
Мы привыкли думать, что вредоносный код активируется в момент import malicious_lib. Но свежие данные по датасету QUT-DV25 (14 тысяч образцов) говорят об обратном: 56% пакетов исполняют полезную нагрузку прямо во время установки.
Это значит, что простого pip install достаточно, чтобы лишиться переменных окружения или получить reverse shell через скрипты setup.py или post-install.
Запускать каждый install в отдельной песочнице — ресурсозатратно. Статические сканеры (вроде Snyk или Safety) часто пасуют перед обфускацией, а агенты рантайма (Falco) обычно следят за приложением уже после деплоя, пропуская фазу сборки.
Чтобы закрыть эту дыру в безопасности цепочки поставок, появился проект KEIP. Это инструмент на базе eBPF, который встраивается в ядро Linux (LSM hooks) и контролирует процесс установки в реальном времени.
Например:
🛠 KEIP отслеживает всё дерево процессов pip.
🛠 Если setup.py или любой его дочерний процесс пытается достучаться до сервера, которого нет в белом списке (читай: любого сервера, кроме PyPI), инструмент мгновенно «убивает» всю группу процессов.
🔗 Посмотреть код на GitHub: https://clc.to/DlD3Gg
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Пишешь на Python? Пора становиться AI-инженером
Python — родной язык для AI, но одного знания синтаксиса уже мало. Рынок 2026 года требует умения строить отказоустойчивые агентные системы. Мы обновили курс «Разработка AI-агентов», добавив жёсткий инженерный трек.
Твой новый стек:
🔹 LangGraph & Orchestration. Внедряем Human-in-the-loop, time-travel для отладки и сложные графы состояний вместо лапши из if-else.
🔹 Advanced RAG. Промышленные пайплайны на Python: парсинг, эмбеддинги, векторные БД и улучшение поисковых запросов.
🔹 Backend-инжиниринг. Управление токенами, кэширование, роутинг запросов и предотвращение регрессий.
🔹 Production Ready. Модуль по управлению браузером, интеграция с legacy и юридические аспекты (152-ФЗ).
Стартуй сейчас! Покупаешь курс — сразу получаешь материалы для пре-подготовки.
🎟 Промокод Agent — скидка 10 000 ₽ (до 28 февраля).
👉 Перейти к инжинирингу
⏱️ Справочник по Big-O в Python
Для тех, кто хочет писать не просто работающий, а эффективный код, обновился ультимативный справочник — Python Time & Space Complexity Reference.
Это детальная база данных по сложности операций для версий Python от 3.9 до 3.14.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
🏎 Юнит-тестирование производительности: ловим регрессии по числу инструкций 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, "Скорость изменилась!"
PYTHONHASHSEED: чтобы рандом в хешировании словарей не влиял на проход по коду.setarch x86_64 -R pytest.uv python install.
📱 Python новости за последние 7 дней
📊 Pandas: от CSV до продвинутой аналитики за одну статью
Большой разбор по pandas — от чтения CSV до группировок, агрегаций и более сложной аналитики. Хороший материал, чтобы систематизировать базу.
🏆 Сделка с совестью на хакатоне: как победить с нерабочим кодом?
Живая история команды, которая выиграла хакатон, несмотря на технические проблемы. Много инсайтов про презентацию, стратегию и то, как на самом деле оцениваются проекты.
🎭 Декораторы в Python — просто о сложном
Разбор декораторов в Python — от объяснения для новичков до чуть более продвинутых кейсов.
🤔 Python уже не торт?
Размышления о том, как меняются приоритеты разработчиков и почему вокруг Python стало больше дискуссий.
💾 Работа с объёмными данными в Python для начинающих
Вводный материал про обработку больших данных в Python: базовые подходы, инструменты и ограничения.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#свежак
🛠 Валидация в Runtime через Type Annotations
Если вы использовали Pydantic или FastAPI, вы видели, как аннотации типов магическим образом проверяют входящие данные. Но как реализовать это самому, используя только стандартную библиотеку Python?
Ключ к разгадке — typing.Annotated. Этот механизм позволяет добавлять произвольные метаданные к типам, которые Python игнорирует при проверке типов, но которые мы можем прочитать во время выполнения программы.
1️⃣ Как достать метаданные
Для этого используется функция get_type_hints с флагом include_extras=True.
import typing as t
from dataclasses import dataclass
@dataclass
class User:
age: t.Annotated[int, "должен быть > 0"]
# Получаем: {'age': typing.Annotated[int, 'должен быть > 0']}
annotations = t.get_type_hints(User, include_extras=True)
__post_init__ для автоматической проверки полей сразу после создания объекта.object.__setattr__, чтобы обойти ограничение неизменяемости (frozen).ExceptionGroup, и автор мастерски применяет их здесь. Вместо того чтобы падать на первой же ошибке, валидатор собирает все нарушения и выбрасывает их одним списком. Это критично для удобства API и фронтенда.
class ValidationErrorGroup(ExceptionGroup):
pass
# В итоге при ошибке вы получите детальный отчет:
# ValidationErrorGroup: Validation Errors (2 sub-exceptions)
# ├── ValueError: -1 must be > to 0 (attribute 'x')
# └── ValueError: String is empty (attribute 'y')
__init__.partial: Более функциональный стиль, который позволяет изящно комбинировать проверки, например: Annotated[int, gte(0), lt(100)].
Последний шанс: 3 курса по цене 1 и запуск AI-агентов в продакшн
Писать простые скрипты к API на Python — весело, но тренд 2026 года — это сложные мультиагентные системы. Как контролировать затраты на LLM, управлять оркестрацией и не нарушить 152-ФЗ?
В обновлённой программе фокус смещён на жёсткий инжиниринг и вывод в прод. Вы освоите типизацию через PydanticAI, научитесь строить ReAct-циклы, работать с LangGraph и AutoGen, внедрять продвинутый RAG и MCP. Все ключевые навыки в одном месте: AgentOps, time-travel дебаггинг, управление браузером, human-in-the-loop и развёртывание open-source моделей в закрытых контурах.
Почему нельзя откладывать:
— масштабная акция «3 курса по цене 1» сгорит уже завтра;
— промокод Agent на скидку 10 000 рублей действует последние часы;
— сразу после оформления открываются материалы для подготовки — начать учиться можно прямо сейчас.
Забронировать место на курсе и забрать бонусы до 28 февраля
🛠 cattrs: де-сериализация в Python
cattrs берет на себя всю грязную работу по превращению «сырых» словарей в красивые структурированные объекты и обратно. При этом ваши модели остаются чистыми — в них нет ни строчки кода, отвечающего за JSON.
Из главного:
1. Разделение ответственности: Ваши классы данных — это просто данные. Логика преобразования живет отдельно в объекте Converter.
2. Поддержка всего и вся: Из коробки работают attrs, dataclasses, TypedDict, NewType, сложные Union и даже новые Type Aliases из Python 3.12.
3. Скорость: cattrs генерирует оптимизированный код для преобразования «на лету».
💻 Пример в три строки
from attrs import define
from cattrs import structure, unstructure
@define
class User:
id: int
tags: list[str]
# Превращаем словарь в объект (Structuring)
user = structure({'id': 1, 'tags': ['python', 'cattrs']}, User)
# User(id=1, tags=['python', 'cattrs'])
# Превращаем объект обратно в словарь (Unstructuring)
dict_data = unstructure(user)
За год мы провели три потока курса по ИИ-агентам, а теперь запускаем масштабное обновление!
В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про AgentOps и сместили фокус с базовых концепций на суровый инжиниринг. Написать пет-проект на Python легко, а вот сделать так, чтобы он не сливал бюджет на токены, не падал при нестандартных запросах и работал в проде — задача со звёздочкой.
В программе:
— практика в Jupyter: структурный вывод и типизация PydanticAI;
— профессиональная оркестрация в LangGraph и другая парадигма AutoGen;
— продвинутый RAG для продакшена и парсинг сложных документов;
— контроль экономики агентов: маршрутизация и кеширование запросов;
— развёртывание локальных опенсорс-моделей с соблюдением 152-ФЗ.
В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).
Доступ к материалам для предварительной подготовки откроется сразу после оплаты.
По промокоду Agent забирайте скидку 10 000 ₽ (89 000 ₽ вместо 99 000 ₽). Успейте занять место до 28 февраля!
👉 Присоединиться к четвёртому потоку и вывести агентов в прод
🎨 Ast-visualizer превращает код в карту и графики
Проект Ast-visualizer предлагает перестать гадать, где в коде «тонкие места», и начать их видеть. Инструмент анализирует AST (абстрактное синтаксическое дерево) вашего проекта и строит на его основе наглядные отчеты.
Что умеет инструмент:
🔝 Интерактивные AST-деревья: Визуализация структуры отдельных файлов с цветовой подсветкой.
🔝 Radial View: Радиальный вид дерева. Позволяет одним взглядом понять, где в файле спрятаны самые «толстые» функции.
🔝 Тепловая карта сложности: Сложные участки кода (по Мейкейбу) подсвечиваются красным прямо в дереве.
🔝 Граф зависимостей: Показывает, как файлы связаны через импорты. Незаменимая вещь для поиска круговых зависимостей.
🔝 Dashboard поддержки: Рассчитывает индекс поддерживаемости (0–100) и выдает ТОП-5 кандидатов на рефакторинг.
Большинство AST-эксплореров просто рисуют дерево одного файла. Ast-visualizer идет дальше: он интерпретирует данные, объединяет их в масштабе всего репозитория и визуализирует в разных форматах — от радиальных схем до графиков сложности по строкам.
🔗 Попробовать на своем коде: https://clc.to/yV4wag
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
⚡️ uv обошел Poetry по загрузкам
Это официально: согласно свежей статистике загрузок с PyPI, инструмент uv от команды Astral (авторов Ruff) обогнал Poetry.
Если вы всё еще используете Poetry, вот почему весь мир переходит на uv:
1️⃣ Безумная скорость: uv написан на Rust. Там, где Poetry тратит 10–15 секунд на разрешение зависимостей, uv справляется за 0.5 секунды. Разница не в процентах, а в десятки раз.
2️⃣ Всё в одном: uv заменяет собой целую пачку инструментов: pip, poetry, pyenv, pipx и virtualenv. Один бинарник, который умеет всё — от установки версии Python до управления воркспейсами.
3️⃣ Глобальный кэш: uv не копирует пакеты в каждый проект. Он использует хардлинки, экономя гигабайты места на диске.
4️⃣ Нативность: uv максимально следует стандартам (PEP). Он не пытается «изобрести свой велосипед», а делает стандартные инструменты лучше.
Короткий чек-лист по переходу:
➕ Было: poetry install -> Стало: uv sync
➕ Было: poetry add requests -> Стало: uv add requests
➕ Было: poetry run python main.py -> Стало: uv run main.py
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
📱 Python новости за последние 7 дней
PEP 747 принят — теперь можно типизировать сами аннотации
Типизация выходит на новый уровень: теперь можно описывать типы… для типов. Python всё увереннее движется в сторону статического анализа, и граница между «динамичным» и «строго типизированным» языком продолжает размываться.
Perl и R возвращаются, Python теряет 19% популярности?
Громкий заголовок, но паниковать рано. Рейтинги любят колебания, а экосистема Python по-прежнему гигантская. Хотя немного здоровой конкуренции языку точно не повредит.
LEGB и область видимости — неочевидные грабли
Local, Enclosing, Global, Built-in — правило простое, а баги из-за него иногда очень нет. Хороший разбор с примерами.
mmap в Python — быстрый I/O через отображение в память
Отличный инструмент для работы с большими файлами и бинарными форматами.
Шаблонные строки в Python 3.14
Больше контроля над интерполяцией данных — меньше сюрпризов в runtime.
ООП в Python за одну статью
Компактный, но системный разбор от базового класса до архитектурных принципов.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#свежак
✅ PEP 747 принят: теперь мы можем типизировать сами аннотации
В мире Python-типизации долгое время была «серая зона». Если вы хотели передать в функцию класс, вы писали type[T]. Но как только дело доходило до сложных штук вроде int | str или list[int], тайп-чекеры начинали ругаться.
⚡️ Принятый PEP 747 вводит `TypeForm[T]`, и это именно то, чего не хватало библиотекам вроде Pydantic и FastAPI.
Раньше type[int] работал, потому что int — это класс. Но list[int] или int | str — это не классы, а специальные объекты типов.
❌ Попытка передать их в функцию с аннотацией type[T] выдавала ошибку в Mypy или Pyright. Разработчикам приходилось лепить Any, убивая всю пользу от статической проверки.
Теперь мы можем явно сказать: «Эта функция принимает форму типа»:
from typing import TypeForm
def trycast[T](target_type: TypeForm[T], value: object) -> T | None:
...
# Теперь это валидный код для тайп-чекера:
trycast(list[int], ["1", "2"]) # Вернет тип list[int] | None
trycast(int | str, 42) # Вернет тип int | str | None
typing_extensions её можно будет использовать гораздо раньше.
🛠 Шпаргалка: как писать тесты, которые не бесят
Главная проблема тестов — хрупкость. Это когда вы просто переименовали функцию или разбили один метод на два (не меняя логику), а тесты упали. Значит, вы тестировали детали реализации, а не поведение.
Solitary (Одиночные): Изолируем юнит, заменяя всё вокруг моками.
❌ Минус: Тест намертво привязан к структуре кода. Изменили вызов — тест упал.
✅ Когда юзать: Только для экстремально сложных алгоритмов с кучей граничных кейсов.
Sociable (Общительные): Тестируем юнит вместе с его реальными зависимостями (если они не лезут в БД/сеть).
✅ Плюс: Высокая устойчивость к рефакторингу. Код внутри меняется — тест остается зеленым.
💡 Правило: Тестируй «что» делает код (результат), а не «как» (какие методы дергает).
Что и чем тестировать:
— Бизнес-логика (условия, расчеты, правила): Sociable Unit (минимум моков).
— Координация (код, который дергает БД, шлет письма, вызывает API): Интеграционный / Сервисный тест.
— Тривиальный код (простые геттеры, проброс параметров): Не тестировать отдельно. Он автоматически покроется интеграционными тестами.
Три правила «здорового» теста:
— Защита от багов: Находит ли тест реальную ошибку в логике?
— Устойчивость к рефакторингу: Могу ли я переписать код с нуля, сохранив результат, чтобы тест не упал?
— Простота поддержки: Насколько легко понять, что сломалось, без дебаггера?
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Отличная шпаргалка по Python. Она наглядно показывает, как превратить громоздкие циклы в элегантные однострочники.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
💡 Библиотека algorithms: реализация классических алгоритмов на Python
Если вы занимаетесь подготовкой к техническим интервью или просто хотите глубже разобраться в структурах данных, этот репозиторий — отличная находка.
Автор собрал ключевые алгоритмы и оформил их максимально чисто: с аннотациями типов, подробными docstrings и оценкой сложности прямо в коде.
Примеры того, что есть «под капотом»:
1. Графы и поиск путей:
Реализованы основные алгоритмы: от поиска в ширину (BFS) до алгоритмов Дейкстры и Беллмана-Форда.
from algorithms.graph import dijkstra
graph = {
"s": {"a": 2, "b": 1},
"a": {"c": 8},
"b": {"d": 2},
"c": {"t": 4},
"d": {"c": 11, "t": 5},
"t": {},
}
print(dijkstra(graph, "s", "t")) # (8, ['s', 'b', 'd', 't'])
🐸 Библиотека питониста
#развлекалово
⚡️ Конструктор графических интерфейсов Python с поддержкой Drag-and-Drop
Инструмент для визуального создания графических интерфейсов на Python — без ручной вёрстки кода.
Позволяет перетаскивать элементы (кнопки, поля ввода, таблицы и т.д.) на форму, настраивать их свойства и автоматически генерировать Python-код.
🔗 Ссылка на tool
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст