en
Feedback
Python/ django

Python/ django

Open in Telegram

📈 Analytical overview of Telegram channel Python/ django

Channel Python/ django (@pythonl) in the Russian language segment is an active participant. Currently, the community unites 58 972 subscribers, ranking 2 162 in the Technologies & Applications category and 10 185 in the Russia region.

📊 Audience metrics and dynamics

Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 58 972 subscribers.

According to the latest data from 29 August, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -292 over the last 30 days and by -1 over the last 24 hours, overall reach remains high.

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 6.27%. Within the first 24 hours after publication, content typically collects 3.33% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 3 696 views. Within the first day, a publication typically gains 1 963 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 20.
  • Thematic interests: Content is focused on key topics such as github, claude, контекст, архитектура, api.

📝 Description and content policy

The author describes the resource as a platform for expressing subjective opinions:
по всем вопросам @workakkk @itchannels_telegram - 🔥 все ит каналы @ai_machinelearning_big_data -ML @ArtificialIntelligencedl -AI @datascienceiot - 📚 @pythonlbooks РКН: clck.ru/3Fm...

Thanks to the high frequency of updates (latest data received on 30 August, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.

58 972
Subscribers
-124 hours
+137 days
-29230 days
Posts Archive
🔍Тестовое собеседование на Middle Python-разработчика в четверг 22 мая(в четверг) в 19:00 по мск приходи онлайн на открытое
🔍Тестовое собеседование на Middle Python-разработчика в четверг 22 мая(в четверг) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика. Собес проведет Вадим Пуштаев, ex. head of backend в 💙, автор канала @pythonetc, архитектор в европейской компании Как это будет: 📂 Вадим будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Вадим будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Вадиму Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqwFUCLU

🐍 Задача на Python: "Исчезающая цифра" Условие: У тебя есть список строк — чисел от 1 до 100, но одно из чисел случайно пропало. Найди, какое число отсутствует. Нельзя использовать sum(), sorted(), Counter. Все числа в списке представлены как строки. Пример:

import random

original = [str(i) for i in range(1, 101)]
missing = random.choice(original)
shuffled = original.copy()
shuffled.remove(missing)
random.shuffle(shuffled)
Напиши функцию:

def find_missing_number(data: list[str]) -> int:
    ...
📌 Подвох: Нельзя просто сложить строки. Но можно использовать свойство XOR:
a ^ a = 0
0 ^ b = b
То есть: если мы сделаем XOR всех чисел от 1 до 100, а затем XOR всех чисел в переданном списке — результатом будет пропущенное число. 🧠 Решение: ```python def find_missing_number(data: list[str]) -> int: xor_full = 0 xor_data = 0 for i in range(1, 101): xor_full ^= i for val in data: xor_data ^= int(val) return xor_full ^ xor_data ``` ✅ Пояснение: - xor_full — XOR всех чисел от 1 до 100. - xor_data — XOR всех чисел в текущем списке (`str` → `int`). - Разность xor_full ^ xor_data вернёт единственное отсутствующее число. 🎯 Пример использования: ```python original = [str(i) for i in range(1, 101)] original.remove("42") random.shuffle(original) print(find_missing_number(original)) # → 42 ``` 🔥 Эта задача хороша тем, что: • содержит хитрый запрет на sum() • требует знания побитовых операций • работает с типами (`str` vs `int`) • подходит для собеседования уровня middle+ @pythonl

«Я в режиме реального времени поясняла структуру запросов / ответов в Postman и разбирала документацию в Swagger», — пишет ан
+4
«Я в режиме реального времени поясняла структуру запросов / ответов в Postman и разбирала документацию в Swagger», — пишет аналитик, который прошел наш курс, а потом два технических собеседования в международные компании. Приятно, конечно ❤️ Если в 2025 году вы хотите: — научиться выбирать стиль интеграции под вашу задачу; — начать проектировать с нуля и описывать интеграции в современных стилях (API: REST, SOAP, gRPC и других, + брокеры сообщений); — узнать как правильно собирать требования и моделировать в UML; — подготовиться к собеседованию, решив более 100 заданий; — запустить свой API на Python. Значит наш курс для вас! 🚀 Начните с открытых бесплатных уроков — переходите в бот курса и жмите «Старт» 👇 @studyit_help_bot 🚀 Скидка на курс от канала — 1 000₽ на Stepik по промокоду PYTHONL до конца мая.

🖥 Как масштабировать Python Task Queue — подробный гайд Когда ваше Python-приложение начинает активно использовать фоновые з
🖥 Как масштабировать Python Task Queue — подробный гайд Когда ваше Python-приложение начинает активно использовать фоновые задачи (email-уведомления, видеообработка, интеграции и т.д.), быстро возникает проблема: очередь задач растёт, задержка увеличивается, пользователи начинают ощущать тормоза. В статье разбирается, как это решать грамотно, автоматически и эффективно. 🎯 Основные проблемы: • Даже при низком CPU задачи могут выполняться с задержкой • Очередь может казаться «тихой», но задачи копятся • Масштабирование вручную по метрикам CPU/памяти — неэффективно • Часто “один жирный воркер” не решает проблему — надо менять подход ⚙️ Как масштабировать: пошагово 1) 🔌 Выбор брокера сообщений • Redis — прост в настройке, отлично работает с Celery и RQ • RabbitMQ — надёжнее (повторы, подтверждения), подходит для критичных задач 2) ⚙️ Настройка воркеров • *Вертикальное масштабирование* — больше процессов внутри одного воркера (в Celery можно concurrency) • *Горизонтальное масштабирование* — запуск множества воркеров на разных инстансах, читающих из одной очереди — универсальное и гибкое решение 3) 📈 Авто-скейлинг по latency, а не CPU • Частая ошибка: масштабировать по CPU • Правильный подход: масштабировать по времени ожидания задач в очереди • Judoscale позволяет автоматизировать масштабирование именно по queue latency • При росте задержки запускаются новые воркеры, при снижении — отключаются 4) 🧠 Fan-Out: разбивай большие задачи Вместо: Одна задача: обработать 10 000 пользователей Правильно: 10 000 задач: по одной на каждого пользователя Преимущества: • Параллельность • Надёжность (ошибки локализуются) • Легче масштабировать обработку 📊 Результаты после внедрения: • Время ожидания задач сократилось с 25 минут до 30 секунд • Масштабирование стало динамичным • Инфраструктура стала дешевле — меньше простаивающих воркеров ✅ Рекомендации: • Используй Redis или RabbitMQ в зависимости от требований • Отдавай предпочтение горизонтальному масштабированию • Следи за latency, а не за CPU • Используй Judoscale для авто-масштабирования • Применяй fan-out для повышения надёжности и скорости 🖥 Ссылка на статью @pythonl

