en
Feedback
Zen of Python

Zen of Python

Open in Telegram

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

Show more

📈 Analytical overview of Telegram channel Zen of Python

Channel Zen of Python (@zen_of_python) in the Russian language segment is an active participant. Currently, the community unites 18 877 subscribers, ranking 6 775 in the Technologies & Applications category and 34 766 in the Russia region.

📊 Audience metrics and dynamics

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

According to the latest data from 14 September, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -147 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 8.58%. Within the first 24 hours after publication, content typically collects 5.58% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 1 620 views. Within the first day, a publication typically gains 1 054 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
  • Thematic interests: Content is focused on key topics such as github, rust, pip, api, install.

📝 Description and content policy

The author describes the resource as a platform for expressing subjective opinions:
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL

Thanks to the high frequency of updates (latest data received on 15 September, 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.

18 877
Subscribers
+124 hours
-297 days
-14730 days
Attracting Subscribers
September '26
September '26
+49
in 5 channels
August '26
+62
in 5 channels
Get PRO
July '26
+46
in 5 channels
Get PRO
June '26
+120
in 2 channels
Get PRO
May '26
+124
in 0 channels
Get PRO
April '26
+84
in 1 channels
Get PRO
March '26
+74
in 3 channels
Get PRO
February '26
+75
in 9 channels
Get PRO
January '26
+136
in 1 channels
Get PRO
December '25
+140
in 5 channels
Get PRO
November '25
+158
in 5 channels
Get PRO
October '25
+258
in 7 channels
Get PRO
September '25
+143
in 1 channels
Get PRO
August '25
+180
in 3 channels
Get PRO
July '25
+248
in 4 channels
Get PRO
June '25
+208
in 6 channels
Get PRO
May '25
+214
in 4 channels
Get PRO
April '25
+189
in 2 channels
Get PRO
March '25
+175
in 6 channels
Get PRO
February '25
+134
in 5 channels
Get PRO
January '25
+89
in 3 channels
Get PRO
December '24
+92
in 1 channels
Get PRO
November '24
+137
in 6 channels
Get PRO
October '24
+95
in 4 channels
Get PRO
September '24
+102
in 3 channels
Get PRO
August '24
+98
in 1 channels
Get PRO
July '24
+82
in 3 channels
Get PRO
June '24
+67
in 1 channels
Get PRO
May '24
+95
in 0 channels
Get PRO
April '24
+148
in 0 channels
Get PRO
March '24
+107
in 1 channels
Get PRO
February '24
+116
in 4 channels
Get PRO
January '24
+109
in 1 channels
Get PRO
December '23
+123
in 6 channels
Get PRO
November '23
+103
in 2 channels
Get PRO
October '23
+140
in 5 channels
Get PRO
September '23
+91
in 0 channels
Get PRO
August '23
+218
in 0 channels
Get PRO
July '23
+211
in 0 channels
Get PRO
June '23
+159
in 0 channels
Get PRO
May '23
+292
in 0 channels
Get PRO
April '23
+193
in 0 channels
Get PRO
March '23
+194
in 0 channels
Get PRO
February '23
+316
in 0 channels
Get PRO
January '23
+424
in 0 channels
Get PRO
December '22
+522
in 0 channels
Get PRO
November '22
+454
in 0 channels
Get PRO
October '22
+257
in 0 channels
Get PRO
September '22
+638
in 0 channels
Get PRO
August '22
+750
in 0 channels
Get PRO
July '22
+745
in 0 channels
Get PRO
June '22
+1 008
in 0 channels
Get PRO
May '22
+622
in 0 channels
Get PRO
April '22
+1 260
in 0 channels
Get PRO
March '22
+975
in 0 channels
Get PRO
February '22
+1 947
in 0 channels
Get PRO
January '22
+597
in 0 channels
Get PRO
December '21
+203
in 0 channels
Get PRO
November '21
+1 278
in 0 channels
Get PRO
October '21
+2 258
in 0 channels
Get PRO
September '21
+376
in 0 channels
Get PRO
August '21
+766
in 0 channels
Get PRO
July '21
+1 065
in 0 channels
Get PRO
June '21
+737
in 0 channels
Get PRO
May '21
+132
in 0 channels
Get PRO
April '21
+2 962
in 0 channels
Get PRO
March '21
+1 825
in 0 channels
Get PRO
February '21
+613
in 0 channels
Get PRO
January '21
+3 216
in 0 channels
Get PRO
December '20
+7 337
in 0 channels
Date
Subscriber Growth
Mentions
Channels
15 September+5
14 September+9
13 September+4
12 September+1
11 September+3
10 September+8
09 September+2
08 September+2
07 September+2
06 September+2
05 September+3
04 September+3
03 September+1
02 September+1
01 September+3
Channel Posts
Как ждать корутины в 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