uk
Feedback
Zen of Python

Zen of Python

Відкрити в Telegram

Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL

Показати більше

📈 Аналітичний огляд Telegram-каналу Zen of Python

Канал Zen of Python (@zen_of_python) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 18 877 підписників, посідаючи 6 775 місце в категорії Технології та додатки та 34 766 місце у регіоні Росія.

📊 Показники аудиторії та динаміка

З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 18 877 підписників.

За останніми даними від 14 вересня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -147, а за останні 24 години на 1, загальне охоплення залишається високим.

  • Статус верифікації: Не верифікований
  • Рівень залученості (ER): Середній показник залученості аудиторії становить 8.58%. Протягом перших 24 годин після публікації контент зазвичай збирає 5.58% реакцій від загальної кількості підписників.
  • Охоплення публікацій: В середньому кожен допис отримує 1 620 переглядів. Протягом першої доби публікація в середньому набирає 1 054 переглядів.
  • Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 4.
  • Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як github, rust, pip, api, install.

📝 Опис та контентна політика

Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL

Завдяки високій частоті оновлень (останні дані отримано 15 вересня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.

18 877
Підписники
+124 години
-297 днів
-14730 днів
Залучення підписників
вересень '26
вересень '26
+49
в 5 каналах
серпень '26
+62
в 5 каналах
Get PRO
липень '26
+46
в 5 каналах
Get PRO
червень '26
+120
в 2 каналах
Get PRO
травень '26
+124
в 0 каналах
Get PRO
квітень '26
+84
в 1 каналах
Get PRO
березень '26
+74
в 3 каналах
Get PRO
лютий '26
+75
в 9 каналах
Get PRO
січень '26
+136
в 1 каналах
Get PRO
грудень '25
+140
в 5 каналах
Get PRO
листопад '25
+158
в 5 каналах
Get PRO
жовтень '25
+258
в 7 каналах
Get PRO
вересень '25
+143
в 1 каналах
Get PRO
серпень '25
+180
в 3 каналах
Get PRO
липень '25
+248
в 4 каналах
Get PRO
червень '25
+208
в 6 каналах
Get PRO
травень '25
+214
в 4 каналах
Get PRO
квітень '25
+189
в 2 каналах
Get PRO
березень '25
+175
в 6 каналах
Get PRO
лютий '25
+134
в 5 каналах
Get PRO
січень '25
+89
в 3 каналах
Get PRO
грудень '24
+92
в 1 каналах
Get PRO
листопад '24
+137
в 6 каналах
Get PRO
жовтень '24
+95
в 4 каналах
Get PRO
вересень '24
+102
в 3 каналах
Get PRO
серпень '24
+98
в 1 каналах
Get PRO
липень '24
+82
в 3 каналах
Get PRO
червень '24
+67
в 1 каналах
Get PRO
травень '24
+95
в 0 каналах
Get PRO
квітень '24
+148
в 0 каналах
Get PRO
березень '24
+107
в 1 каналах
Get PRO
лютий '24
+116
в 4 каналах
Get PRO
січень '24
+109
в 1 каналах
Get PRO
грудень '23
+123
в 6 каналах
Get PRO
листопад '23
+103
в 2 каналах
Get PRO
жовтень '23
+140
в 5 каналах
Get PRO
вересень '23
+91
в 0 каналах
Get PRO
серпень '23
+218
в 0 каналах
Get PRO
липень '23
+211
в 0 каналах
Get PRO
червень '23
+159
в 0 каналах
Get PRO
травень '23
+292
в 0 каналах
Get PRO
квітень '23
+193
в 0 каналах
Get PRO
березень '23
+194
в 0 каналах
Get PRO
лютий '23
+316
в 0 каналах
Get PRO
січень '23
+424
в 0 каналах
Get PRO
грудень '22
+522
в 0 каналах
Get PRO
листопад '22
+454
в 0 каналах
Get PRO
жовтень '22
+257
в 0 каналах
Get PRO
вересень '22
+638
в 0 каналах
Get PRO
серпень '22
+750
в 0 каналах
Get PRO
липень '22
+745
в 0 каналах
Get PRO
червень '22
+1 008
в 0 каналах
Get PRO
травень '22
+622
в 0 каналах
Get PRO
квітень '22
+1 260
в 0 каналах
Get PRO
березень '22
+975
в 0 каналах
Get PRO
лютий '22
+1 947
в 0 каналах
Get PRO
січень '22
+597
в 0 каналах
Get PRO
грудень '21
+203
в 0 каналах
Get PRO
листопад '21
+1 278
в 0 каналах
Get PRO
жовтень '21
+2 258
в 0 каналах
Get PRO
вересень '21
+376
в 0 каналах
Get PRO
серпень '21
+766
в 0 каналах
Get PRO
липень '21
+1 065
в 0 каналах
Get PRO
червень '21
+737
в 0 каналах
Get PRO
травень '21
+132
в 0 каналах
Get PRO
квітень '21
+2 962
в 0 каналах
Get PRO
березень '21
+1 825
в 0 каналах
Get PRO
лютий '21
+613
в 0 каналах
Get PRO
січень '21
+3 216
в 0 каналах
Get PRO
грудень '20
+7 337
в 0 каналах
Дата
Залучення підписників
Згадування
Канали
15 вересня+5
14 вересня+9
13 вересня+4
12 вересня+1
11 вересня+3
10 вересня+8
09 вересня+2
08 вересня+2
07 вересня+2
06 вересня+2
05 вересня+3
04 вересня+3
03 вересня+1
02 вересня+1
01 вересня+3
Дописи каналу
Как ждать корутины в asyncio Два последовательных await не дают конкурентности: вторая корутина запустится после первой. Созд
Как ждать корутины в asyncio Два последовательных await не дают конкурентности: вторая корутина запустится после первой. Создание двух объектов корутин тоже не планирует их выполнение. Для этого нужны задачи, созданные до первого ожидания. У каждого способа свои гарантии. gather() возвращает результаты в порядке аргументов. Если одна задача выбрасывает исключение, оно передаётся вызывающему коду сразу, а остальные задачи продолжают работать. as_completed() отдаёт результаты по мере готовности. wait() делит задачи на завершённые и ожидающие, а его тайм-аут сам ничего не отменяет. В статье Waiting in asyncio автор советует начинать с TaskGroup, а для более гибкого управления выбирать wait(). Здесь «явное лучше неявного» работает буквально.

2
Как собрать LRU-кеш с приоритетами и сроком жизни на Python Обычный LRU-кеш удаляет давно не использовавшиеся записи. Здесь порядок сложнее: сначала просроченные элементы, потом записи с меньшим приоритетом, при равенстве — давно не запрашиваемые. Автор начинает со словаря с операциями в среднем за O(1) и добавляет структуры для срока жизни, приоритета и истории обращений. Наивная очередь хранится в отсортированном списке: минимум легко прочитать, но вставка и удаление с начала требуют линейного времени. Затем очередь ускоряют через bisect, без куч и деревьев. Разбор Адриана на death and gravity показывает, как согласовать несколько структур данных и проверить сроки через внедряемые часы. Это пример разработки от простого рабочего варианта к более быстрому только на стандартной библиотеке.
593
3
Есть одна странная вещь в AI-индустрии. Сегодня лучшая модель для кода — одна. Завтра выходит другая. Через месяц рынок снова
Есть одна странная вещь в AI-индустрии. Сегодня лучшая модель для кода — одна. Завтра выходит другая. Через месяц рынок снова меняется. Но большинство разработчиков всё ещё строят инфраструктуру так, будто им нужно выбрать одного AI-провайдера навсегда. Polza.ai работает наоборот. Вы подключаете один API и получаете доступ к сотням моделей — OpenAI, Claude, Gemini, DeepSeek, Qwen и другим. Нужна другая модель? Меняете её в запросе — и продолжаете работать. Можно сравнить провайдеров и цены и выбрать оптимальный вариант под конкретную задачу. А если один провайдер перестал отвечать, можно включить автомаршрутизацию — запрос автоматически уйдёт к другому. Один баланс, одна интеграция, оплата в рублях. А в кабинете прозрачно видно всё по расходам: модель, провайдер, стоимость, количество токенов и статус каждого запроса. Расходы можно отслеживать в реальном времени. В итоге вам не нужно угадывать, какая модель победит. Вы сами выбираете, что лучше подходит для конкретной задачи, и не привязываетесь к одному провайдеру. Попробовать Polza.ai.
775
4
Как тестировать HTTP-запросы в Python без хрупких моков У асинхронного запроса через HTTPx есть четыре способа проверки. Можн
Как тестировать HTTP-запросы в Python без хрупких моков У асинхронного запроса через HTTPx есть четыре способа проверки. Можно вручную подменить AsyncClient.post, настроить асинхронный мок и проверить аргументы. С усложнением запроса растёт и эта обвязка. Библиотека respx перехватывает запросы HTTPx и возвращает заготовленный ответ. Код короче, зато тест остаётся привязан к HTTPx. Более явный вариант в духе Python: передать клиент в функцию и на тесте заменить его объектом-заглушкой. Для интеграционной проверки приложение Starlette играет роль тестового сервера, а AsyncClient обращается к нему вместо внешней сети. В статье есть код всех четырёх вариантов. Выбирайте respx для компактной подмены, заглушку вместо сторонней библиотеки для моков, тестовый сервер для проверки связки целиком.
830
5
Как ускорить сериализацию в Django Rest Framework В бенчмарке на Python 3.7, Django 2.1.1 и DRF 3.9.4 объект User сериализова
Как ускорить сериализацию в Django Rest Framework В бенчмарке на Python 3.7, Django 2.1.1 и DRF 3.9.4 объект User сериализовали 5000 раз без обращений к БД. ModelSerializer потратил 12,8 с, а функция справилась за 0,034 с. Разница составила 377 раз. Профилировщик показал цену автоматизации: ModelSerializer заново строил поля из метаданных модели и готовил проверки. Режим только для чтения сократил время до 7,4 с, а Serializer с явно объявленными полями уложился в 2,1 с. Явное оказалось не только лучше, но и быстрее. Для нагруженного API отделите время запроса к БД от сериализации. Если тормозит последняя, сделайте выходные поля доступными только для чтения или замените ModelSerializer на Serializer; для предельной скорости сравните с обычной функцией. Код и профили cProfile есть в разборе производительности DRF.
943
6
Как вызывать асинхронный Python из синхронного кода Если оборачивать каждый вызов в asyncio.run(), Python каждый раз создаёт и закрывает цикл событий. Для одиночного запуска это нормально, но между вызовами не сохранятся привязанные к циклу ресурсы, например aiohttp.ClientSession с пулом соединений. С Python 3.11 asyncio.Runner позволяет выполнять несколько корутин в одном цикле. Однако пока цикл занят, синхронная часть приложения ждёт. Следующий шаг: перенести цикл в отдельный поток и передавать ему корутины из обычных функций. В подробном разборе автор собирает ThreadRunner, который запускает корутины и превращает асинхронные итераторы в обычные. Получается точечный мост для существующего синхронного приложения без переписывания всей цепочки в async def.
1 006
7
Ко Дню программиста AvitoTech приготовил кое-что особенное! Совместно со студией FU2RE и 3D-художником Dmitriev Video команда
Ко Дню программиста AvitoTech приготовил кое-что особенное! Совместно со студией FU2RE и 3D-художником Dmitriev Video команда запустила большой портал в прошлое — эмулятор 2006 года будущего разработчика. Внутри олдскульные игры и викторины, за прохождение которых начисляются баллы, поднимающие позицию в рейтинге. 15 сентября трёх лучших игроков ждёт суперпак настоящих разрабов: салфетка на монитор из коллаборации с Elnik, плед, сумка и плюшевый талисман — кот Б/У. Так что успеть сыграть ещё можно! P. S. А в канале AvitoTech до 13 сентября каждый день выходили праздничные посты. Присмотритесь, возможно, подарки спрятаны и в них 😉
1 076
8
asyncio учат до первого исключения внутри задачи, а дальше начинается импровизация Асинхронный код в проекте обычно дорастает
asyncio учат до первого исключения внутри задачи, а дальше начинается импровизация Асинхронный код в проекте обычно дорастает до пары корутин и gather, а всё, что дальше, каждый достраивает по памяти: где ловить ошибку из задачи, упавшей молча, чем связывать корутины, кроме передачи результата в аргументах. У Real Python есть разбор asyncio целиком, от корутин до выбора задач под них. Что в нём помимо привычного async/await: • чем asyncio REPL (python -m asyncio) удобнее обёртки asyncio.run вокруг каждого эксперимента; • как корутины стыкуются через asyncio.Queue, а не через цепочку await; • что происходит с исключением, которое всплыло внутри задачи; • в каких задачах asyncio выигрывает, а в каких только добавляет слой. Открывать стоит ради последних двух пунктов: остальное вы, скорее всего, уже пишете руками. #python
1 043
9
Потоки ускоряют ввод-вывод, пока мелкая работа не упирается в процессор Вы увеличиваете число рабочих потоков ThreadPoolExecutor, настраиваете пул соединений, а пропускная способность перестаёт расти. Даже короткий вычислительный участок повторяется в каждом задании и постепенно отбирает выигрыш от новых потоков. Перейти на ProcessPoolExecutor можно, но тогда вход приходится разбивать на пачки, менять код и платить памятью за процессы. Автор собирает гибрид: несколько процессов, внутри каждого пул потоков, с привычным интерфейсом исполнителя задач. В разборе ProcessThreadPoolExecutor остались возврат результатов через собственные объекты Future, гибель рабочего процесса и влияние свободнопоточного Python на всю конструкцию.
1 098
10
Когда isinstance() мало, TypeGuard может удивить С isinstance() всё просто: mypy сам сужает объединение типов в каждой ветке.
Когда isinstance() мало, TypeGuard может удивить С isinstance() всё просто: mypy сам сужает объединение типов в каждой ветке. Сложнее, если объект приходится распознавать по содержимому, например проверять поля словаря. Тогда проверку выносят в отдельный предикат, а TypeGuard сообщает анализатору, какой тип прошёл условие. На этом месте интуиция может подвести: автор несколько раз отказывался от TypeGuard и заканчивал комментарием # type: ignore. В разборе TypeGuard и TypeIs он начинает с TypedDict для Person и объясняет, почему TypeIs соответствует ожиданиям лучше. Стоит прочитать перед следующим пользовательским предикатом: в статье осталось главное, почему TypeIs оказался тем интерфейсом, которого автор ожидал от TypeGuard.
1 120
11
Атрибуты модуля можно создавать только при обращении Если часть API не нужна во время запуска, готовить её заранее необязател
Атрибуты модуля можно создавать только при обращении Если часть API не нужна во время запуска, готовить её заранее необязательно. Начиная с Python 3.7, в модуле можно определить __getattr__: он обрабатывает обращение к имени, которого в модуле нет. Для нужного имени функция возвращает динамически созданное значение, для остальных поднимает AttributeError. Так создание атрибута переносится на момент, когда он действительно понадобился, а запуск не ждёт этой работы. Лень здесь вполне питонична, пока ошибка для неизвестных имён остаётся явной. В разборе атрибутов модуля есть минимальный пример с обычной функцией, динамическим атрибутом и AttributeError для неизвестного имени.
1 106
12
Все дела подождут, потому что сегодня ваш день! Поздравляем с Днем программиста и желаем меньше багов и больше фич, меньше со
Все дела подождут, потому что сегодня ваш день! Поздравляем с Днем программиста и желаем меньше багов и больше фич, меньше созвонов и больше фокуса, меньше тасок с пометкой «срочно» и больше времени на отдых. Забирайте подарок из нашей IT-коробки. Мы уверены, этот презент точно пригодится вам в работе: https://tprg.ru/la2S
1 061
13
Сигналы Django подводят в критичных сценариях, но получателей можно выполнять надёжнее Сигналы Django удобно разрывают зависимости между модулями. В обработке платежа этого мало: способ доставки сигналов остаётся подвержен неожиданным сбоям. Слабая связанность полезна, но надёжность от неё не появляется. Альтернативный способ запускает получателей как фоновые задачи Django Tasks. В материале решение проверяют на процессе создания платежа и заказа, связывают с транзакциями базы данных, моделируют сбои и отдельно рассматривают атомарность. В статье Reliable Django Signals остались тесты надёжных сигналов, ограничения подхода и направления дальнейшей работы. Стоит прочитать до того, как доверить сигналам этап процесса, который нельзя потерять из-за неожиданного сбоя.
1 105
14
Контекст запроса можно добавить во все логи без ручного extra В ASGI-приложении запрос заканчивается не там, где начался: обр
Контекст запроса можно добавить во все логи без ручного extra В ASGI-приложении запрос заканчивается не там, где начался: обработчик вызывает корутины из других слоёв, и каждая пишет собственные сообщения. Если добавить user_id и platform через extra только в обработчике, запись из вложенной функции останется без этих полей. Явное лучше неявного, но собирать один и тот же контекст в каждом слое и вручную передавать его дальше — дорогая трактовка PEP 20. В разборе распространения контекста логов показано, как общие поля попадают в сообщения из разных слоёв ASGI-приложения без ручной передачи по всей цепочке вызовов.
1 127
15
Как выбрать быстрый способ читать Excel из Python без сюрпризов с типами Когда в Python нужно разобрать большой XLSX, привычн
Как выбрать быстрый способ читать Excel из Python без сюрпризов с типами Когда в Python нужно разобрать большой XLSX, привычный Pandas оказывается лишь одной из шести опций. Сравнивать их только по секундомеру мало: ещё важны сохранность типов и корректность значений. Питоничность здесь начинается с контракта: каждая реализация возвращает Iterator[dict[str, object]], поэтому потребитель может обрабатывать строки по одной. Для теста взяли файл на 25 МБ с 500 тысячами строк, а время измеряли полным проходом без обработки данных. В сравнении Haki Benita остались итоговые замеры для Pandas, Tablib, Openpyxl, LibreOffice, DuckDB и Calamine, а также разбор типов и корректности. Полезный ориентир перед тем, как ставить очередную зависимость ради одной таблицы.
1 128
16
Как найти хеш пароля в 37 ГБ меньше чем за миллисекунду Офлайн-проверка пароля по списку утечек выглядит как обычный поиск, пока Pwned Passwords не распаковывается в текстовый файл на 37 ГБ. Минимальный вариант на Python работает, но оказывается слишком медленным. Автор профилирует код, пробует пропускать части файла, применяет двоичный поиск, строит отдельный индекс и переводит его в двоичный формат. Вполне по дзену: сначала измерить, потом усложнять. Результат: поиск занимает меньше миллисекунды. В разборе оптимизации можно проследить, почему первые ускорения не уложились в цель, как генерируется и читается индекс и какие структуры данных автор рассматривает в финале.
6 935
17
Внешние ключи Django могут оставить лишние индексы и заблокировать миграцию В модели всё выглядит аккуратно: несколько ForeignKey, on_delete=PROTECT и unique_together. Но внешний ключ связывает две таблицы, поэтому обеспечить такое ограничение сложнее, чем уникальность или проверку значения. Явное лучше неявного, а неявного поведения здесь хватает. Статья How to Get Foreign Keys Horribly Wrong разбирает, где появляются дублирующие индексы и как обнаружить блокирующую миграцию. Затем переходит к безопасному переносу внешнего ключа, обратимым операциям и конкурентному созданию индексов. Перед следующим изменением схемы по ссылке стоит проверить ещё две вещи: когда нужен частичный индекс и в каком порядке выполнять миграционные операции.
1 197
18
Сотни тысяч корутин лучше не запускать разом Если запустить всю пачку асинхронных операций сразу, вы нагрузите вызываемые сервисы, а всё необходимое для работы окажется в памяти одновременно. Ограничение конкурентности нужно до того, как очередь съест ресурсы. Питоничная цель напоминает imap_unordered(): одновременно выполнять не больше limit операций и отдавать результаты по мере готовности. asyncio.Semaphore кажется очевидным ответом из Stack Overflow, но автор предупреждает: лучший вариант другой. В разборе ограничения конкурентности сопоставлены gather(), Semaphore, as_completed(), Queue и wait(). Читайте, чтобы понять, почему автор выбрал wait() и как собрал асинхронный map_unordered() с поддержкой итерируемых объектов и исключений.
1 214
19
Дескриптор может удерживать ваши объекты, но слабые ссылки это исправят Вы удалили экземпляр, а память не освободилась. Причи
Дескриптор может удерживать ваши объекты, но слабые ссылки это исправят Вы удалили экземпляр, а память не освободилась. Причина может прятаться в дескрипторе: если он записывает проверенные экземпляры в обычный dict, словарь сохраняет сильные ссылки. Сборщик мусора не удалит такие объекты, и утечка будет расти понемногу. Если хранить сами экземпляры всё-таки нужно, замените словарь на слабый: import weakref _seen = weakref.WeakKeyDictionary() Слабый ключ не мешает сборщику удалить объект, когда на него больше нет сильных ссылок. Питонично: сообщаем, кого видели, но не берём опеку над его временем жизни. В разборе Memory leakage in Python descriptors есть полный пример утечки и её исправления. Проверьте дескрипторы, которые копят экземпляры после валидации.
1 206
20
Trame v4 добавил управление React-компонентами из Python При создании приложения на Python-фреймворке trame теперь можно выбр
Trame v4 добавил управление React-компонентами из Python При создании приложения на Python-фреймворке trame теперь можно выбрать client_type="react" и сохранить привычные механизмы состояния, событий и триггеров. Связки react.Bind и react.Callback синхронизируют серверную логику с интерфейсом — без отдельного REST API и самописного обмена данными. Обновление прежде всего пригодится организациям с готовыми React-библиотеками и дизайн-системами: их можно задействовать без полной переделки фронтенда. Но смены фаворита пока нет — Vue.js остаётся стандартным и наиболее полным клиентом, а Kitware не обещает паритета возможностей. В статье перечислены поддерживаемые на старте компоненты и варианты рендеринга.
1 227