🧠 Как клонировать голос с помощью Open Source (Coqui TTS) Хочешь, чтобы ИИ говорил твоим голосом? Без подписок, платных API и ограничений? Вот подробная инструкция, как клонировать свой голос с нуля с помощью open-source инструментов: 🔧 Установка

sudo apt install ffmpeg
pip install TTS soundfile torchaudio gradio

git clone https://github.com/coqui-ai/TTS.git
cd TTS
pip install -e .
🎙️ 1. Подготовка записи голоса Тебе нужен файл .wav: - продолжительность: от 1 минуты - формат: моно, 16 кГц, 16-bit Пример конвертации:

ffmpeg -i input.mp3 -ac 1 -ar 16000 output.wav
🧬 2. Генерация эмбеддинга твоего голоса

from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts

config = XttsConfig()
model = Xtts.init_from_config(config)
model.load_checkpoint("tts_models/multilingual/multi-dataset/xtts_v2")

voice_sample = "your_voice.wav"
speaker_embedding = model.get_speaker_embedding(voice_sample)
📤 3. Генерация речи с твоим голосом

text = "Привет! Я теперь могу говорить твоим голосом."
wav = model.tts(text, speaker_embedding=speaker_embedding)
model.save_wav(wav, "output.wav")
💻 4. (Опционально) Интерфейс с Gradio

