За год мы провели три потока курса по ИИ-агентам, а теперь запускаем масштабное обновление!
В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про
В программе:
— практика в
— профессиональная оркестрация в
— продвинутый
— контроль экономики агентов: маршрутизация и кеширование запросов;
— развёртывание локальных опенсорс-моделей с соблюдением 152-ФЗ.
В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).
Доступ к материалам для предварительной подготовки откроется сразу после оплаты.
По промокоду
👉 Присоединиться к четвёртому потоку и вывести агентов в прод
В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про
AgentOps и сместили фокус с базовых концепций на суровый инжиниринг. Написать пет-проект на Python легко, а вот сделать так, чтобы он не сливал бюджет на токены, не падал при нестандартных запросах и работал в проде — задача со звёздочкой.В программе:
— практика в
Jupyter: структурный вывод и типизация PydanticAI;— профессиональная оркестрация в
LangGraph и другая парадигма AutoGen;— продвинутый
RAG для продакшена и парсинг сложных документов;— контроль экономики агентов: маршрутизация и кеширование запросов;
— развёртывание локальных опенсорс-моделей с соблюдением 152-ФЗ.
В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).
Доступ к материалам для предварительной подготовки откроется сразу после оплаты.
По промокоду
Agent забирайте скидку 10 000 ₽ (89 000 ₽ вместо 99 000 ₽). Успейте занять место до 28 февраля!👉 Присоединиться к четвёртому потоку и вывести агентов в прод
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁27💯7🌚1
🛠 cattrs: де-сериализация в Python
cattrs берет на себя всю грязную работу по превращению «сырых» словарей в красивые структурированные объекты и обратно. При этом ваши модели остаются чистыми — в них нет ни строчки кода, отвечающего за JSON.
Из главного:
1. Разделение ответственности: Ваши классы данных — это просто данные. Логика преобразования живет отдельно в объекте Converter.
2. Поддержка всего и вся: Из коробки работают attrs, dataclasses, TypedDict, NewType, сложные Union и даже новые Type Aliases из Python 3.12.
3. Скорость: cattrs генерирует оптимизированный код для преобразования «на лету».
💻 Пример в три строки
🔗 Документация
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
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)
🔗 Документация
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
🛠 Проблема: неопределенность возвращаемого типа
Представьте функцию, которая генерирует конфиг. Если действие —
Для Mypy такая функция возвращает «или словарь, или список». Если вы попытаетесь использовать результат как чистый
✨ Решение: использование @overload
Декоратор
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Представьте функцию, которая генерирует конфиг. Если действие —
DELETE, она возвращает список путей (`list[str]`), в остальных случаях — словарь (`dict`).
def generate_config(context: dict, action: Action) -> dict | list[str]:
...
Для Mypy такая функция возвращает «или словарь, или список». Если вы попытаетесь использовать результат как чистый
dict, тайп-чекер выдаст ошибку, даже если вы уверены в типе.✨ Решение: использование @overload
Декоратор
@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]:
# Реальная логика здесь
...
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤3
Последний шанс: 3 курса по цене 1 и запуск AI-агентов в продакшн
Писать простые скрипты к API на
В обновлённой программе фокус смещён на жёсткий инжиниринг и вывод в прод. Вы освоите типизацию через
Почему нельзя откладывать:
— масштабная акция «3 курса по цене 1» сгорит уже завтра;
— промокод
— сразу после оформления открываются материалы для подготовки — начать учиться можно прямо сейчас.
Забронировать место на курсе и забрать бонусы до 28 февраля
Писать простые скрипты к 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 февраля
❤3
🎯 Шпаргалка по переводу чисел между базами
Python позволяет легко переключаться между десятичной, двоичной, восьмеричной и шестнадцатеричной системами.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Python позволяет легко переключаться между десятичной, двоичной, восьмеричной и шестнадцатеричной системами.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4👾1
🛠 Валидация в Runtime через Type Annotations
Если вы использовали Pydantic или FastAPI, вы видели, как аннотации типов магическим образом проверяют входящие данные. Но как реализовать это самому, используя только стандартную библиотеку Python?
Ключ к разгадке —
1️⃣ Как достать метаданные
Для этого используется функция
2️⃣ Реализация своего валидатора
Автор предлагает элегантное решение: использовать frozen dataclasses и метод
Основные шаги:
1. Перебираем все аннотации класса.
2. Ищем в метаданных объекты, которые можно вызвать (`callable`).
3. Применяем их к значениям атрибутов.
4. Используем
3️⃣ Группировка ошибок (Exception Groups)
В Python 3.11 появились
4️⃣ Классы против Замыканий
Автор сравнивает два подхода к созданию правил:
✅ Вызываемые классы (как в Pydantic): Удобно читать, легко настраивать через аргументы
✅ Замыкания (Closures) и
🔗 Ссылка на оригинальный пост
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Если вы использовали Pydantic или FastAPI, вы видели, как аннотации типов магическим образом проверяют входящие данные. Но как реализовать это самому, используя только стандартную библиотеку Python?
Ключ к разгадке —
typing.Annotated. Этот механизм позволяет добавлять произвольные метаданные к типам, которые Python игнорирует при проверке типов, но которые мы можем прочитать во время выполнения программы.Для этого используется функция
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)
Автор предлагает элегантное решение: использовать frozen dataclasses и метод
__post_init__ для автоматической проверки полей сразу после создания объекта.Основные шаги:
1. Перебираем все аннотации класса.
2. Ищем в метаданных объекты, которые можно вызвать (`callable`).
3. Применяем их к значениям атрибутов.
4. Используем
object.__setattr__, чтобы обойти ограничение неизменяемости (frozen).В Python 3.11 появились
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)].🔗 Ссылка на оригинальный пост
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2
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
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
📊 Pandas: от CSV до продвинутой аналитики за одну статью
Большой разбор по pandas — от чтения CSV до группировок, агрегаций и более сложной аналитики. Хороший материал, чтобы систематизировать базу.
🏆 Сделка с совестью на хакатоне: как победить с нерабочим кодом?
Живая история команды, которая выиграла хакатон, несмотря на технические проблемы. Много инсайтов про презентацию, стратегию и то, как на самом деле оцениваются проекты.
🎭 Декораторы в Python — просто о сложном
Разбор декораторов в Python — от объяснения для новичков до чуть более продвинутых кейсов.
🤔 Python уже не торт?
Размышления о том, как меняются приоритеты разработчиков и почему вокруг Python стало больше дискуссий.
💾 Работа с объёмными данными в Python для начинающих
Вводный материал про обработку больших данных в Python: базовые подходы, инструменты и ограничения.
📍 Навигация: Вакансии • Задачи • Собесы
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤩1
🏭 Паттерн «Фабрика» в Python: как перестать плодить спагетти-код
Если в вашем коде то и дело встречаются бесконечные цепочки
💡 В чем суть
Вместо того чтобы вызывать конструктор класса напрямую (`EmailNotifier()`), вы обращаетесь к специальному методу-фабрике. Он сам решает, какой объект создать, основываясь на входных данных или конфигурации.
Представьте ресторан: вы не идете на кухню готовить блюдо сами (не создаете объект). Вы делаете заказ официанту (фабрике), и кухня возвращает вам готовый результат, не нагружая вас деталями рецепта.
3 способа сделать вашу фабрику лучше:
1. Словари вместо
2. Передача параметров: Хорошая фабрика умеет не только создавать объект, но и сразу прокидывать в него нужные настройки (например, заголовок документа или автора).
3. Абстрактные базовые классы (ABC): Используйте модуль
🛠 Реальный пример: Фабрика подключений к БД
Это, пожалуй, самый практичный кейс. Вы можете создать метод
Когда использовать:
🔛 Когда у вас много родственных классов с общим интерфейсом.
🔛 Когда решение о том, какой класс создать, принимается только в момент работы программы (runtime).
🔛 Когда процесс создания объекта слишком сложен и вы хотите скрыть эту логику.
🔗 Полный гайд с примерами кода:
А вы используете паттерны в своих проектах или считаете их лишней абстракцией для 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?
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👏4👍2
🏎 Юнит-тестирование производительности: ловим регрессии по числу инструкций CPU
Бенчмарки в CI — это отлично, но они сообщают о проблеме слишком поздно. Идеально было бы получать сигнал о том, что код стал работать медленнее, прямо во время запуска локальных тестов. Но как сделать это стабильным, если время выполнения (`elapsed time`) постоянно скачет?
Автор в статье предлагает использовать количество инструкций CPU вместо времени.
Если вы изменили код, количество инструкций CPU (почти всегда) изменится:
🔛 Это не гарантирует, что код стал медленнее (влияют кэши, предсказания переходов и т.д.), но это верный признак того, что производительность могла измениться.
🔛 Это дает гораздо более стабильные цифры, чем замер времени, особенно на одной и той же машине.
Для Linux можно использовать библиотеку
Пример теста:
Чтобы добиться идеальной точности, можно:
1. Фиксировать
2. Отключать ASLR (рандомизацию адресного пространства): через команду
3. Использовать один и тот же билд Python: например, через
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Бенчмарки в 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__`: два лица одного объекта
Вы наверняка видели это в консоли:
Это стандартный ответ Python, который абсолютно бесполезен и для пользователя, и для разработчика при отладке.
Но в Python есть два метода, которые превращают этот «мусор» в понятные данные.
🔹
Этот метод вызывается функциями
🔹
Этот метод вызывается в REPL-консоли, отладчиках и внутри коллекций (например, когда вы печатаете список объектов). Его цель — однозначность.
Идеальный
Золотое правило реализации:
1. Всегда реализуйте
2. Добавляйте
Реальный пример (Data Model):
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Вы наверняка видели это в консоли:
<__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
Forwarded from Библиотека дата-сайентиста | Data Science, Machine learning, анализ данных, машинное обучение
🛠 Git Submodules: как не плодить копипасту в ML-проектах
Представьте: у вас три команды (Fraud Detection, Credit Scoring и Trading). Всем им нужна одна и та же функция
Обычно это превращается в кошмар:
1. Команды копируют код себе.
2. Одна команда находит баг и исправляет его.
3. Остальные два проекта остаются с багами, потому что даже не знают об исправлении.
Итог: «расползание» версий (version drift) и ошибки в продакшене.
✅ Решение: Git Submodules
Это способ вставить одну Git-репозиторий внутрь другого как подпапку. Вы не копируете код, а ссылаетесь на конкретный коммит в общем репозитории библиотек.
🚀 Шпаргалка по командам
1. Добавить общую библиотеку в проект:
Это создаст папку
2. Клонировать проект со всеми зависимостями:
Если вы просто сделаете
3. Обновить общие утилиты до последней версии:
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека дата-сайентиста
#буст
Представьте: у вас три команды (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):
🔛 Исправлены ошибки в
🔛 Обновлена библиотека
🔛 Модули
🔛 Исправлены критические ошибки «use-after-free» в модуле
Если вы до сих пор на 3.10 — это серьезный повод запланировать миграцию на Python 3.14 (текущий стабильный релиз). В новых версиях не только безопаснее, но и значительно быстрее.
🔗 Полный чейнджлог: https://clc.to/9505nQ
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Если ваши проекты всё ещё крутятся на ветке 3.10, пришло время обновиться.
Вчера, 3 марта 2026 года, вышел критический патч безопасности для серии 3.10.
Разработчики закрыли сразу несколько серьезных дыр, которые могли привести к инъекциям и отказам в обслуживании (DoS):
email.generator, которые позволяли подделывать заголовки писем.libexpat до версии 2.7.4. Это защита от вредоносных XML-файлов, которые могли переполнить память сервера.http.cookies и wsgiref теперь жестко блокируют управляющие символы, предотвращая манипуляции с заголовками.ssl и при сравнении списков, которые могли привести к падению интерпретатора или выполнению произвольного кода.Если вы до сих пор на 3.10 — это серьезный повод запланировать миграцию на Python 3.14 (текущий стабильный релиз). В новых версиях не только безопаснее, но и значительно быстрее.
🔗 Полный чейнджлог: https://clc.to/9505nQ
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3
🐍 Лексикографический порядок в Python
Почему в Python
Python не просто знает алфавит, он смотрит на Unicode-код каждого символа.
✅ Сравнение идет посимвольно: первая пара, вторая и т.д.
✅ Как только найдено различие — результат готов.
✅ Если одна строка — префикс другой (напр.
Любая последовательность в Python (списки, кортежи, байтовые строки) сравнивается точно так же — индекс за индексом.
Пример с кортежами:
Это свойство Python безумно полезно, когда нужно отсортировать данные по нескольким критериям сразу. Просто упакуйте их в кортежи.
Пример: Сортируем студентов по году выпуска, а затем по фамилии:
Python сначала сравнит годы, а при равенстве — фамилии sorted_students = sorted(students)
Результат: Anders (1977), затем Gonzalez (1978), затем Little (1978)
Главные выводы:
1. Заглавные буквы в Unicode идут раньше строчных. Чтобы сортировка была честной, используйте
2. Вы не можете сравнить список и кортеж или строку и число — Python выдаст
3. Если нужно отсортировать объекты по приоритету, создайте список кортежей
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Почему в 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
👍4❤3
⚡️ Google представил CEL-expr-python: мощный язык правил теперь нативно в Python
Google официально открыл исходный код CEL-expr-python — реализации Common Expression Language (CEL) для Python.
Если вы строите системы, где нужно безопасно вычислять условия «на лету» (например, правила доступа или валидацию данных), этот инструмент станет вашим фаворитом.
💎 Вы можете позволить пользователям писать свои правила (фильтры, политики доступа) и не бояться, что они «положат» сервер бесконечным циклом или украдут данные.
💎 Библиотека написана как обертка над официальной реализацией на C++. Это значит, что вы получаете максимальную производительность и 100% совместимость со стандартами Google.
💎 Выражение, написанное для Python, будет работать точно так же в Go или C++ сервисах.
Где это использовать:
1. Написание гибких правил RBAC/ABAC.
2. Проверка сложных условий, которые приходят из конфигов или БД.
3. Если нужно дать пользователю возможность самому настраивать логику фильтрации в UI.
Пример кода:
🔗 Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
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
📅 Старт курса — 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
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Проект 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
👍6❤2
🔍 Сравнение тайп-чекеров: как они «видят» пустые списки
Когда вы пишете
Стратегия 1: Все дозволено (`Any`)
Кто использует: Pyright, Pyre, Ty.
Как работает: Тайп-чекер просто помечает список как
Плюс: Минимум ложных ошибок. Можно класть что угодно.
Минус: Нулевая безопасность. Ошибки (например, добавление списка вместо строки) проскочат в продакшен и вызовут краш в рантайме.
Стратегия 2: Анализ всех использований
Кто использует: Pytype.
Как работает: Чекер смотрит на весь код функции. Если вы добавили в список
Плюс: Максимально близко к поведению Python в рантайме.
Минус: Если ошибка закралась в начале функции, тайп-чекер может подсветить её только в самом конце (на `return`), что затрудняет отладку.
Стратегия 3: Вывод по первому использованию
Кто использует: Mypy, Pyrefly (по умолчанию).
Как работает: Тип фиксируется по первой операции
Пример: Если сначала добавили число, а потом пытаетесь добавить строку — вы получите ошибку сразу на строке с кодом.
Плюс: Ошибки подсвечиваются именно там, где они возникли. Это делает их максимально понятными и легко исправимыми.
🔗 Полный текст статьи
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Когда вы пишете
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
👍3❤2