@zen_of_python
Zen of Python
Telegram channel @zen_of_python: 18.8K subscribers, 1K views per post, score 31
31FAhead of 1 in 10 channels in its category
Category midrange 33–52This channel 31
- 18.8K
- Subscribers
- 1K
- Median views over 30 days
- 5.5%
- Views / subscribers over 30 days
- 96
- Posts over 30 days
Data as of October 1, 2026
About the internals of Python and building software with it: breakdowns of typing, descriptors, async patterns and standard library quirks for developers who want to understand what happens under the hood. As of 13 September: subscribers 18.9K, on par with the category median, and ER also sits at the category median at 8.7%. Recent posts covered TypeGuard for cases where isinstance() isn't enough, module-level __getattr__ available since Python 3.7, the reliability limits of Django signals in payment processing, and a comparison of ways to read Excel files in Python without losing type accuracy. Another post walked through finding a password hash inside a 37 GB breach dump in under a millisecond. Post output runs well above the category median.
catalog description About the channel, by its author
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: tprg.ru/rules Другие каналы: @tproger_channels Сайт: tprg.ru/site Регистрация в перечне РКН: tprg.ru/xZOL
Common questions
- How many subscribers?
- Subscribers: 18.8K. Median views per post: 1K. Views per subscriber: 5.5%. Measured on October 1, 2026.
- How often are posts published?
- Posts in the last 30 days: 96 — that is several times a day. Measured on October 1, 2026.
- Does this channel have a Telegram tick?
- No Telegram tick.
- Who runs this channel page in the catalog?
- Nobody yet. If this is your channel, claim the page: you will be able to reply to reviews and see its stats.
Is this your channel?
Claim it — accurate metrics, replies to reviews as the channel, and an owner badge on the page.
Verify ownershipTakes a minute: a post with a code, or the bot as an admin
Your page on tg.place
Know the owner?
Forward them this message — they can verify their rights and collect what has piled up: page statistics and replies to reviews.
18,96918,808
Oct 118,808
Hover the chart or swipe it — we show the day.
| What it is made of | |
|---|---|
| Engagement | 2.9 of 30 |
| Growth quality | 12 of 20 |
| Reactions and forwards | 4.5 of 15 |
| Consistency | 3.6 of 12 |
| Trust | 3.8 of 8 |
| Reviews | not enough datano reviews yet |
Score 31 — from 5 of 6 signals: the rest are not measured yet. Methodology
Latest posts
Posts are in Russian — that is what the channel publishes.
- Как не сломать pickle собственным исключением Python Если конструктор исключения принимает field и reason, не заменяйте их готовой строкой при вызове super().__init__(). Иначе в args останется один элемент, а при восстановлении BaseException.__reduce__ передаст его обратно конструктору. Тот ждёт два аргумента, поэтому распаковка завершится TypeError. Так же ломаются copy.copy() и передача исключения между процессами. Питоничный инвариант прост: args должны оставаться корректным списком аргументов для вашего __init__. Передавайте в базовый класс исходные field и reason, храните структурированные данные в атрибутах, а читаемое сообщение формируйте в __str__. Пример с ValidationError показывает поломку и совместимый вариант класса.
- Как выстроить защиту цепочки поставок Python Эшелонированная схема защиты начинается с собственного кода: Ruff находит секреты, слабую криптографию и запросы без тайм-аута до публикации пакета. Зависимости и их криптографические хеши фиксируют через uv lock или uv pip compile --generate-hashes. Затем pip-audit ищет в CI известные уязвимости, а SBOM помогает понять, затронул ли проект компрометированный пакет. Trusted Publishing с OIDC заменяет долгоживущие API-токены. Хеши не распознают изначально вредоносный пакет, а аудит пропускает неизвестные уязвимости. Поэтому начать стоит с Ruff и фиксации зависимостей, затем добавить аудит и SBOM.
- Пакетная обработка в Python: где strict=True не спасает запись С Python 3.12
itertools.batched()лениво забирает из итератора элементы только для очередного кортежа. Поток из файла, курсора или генератора не приходится сначала превращать в список: памяти для группировки нужно столько, сколько занимает один пакет, а не весь источник. С Python 3.13 параметрstrict=Trueотклоняет неполный последний пакет. Но ошибка возникает во время итерации. При 250 записях и размере пакета 100 первые 200 уже могут попасть в базу, прежде чем оставшиеся 50 вызовутValueError. Строгость проверяет форму входа, а не делает цикл транзакцией. Явное лучше неявного: для записи по принципу «всё или ничего» заранее проверьте конечный источник либо используйте транзакцию системы назначения. Разбор itertools.batched() также объясняет, почемуlist(batched(...))лишает обработку преимущества ленивости. - Как воспроизводить гонки потоков Python с помощью blanket Обычно порядок выполнения потоков выбирает ОС, поэтому редкая гонка превращает тест в лотерею. blanket оборачивает примитивы
threading, а тест сам решает, какой поток продолжит работу. Пять повторов перестают быть стратегией тестирования. ВScenarioможно заставить поток B захватить блокировку раньше A, задать порядок освобождения барьера или выбрать поток, который разбудитnotify(). Каждый такой вызов приостанавливается в планировщике blanket, поэтому сценарий повторяется одинаково. Это полезно при переносе библиотек на Python без GIL, но управление порядком потоков работает на границах примитивов синхронизации. Для гонки внутри гологоcounter += 1нужна дополнительная контрольная точка. blanket закрепляет известный порядок в регрессионном тесте, а не перебирает все возможные гонки. - Как отменять задачи в heapq и сохранять порядок при равных приоритетах
heapqсравнивает кортежи по полям. Поэтому запись(приоритет, задача)при равных приоритетах либо сравнит сами задачи, либо упадёт, если объекты несравнимы. Надёжная форма:(приоритет, номер, задача), где номер выдаётitertools.count(). Он сохраняет порядок добавления и не допускает сравнения задач. Искать и удалять произвольную запись по идентификатору куча эффективно не умеет. Для отмены и смены приоритета можно хранить активные записи в словаре: старую помечать удалённой, новую добавлять в кучу, а помеченные пропускать при извлечении. Лень здесь вполне питонична. У этой схемы очереди есть цена: устаревшие записи занимают память, пока не доберутся до вершины. Если обновлений много, а извлечений мало, кучу стоит периодически пересобирать из активных записей. - Как битовые множества сокращают память моделей Pydantic Explicit is better than implicit, но хранить набор явно переданных полей в полноценном Python
setоказалось накладно. Memray показал: созданиеmodel_fields_setзаняло почти 800 МБ на миллионе экземпляров модели с семью полями. Поскольку поля модели упорядочены, каждому можно назначить номер бита: 1 означает, что значение передали при создании, 0 — что использовано значение по умолчанию. Имена дополнительных полей, которых нет в схеме, остаются в отдельномset. В разборе реализации показано, как выбиратьu8,u16или вектор для моделей разного размера. На тесте с небольшими значениями замена сократила память на 55%. Полезный пример того, почему профилировать стоит не только__dict__, но и служебные структуры каждого экземпляра. - Как проверять плагины через контракт Pydantic и FastAPI Сервис может отвечать по нужным адресам и всё же возвращать несовместимые данные. В схеме общего API-контракта модели Pydantic для
/ready,/catalogи/encode/вынесены в отдельный пакет. Плагин использует эти модели в обработчиках FastAPI, а платформа проверяет ими ответы при регистрации. Если структура не совпадает, сервис не подключается. Контракт фиксирует и ответственность: разбиением входных данных управляет плагин, а проверки доступа вынесены в зависимости FastAPI. Это ловит несовместимый формат до подключения, но не проверяет правильность вычислений. - Как OpenBLAS ускоряет NumPy в браузере Раньше браузерная сборка NumPy выполняла
np.matmulобычными циклами на C, которые не учитывали кэш процессора и векторные инструкции. Теперь NumPy 2.5.3 из Emscripten-forge по умолчанию подключает OpenBLAS 0.3.34 для WebAssembly. На квадратных матрицах 1024 × 1024 умножение ускорилось примерно в 30,92 раза дляfloat32и в 14,90 раза дляfloat64. Прирост зависит от операции. Функцииnp.linalgускорились слабее, поскольку реализация LAPACK ещё не оптимизирована специально для WebAssembly. Экспериментальная OpenBLAS 0.3.35 добавляет новые векторные ядра, а сборка с Relaxed SIMD даёт дополнительное ускорение только в браузерах с поддержкой этого расширения. Бенчмарки и настройки стенда помогают сравнивать сборки по размеру матриц, типу данных и браузеру, а не переносить одну красивую цифру на весь NumPy. - partial или lambda: как специализировать колбэк без сюрпризов
functools.partialзаранее связывает часть аргументов и возвращает вызываемый объект. Сохранённые именованные аргументы работают как значения по умолчанию: при вызове их можно переопределить. Проверки новой сигнатуры при этом нет, поэтому повторная передача одного параметра закончитсяTypeError. Разница сlambdaпроявляется во времени связывания. Лямбда получает текущее значение имени при выполнении, аpartialсохраняет переданный объект при создании. Но копии не делает: изменения связанного списка будут видны, а долгоживущий колбэк удержит контекст в памяти. Сравнение двух способов специализации функций сводится к питоничному правилу: если нужно только связать аргументы, подходитpartial. Если адаптер проверяет данные, логирует или преобразует аргументы, яснее написать именованную функцию черезdef. - Как коллизии превращают построение set в Python в квадратичную задачу Привычное O(1) для
setиdictпредполагает, что коллизии редки. Если много ключей получают одинаковый хеш, интерпретатору приходится искать свободные ячейки и перебирать кандидатов при проверке вхождения. O(1) здесь полезная модель, а не договор с интерпретатором. В эксперименте с подобранными целыми числами удвоение размера почти учетверяло время: построение множества из 16 000 элементов заняло 1072 мс, а из 100 000 — 45 секунд. Проверка всех элементов росла так же. Отдельно автор измерил влияние процессорного кеша: поиск случайных строк вdictзамедлялся по мере роста таблицы даже без коллизий. Это другой механизм, поэтому при неожиданной деградации стоит отдельно проверять распределение хешей и размер данных.
The channel in numbers
- Created
- November 27, 2020
- Photos
- 1.4K
- Videos
- 202
- Files
- 38
- Links
- 3.6K
Telegram data as of October 1, 2026
Contacts
- Ads
- @tproger_sales_bot
From the channel description
Reviews
Leave a review
No reviews yet. Yours would be the first.