import gradio as gr

def speak(text):
    wav = model.tts(text, speaker_embedding=speaker_embedding)
    path = "generated.wav"
    model.save_wav(wav, path)
    return path

gr.Interface(fn=speak, inputs=gr.Textbox(), outputs=gr.Audio()).launch()
✅ Быстрый способ (через CLI)

tts --model_name "tts_models/multilingual/multi-dataset/xtts_v2" \
    --text "Привет, мир!" \
    --speaker_wav path/to/your.wav \
    --out_path output.wav
⚠️ Важно - 💻 Работает на CPU, но лучше с GPU. - 🌐 Поддерживает русский язык. @pythonl

🪬 Boto3 — мост между Python и AWS. Эта официальная Python-библиотека предоставляет удобный интерфейс для взаимодействия с се
🪬 Boto3 — мост между Python и AWS. Эта официальная Python-библиотека предоставляет удобный интерфейс для взаимодействия с сервисами AWS — от простых операций с S3 до управления кластерами EC2. После недавнего прекращения поддержки Python 3.8 проект сосредоточился на современных версиях языка. Особенность Boto3 в двухуровневой архитектуре: низкоуровневые клиенты для точного контроля и ресурсные объекты для упрощённого синтаксиса. Документация от AWS включает примеры для всех основных сервисов, что делает интеграцию почти безболезненной. 🤖 GitHub @pythonl

🎮 Oh My ~God~ Git — необычная и полезная игра с открытым исходным кодом, которая помогает разобраться с GIT не через скучные туториалы, а с помощью наглядных карточек и геймплея. 🧠 В процессе ты: • Поймёшь, как устроен GIT под капотом • Научишься работать с ветками, коммитами, merge и rebase • Запомнишь команды на практике, играя 📦 Игра доступна прямо в браузере: [ohmygit.org](https://ohmygit.org/) 💻 Или можно скачать и установить с GitHub: [github.com/git-learning-game/oh-my-git](https://github.com/git-learning-game/oh-my-git) 👾 Подходит как новичкам, так и тем, кто хочет освежить знания в игровой форме.

🤖 ACI.dev — Унифицированный доступ AI-агентов к 600+ инструментам ACI (Agent Capability Interface) — это открытая платформа,
🤖 ACI.dev — Унифицированный доступ AI-агентов к 600+ инструментам ACI (Agent Capability Interface) — это открытая платформа, которая позволяет AI-агентам подключаться к более чем 600 внешним инструментам и API, используя единую инфраструктуру доступа. Система включает поддержку многоарендной архитектуры (multi-tenant), гибкие разрешения и несколько режимов вызова — как через MCP-сервер, так и напрямую через SDK. 🎯 Цель проекта — предоставить ИИ-доступ к реальным действиям в цифровой среде: от отправки писем и управления календарём до взаимодействия с CRM, базами данных, DevOps-инструментами и даже пользовательскими функциями. 🧩 Основные возможности: - 🔌 600+ готовых интеграций Поддержка популярных платформ: Notion, Slack, Google Calendar, GitHub, Discord, Twilio, PostgreSQL и многих других. - 🔐 Разграничение доступа и безопасность Поддержка granular-permissions, токенов доступа, ролей, и подписанных вызовов с проверкой подлинности. - 🧠 Интеграция с AI-агентами Разработано для работы с open-source AI-платформами, включая AutoGen, CrewAI, LangGraph, OpenDevin, Devika и т.д. - 🛠️ Два способа использования 1. MCP Server — единая точка входа, через которую агент может выполнять действия. 2. ACI SDK — локальное подключение и вызов возможностей напрямую из кода. - 🌐 Webhooks и Plugin support Поддержка обратных вызовов и подключения как внешнего плагина к другим системам (например, для LLM-агентов). ACI — это своего рода "операционная система" для ИИ-агентов, позволяющая им действовать в реальном мире с контролем, безопасностью и масштабируемостью. 🔗 Полезные ссылки: - GitHub - Документация

🐍 Задача уровня Pro: декоратор с внутренним состоянием 📌 Задача: Напиши декоратор call_limiter, который: - ограничивает функцию f максимум до n вызовов - после n вызова функция больше не вызывается, а возвращает строку "LIMIT REACHED" Пример использования:

@call_limiter(3)
def greet(name):
    return f"Hello, {name}!"

print(greet("Alice"))  # Hello, Alice!
print(greet("Bob"))    # Hello, Bob!
print(greet("Charlie"))# Hello, Charlie!
print(greet("Dave"))   # LIMIT REACHED
🎯 Подвохи: - Нужно создать декоратор-фабрику с аргументом n - Внутри должна быть функция с nonlocal, чтобы отслеживать число вызовов - Часто путаются и используют mutable default, что ломает независимость между декорируемыми функциями ✅ Решение: ```python def call_limiter(n): def decorator(func): count = 0 def wrapper(*args, **kwargs): nonlocal count if count >= n: return "LIMIT REACHED" count += 1 return func(*args, **kwargs) return wrapper return decorator ``` 🧪 **Проверка:** ```python @call_limiter(2) def ping(): return "pong" print(ping()) # pong print(ping()) # pong print(ping()) # LIMIT REACHED @call_limiter(1) def echo(msg): return msg print(echo("hi")) # hi print(echo("bye")) # LIMIT REACHED ``` 🧠 **Что проверяет задача:** • Понимание функций высшего порядка • Работа с `nonlocal` и областью видимости • Контроль состояния внутри декоратора • Умение не "засорить" глобальные или общие области @pythonl

Второй язык программирования для карьерного роста Навык работы с Go — это хорошее дополнение к скиллсету опытного программист
Второй язык программирования для карьерного роста Навык работы с Go — это хорошее дополнение к скиллсету опытного программиста. Освоить язык можно на курсе Нетологии. Это актуальная программа 2025 года, которую мы разработали с учётом последних трендов отрасли. На курсе вас ждёт много практики: 4 проекта для портфолио, 32 задания и хакатон. За 6 месяцев вы освоите язык на продвинутом уровне и научитесь: - писать эффективный код на Go, - создавать высоконагруженные сервисы, - работать с базами данных, - встраивать Go-приложения в инфраструктуру. Практикующий эксперт проведёт для вас 3 персональные консультации. Центр развития карьеры поможет упаковать весь опыт в сильные резюме и портфолио. Освойте Go как второй язык программирования и растите в карьере Реклама. ООО "Нетология". ИНН 7726464125 Erid 2VSb5xBerBJ

🎭 Pykka — акторная модель для Python без лишних сложности. Этот проект позволяет организовывать конкурентные вычисления без
🎭 Pykka — акторная модель для Python без лишних сложности. Этот проект позволяет организовывать конкурентные вычисления без традиционных проблем с состоянием и блокировками. Вдохновлённый знаменитым Akka для JVM, Pykka предлагает минималистичный подход — никаких супервизоров или распределённых акторов, только чистые принципы обмена сообщениями между изолированными процессами. Инструмент имеет продуманную архитектуру: разработчику достаточно определить поведение акторов, а Pykka возьмет на себя всю работу с очередями и потоками. 🤖 GitHub @pythonl

❓Зачем Data Scientist изучать ML? Машинное обучение — это не просто модное словосочетание. Это основа Data Science, без котор
❓Зачем Data Scientist изучать ML? Машинное обучение — это не просто модное словосочетание. Это основа Data Science, без которой успешная карьера в этой области невозможна. Вы не сможете работать с большими данными и обучать ИИ, если не освоите методы ML. На открытом вебинаре 19 мая в 18:00 мск вы узнаете, зачем вам ML, и научитесь решать реальную задачу: классифицировать изображения с помощью машинного обучения. 📣 Спикер Мария Тихонова – PhD Computer Science, Senior Data Scientist и преподаватель в одном из крупнейших университетов России. ➡️ Записывайтесь на открытый вебинар и получите скидку на большое обучение «Специализация Machine Learning»: https://otus.pw/49Fa3/?erid=2W5zFHaP9np  Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🧠 Как подготовиться к техническому собеседованию с помощью Если ты готовишься к собеседованию в IT и не знаешь, с чего начат
🧠 Как подготовиться к техническому собеседованию с помощью Если ты готовишься к собеседованию в IT и не знаешь, с чего начать — обрати внимание на бесплатный курс от freeCodeCamp, основанный на знаменитом списке задач NeetCode 150. ⚙️ Что такое NeetCode 150? • 🟤 Это отобранные 150 задач с LeetCode, покрывающие всё, что нужно знать: • массивы • строки • хеш-таблицы • деревья и графы • динамическое программирование • стек и очередь • backtracking и двоичный поиск 🎓 Что предлагает курс freeCodeCamp: • 38 часов подробного видеоконтента • Каждая задача разбирается пошагово — с объяснением стратегии и кода • Языки: Python и JavaScript • Полностью бесплатно 📈 Почему это эффективно: • Все задачи — реальный опыт с технических собеседований • Структура курса позволяет идти от простого к сложному • Удобно учиться в своем темпе - Стартуй здесь - Видео с разбором вопросов - Решения Не упусти шанс систематизировать знания и уверенно пройти собеседование! @pythonl

⚡️Создаём свою нейросеть в PyTorch Хотите быстро разобраться в PyTorch и написать свою нейросеть? Мы подготовили для вас веби
⚡️Создаём свою нейросеть в PyTorch Хотите быстро разобраться в PyTorch и написать свою нейросеть? Мы подготовили для вас вебинар, где на практике разберём все этапы создания ML-модели. Вебинар проведет Владислав Агафонов — ML-инженер, ранее работал в Yandex и Huawei. Что будет на вебинаре? 🟠Установим PyTorch в Google Colab и настроим работу на бесплатном GPU; 🟠Поймём, что такое тензоры и почему они — фундамент всех нейросетей; 🟠Скачаем готовый датасет, разберём его структуру и подготовим для обучения; 🟠Научимся использовать DataLoader для эффективной загрузки данных; 🟠Пошагово соберём облегчённую версию классической свёрточной нейронной сети (CNN); 🟠Обучим и протестируем модель. 🕗 Встречаемся 14 мая в 18:30 по МСК, будет много практики, ответы на вопросы и полезные инсайты от эксперта. 😶Зарегистрироваться на бесплатный вебинар

📬 BillionMail — автономная платформа для email-маркетинга и почтовых серверов 🧩 Что это такое BillionMail — это self-hosted
📬 BillionMail — автономная платформа для email-маркетинга и почтовых серверов 🧩 Что это такое BillionMail — это self-hosted open-source платформа, которая позволяет: • Настроить полноценный почтовый сервер • Управлять рассылками email • Отслеживать открытие писем и клики • Контролировать доставляемость и отклонения • Работать через браузерный интерфейс без зависимости от облака 🚀 Ключевые возможности • Управление почтовыми ящиками и доменами • Email-маркетинг с шаблонами, сегментами и аналитикой • Встроенный SMTP-сервер и логика ретраев • Поддержка DKIM, SPF, DMARC • Мониторинг отправок, спама, bounce-статистики • API и интеграции с внешними системами ⚙️ Технологии • Backend: Python • Web-интерфейс: Vue.js • СУБД: MySQL • Mail engine: Postfix + Dovecot • OS: Linux-серверы (Ubuntu/Debian) 🛠 Установка

1. Установите `Docker` и `docker-compose`  
2. Клонируйте репозиторий:
```bash
git clone https://github.com/aaPanel/BillionMail.git
cd BillionMail
Запустите:

docker-compose up -d
🔗 Репозиторий

❓Как найти аномалии в данных с помощью машинного обучения? В мире данных выявление аномалий — ключевая задача, которая помога
Как найти аномалии в данных с помощью машинного обучения? В мире данных выявление аномалий — ключевая задача, которая помогает находить неисправности, мошенничество и отклонения. Без правильных методов вы рискуете упустить важные факты, которые могут повлиять на результаты. На открытом вебинаре 13 мая в 18:00 мск мы подробно разберем, как эффективно искать аномалии в данных с использованием популярных методов, от простых статистических до продвинутых, таких как Isolation Forest и OneClassSVM. 📣 Спикер Мария Тихонова – PhD Computer Science, Senior Data Scientist и преподаватель в одном из крупнейших университетов России. ➡️ Запишитесь на вебинар и получите скидку на большое обучение «Специализация Machine Learning»: https://otus.pw/YfwA/?erid=2W5zFH7af1a  Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🖥 systemd-pilot — это десктопное приложение для управления сервисами systemd на GNU/Linux системах! 🌟 По сути, это графичес
🖥 systemd-pilot — это десктопное приложение для управления сервисами systemd на GNU/Linux системах! 🌟 По сути, это графический интерфейс для команд systemctl. Он позволяет просматривать и управлять системными сервисами, быстро развертывать новые сервисы, а также запускать, останавливать и перезапускать их. Приложение легковесное и использует всего один Python-скрипт. Также предусмотрена поддержка поиска сервисов по имени. 🔐 Лицензия: GPL-3.0 🖥 Github @pythonl

🖥 Шпаргалка по RegEx в Python 📦 Импорт:

import re
🔍 Основные функции модуля re

re.search(pattern, string)     # Ищет первое совпадение (где угодно в строке)
re.match(pattern, string)      # Ищет совпадение только в начале строки
re.fullmatch(pattern, string) # Проверяет, соответствует ли вся строка шаблону
re.findall(pattern, string)   # Возвращает все совпадения в виде списка
re.finditer(pattern, string)  # То же, но как итератор Match-объектов
re.sub(pattern, repl, string) # Замена по шаблону
re.split(pattern, string)     # Разбиение строки по шаблону
# 🧠 Основы синтаксиса шаблонов | Шаблон | Что значит | |---------|-------------------------------------| | . | Любой символ, кроме \n | | ^ | Начало строки | | $ | Конец строки | | * | 0 или больше повторений | | + | 1 или больше | | ? | 0 или 1 повторение | | {n} | ровно n раз | | {n,} | n или больше | | {n,m} | от n до m | | [] | Символьный класс | | [^] | Отрицание символьного класса | | | | Или (`a|b`) | | () | Группа (захват) | | \ | Экранирование спецсимвола | 💡 Примеры

re.search(r'\d+', 'ID=12345')       # Найдёт '12345' (одно или больше цифр)
re.match(r'^\w+$', 'hello_world')   # Вся строка — только буквы/цифры/_
re.findall(r'[A-Z][a-z]+', 'Mr. Smith and Dr. Brown')  # ['Smith', 'Brown']
re.sub(r'\s+', '-', 'a  b   c')     # 'a-b-c'
re.split(r'[;,\s]\s*', 'one, two;three four')  # ['one', 'two', 'three', 'four']
🎯 Захват групп

text = 'Name: John, Age: 30'
match = re.search(r'Name: (\w+), Age: (\d+)', text)
if match:
    print(match.group(1))  # John
    print(match.group(2))  # 30
Группы можно называть:

pattern = r'(?P<name>\w+): (?P<value>\d+)'
match = re.search(pattern, 'score: 42')
match.group('name')   # 'score'
match.group('value')  # '42'
🧱 Комбинированные шаблоны

pattern = r'\b(?:https?://)?(www\.)?\w+\.\w+\b'
text = 'Visit https://example.com or www.test.org'
re.findall(pattern, text)  # [['www.'], ['www.']]
⚠️ Полезные советы • Всегда используйте r'' перед шаблоном, чтобы не экранировать \re.compile(pattern) ускоряет повторное использование • Старайтесь избегать re.match — чаще нужен re.search ✅ Быстрая проверка шаблонов 📍 Онлайн-проверка: [regex101.com](https://regex101.com/) [pythex.org](https://pythex.org/) Хочешь отдельную шпаргалку по re.sub с лямбдами, заменами и функциями внутри, ставь лайк 👍 @pythonl

🐍 Задача с подвохом: Декораторы и мутабельные ловушки Условие: Что выведет следующий код и почему?

def memoize(fn):
    cache = {}
    def wrapper(arg):
        if arg in cache:
            print("Из кэша")
            return cache[arg]
        else:
            result = fn(arg)
            cache[arg] = result
            return result
    return wrapper

@memoize
def add_to_list(val, lst=[]):
    lst.append(val)
    return lst

res1 = add_to_list(1)
res2 = add_to_list(2)
res3 = add_to_list(1)

print(res1)
print(res2)
print(res3)
Вопрос: Что будет выведено? Где здесь двойной подвох? 🔍 Разбор: На первый взгляд кажется, что: 1. add_to_list(1) вернёт [1] 2. add_to_list(2) вернёт [2] 3. add_to_list(1) снова вызовет функцию (или достанет из кэша) Но тут два подвоха: Подвох №1: изменяемый аргумент по умолчанию Аргумент lst=[] создаётся один раз при определении функции. Все вызовы без передачи списка будут использовать один и тот же список. Подвох №2: кэширование по ключу Декоратор memoize кэширует результат по ключу arg. Но функция возвращает список, который изменяется при каждом вызове. Даже если кэш сработает, вы получите тот же объект списка, который менялся между вызовами! 🧮 Что реально произойдёт: - `res1 = add_to_list(1)` → функция вызвана, список становится `[1]` - `res2 = add_to_list(2)` → функция вызвана снова (новый аргумент), список становится `[1, 2]` - `res3 = add_to_list(1)` → аргумент `1` есть в кэше, сработает ветка `print("Из кэша")` и вернётся **ссылку на тот же изменённый список** 🔢 **Вывод:** ``` [1, 2] [1, 2] Из кэша [1, 2] ``` Все результаты указывают на один и тот же изменённый список. 💥 **Почему это важно:** 1️⃣ **Изменяемые аргументы по умолчанию** сохраняются между вызовами 2️⃣ **Кэширование мутабельных объектов** может привести к неожиданным результатам: при возврате списка вы возвращаете не "результат на момент вычисления", а ссылку на объект, который может измениться позже 🛡️ **Как исправить:** 1️⃣ Использовать `lst=None` и инициализировать внутри функции: ```python def add_to_list(val, lst=None): if lst is None: lst = [] lst.append(val) return lst ``` 2️⃣ Если кэшировать мутабельные объекты, лучше возвращать **копию**: ```python import copy cache[arg] = copy.deepcopy(result) ``` ✅ **Вывод:** Декораторы + мутабельные аргументы = ловушка даже для опытных разработчиков. Особенно, когда мутабельные объекты кэшируются и меняются за кулисами. @pythonl

📡 FISSURE — фреймворк для анализа и реверс-инжиниринга радиосигналов. Этот open-source проект объединяет инструменты для раб
📡 FISSURE — фреймворк для анализа и реверс-инжиниринга радиосигналов. Этот open-source проект объединяет инструменты для работы с RF-сигналами: от обнаружения и классификации до атак и автоматизированного тестирования. Инструмент поддерживает популярное SDR-оборудование и возможность развертывания распределённых сенсорных узлов для задач радиомониторинга. Проект активно развивается, в 2024 году добавили Z-Wave-анализ и автоматические триггеры для атак. 🤖 GitHub @pythonl