ch
Feedback

不要被骗子欺骗!Telemetrio 会找到并标记这些频道 👉 如果想查看标记,请订阅

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 732 名订阅者,在 技术与应用 类别中位列第 6 967,并在 俄罗斯 地区排名第 35 153 位。

📊 受众指标与增长动态

自 невідомо 创建以来,项目保持高速增长,吸引了 18 732 名订阅者。

根据 25 十月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -83,过去 24 小时变化为 -12,整体触达仍然可观。

  • 认证状态: 未认证
  • 互动率 (ER): 平均受众互动率为 6.16%。内容发布后 24 小时内通常能获得 4.21% 的反应,占订阅者总量。
  • 帖子覆盖: 每篇帖子平均可获得 1 154 次浏览,首日通常累积 788 次浏览。
  • 互动与反馈: 受众积极参与,单帖平均反应数为 1。
  • 主题关注点: 内容集中在 github, rust, pip, api, install 等核心主题上。

📝 描述与内容策略

作者将该频道定位为表达主观观点的平台:
“Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL”

凭借高频更新(最新数据采集于 26 十月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。

18 732
订阅者
-1224 小时
-317 天
-8330 天
吸引订阅者
10月 '26
十月 '26
+68
在0个频道中
九月 '26
+89
在5个频道中
Get PRO
八月 '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个频道中
日期
订阅者增长
提及
频道
26 十月0
25 十月+1
24 十月0
23 十月+3
22 十月+2
21 十月+1
20 十月0
19 十月+4
18 十月+2
17 十月+1
16 十月+3
15 十月+1
14 十月+7
13 十月+1
12 十月+2
11 十月+5
10 十月+4
09 十月+10
08 十月+5
07 十月+2
06 十月+1
05 十月+3
04 十月0
03 十月+4
02 十月+1
01 十月+5
频道帖子
ChainMap читает все слои, а пишет только в первый Для конфигурации удобно читать переопределения поверх значений по умолчанию. ChainMap делает это без предварительного слияния словарей:
from collections import ChainMap

defaults = {"timeout": 30}
overrides = {}
config = ChainMap(overrides, defaults)
config["timeout"] = 5
print(overrides, defaults)
Вывод: {'timeout': 5} {'timeout': 30}. Чтение ищет ключ в слоях по очереди, а присваивание меняет только первый словарь. Туда же направлены update и удаление. Ключ, который есть лишь в нижнем слое, удалить через цепочку не получится. Это живое представление исходных словарей, а не снимок: изменения в них видны через ChainMap. И копирования вложенных объектов здесь тоже нет. Если прочитанное значение оказалось общим списком, его изменение затронет этот список в исходном слое. Правило записи в первый словарь не означает изоляцию всех доступных через него данных.

2
Цикл в графе: независимые задачи ещё можно выполнить Задача a ждёт b, а b ждёт a. Полностью упорядочить такой граф нельзя. Но если рядом есть независимая задача free, ошибка цикла не обязана останавливать и её. У graphlib.TopologicalSorter вызов prepare() поднимет CycleError. После обработки этого исключения можно продолжить через get_ready(): он выдаст узлы, которым не мешает цикл. В примере с a ↔ b и отдельным free доступен только free. Завершив его обработку, вызовите done("free"). Важно различать «готов к запуску» и «выполнен». Именно done разблокирует зависящие узлы. Если после независимой части is_active() вернул False, это не доказывает завершение всего графа: цикл остался. Такой частичный прогресс разрешён контрактом TopologicalSorter с Python 3.9. Сам CycleError сообщает один обнаруженный цикл, а не все сразу.
717
3
urljoin спокойно заменит ваш домен Базовый адрес в первом аргументе не удерживает результат внутри вашего сайта. Второй аргумент может содержать собственный домен даже без схемы: from urllib.parse import urljoin print(urljoin( "https://safe.example/users/", "//other.example/admin", )) Получится https://other.example/admin. Сетевой путь //host берёт схему из базы, а домен задаёт свой. Полный абсолютный URL во втором аргументе тоже может заменить адрес. Это штатное поведение, о котором прямо предупреждает документация urljoin. Если собираете ссылку из пользовательского ввода для перенаправления или серверного запроса, нужна отдельная политика допустимых адресов. urlsplit поможет выделить схему, хост и путь, но сам по себе не проверит, можно ли им доверять. Успешно разобранный URL ещё не означает, что по нему безопасно переходить.
892
4
bisect ждёт ключ, insort ждёт запись У двух функций из одного модуля разные требования к искомому значению. Если записи отсортированы по числовому полю, в bisect_left передайте число, а в insort саму запись: from bisect import bisect_left, insort rows = [("Ada", 10), ("Lin", 30)] print(bisect_left(rows, 20, key=lambda row: row[1])) insort(rows, ("Sam", 20), key=lambda row: row[1]) print(rows) Поиск вернёт 1, а вставка поставит ("Sam", 20) между Ada и Lin. У bisect_left функция key применяется только к элементам списка. У insort она применяется и к вставляемому объекту для поиска позиции, но в список попадает исходный объект. Параметр key доступен с Python 3.10. Список должен быть уже отсортирован по тому же ключу. И ещё одно ограничение из документации bisect: логарифмический поиск не делает вставку дешёвой. Сдвиг элементов списка по-прежнему занимает O(n).
922
5
Подмена в pytest может закончиться раньше теста Тест сначала проверяет код с подменённой зависимостью, а затем хочет вызвать настоящий объект. Если все изменения сделаны через обычную фикстуру monkeypatch, автоматический откат произойдёт лишь после завершения теста или использующей её фикстуры. Сузить срок жизни можно через with monkeypatch.context() as m. Подмены, зарегистрированные через m.setattr и другие методы этого контекста, откатятся при выходе из блока. После него можно проверять поведение с восстановленной зависимостью, не завершая тест. В примере pytest так ограничивают подмену functools.partial. Это важно: стандартной библиотекой пользуется и сам pytest, поэтому глобальная подмена может сломать тестовый раннер. Короткий контекст уменьшает время воздействия, но не делает любую подмену безопасной. Для своего кода документация рекомендует явную передачу зависимостей, если это возможно.
928
6
bind принимает строку в параметр int inspect.Signature.bind проверяет, можно ли разложить аргументы по параметрам функции. Аннотация int при этом не превращается в проверку типа: from inspect import signature def ship(item: int, *, retries=2): return item, retries bound = signature(ship).bind("text") print(bound.arguments) bound.apply_defaults() print(bound.arguments) Первый вывод: {'item': 'text'}. Второй добавляет 'retries': 2. bind не вставляет пропущенные значения по умолчанию в arguments, для этого нужен apply_defaults(). Саму ship этот код не вызывает. Так можно разбирать вызовы в декораторе или диспетчере и получать TypeError при несовместимых аргументах. Но проверку значений нужно организовать отдельно. В документации bind есть и bind_partial, который разрешает пропустить обязательные параметры. Для проверки полного вызова это уже слишком мягкий контракт.
970
7
Pydantic может создать модель с неверными данными Наличие объекта BaseModel ещё не доказывает, что данные прошли проверку. В Pydantic V2 model_construct() создаёт модель без валидации. Если поле объявлено вложенной моделью, переданный туда словарь сам в неё не превратится. Метод не отключает вообще всё: значения полей по умолчанию по-прежнему подставляются. Зато extra="forbid" при таком создании не даст привычной ошибки за лишнее поле. Оно будет проигнорировано. Поэтому контракт обычного конструктора нельзя механически переносить на model_construct. В документации метода его предлагают для уже проверенных или заведомо доверенных данных. Выбирать этот путь только ради скорости тоже рано: в V2 разрыв сократился, а на простых моделях обычная валидация может оказаться быстрее. Прежде чем убрать проверку, измерьте свой сценарий и определите, кто теперь отвечает за корректность вложенных объектов.
1 042
8
В строке ABA у groupby три группы Две буквы A не объединятся, потому что между ними стоит B. itertools.groupby начинает новую группу каждый раз, когда меняется ключ соседнего элемента: from itertools import groupby print([(key, list(group)) for key, group in groupby("ABA")]) Результат: [('A', ['A']), ('B', ['B']), ('A', ['A'])]. Это удобно для серий одинаковых событий в потоке. Для объединения всех записей с одним ключом данные обычно сначала сортируют по тому же key. Получить поведение SQL GROUP BY одним названием функции не выйдет. Есть и ловушка со сроком жизни: итераторы групп используют общий исходный итератор. Если группа понадобится позже, прочитайте её в список до перехода к следующей, как в примере. Эти детали описаны в контракте groupby. Сортировка и сохранённые списки требуют памяти, поэтому для подсчётов по несортированному потоку может лучше подойти словарь.
1 100
9
Задача в очереди, а строки в базе ещё нет Внутри transaction.atomic() вы создаёте заказ и сразу отправляете его ID фоновому воркеру. Воркер может успеть обратиться к базе раньше коммита. Или транзакция откатится, а задача уже останется в очереди. В Django 5.2 для такого сценария есть transaction.on_commit. Зарегистрируйте функцию отправки задачи внутри atomic. Она будет вызвана после успешного коммита, а при откате отброшена. Callback из вложенного блока ждёт внешнего коммита и не выполняется, если произошёл откат к его savepoint. В обычном режиме autocommit без открытой транзакции вызов происходит сразу. У этой границы есть предел: база уже закоммичена, когда callback обращается к брокеру. Ошибка отправки не откатит заказ и не гарантирует повторную доставку задачи. on_commit устраняет преждевременный запуск, но надёжность передачи между базой и очередью нужно проектировать отдельно.
1 154
10
Decimal начинается до первого float Две почти одинаковые записи дают разное округление. На Python 3.14.4 этот пример выводит сначала 2.68, затем 2.67: from decimal import Decimal, ROUND_HALF_EVEN cent = Decimal(".01") print(Decimal("2.675").quantize(cent, rounding=ROUND_HALF_EVEN)) print(Decimal(2.675).quantize(cent, rounding=ROUND_HALF_EVEN)) Decimal из строки получает ровно заданную десятичную дробь. Из float он точно переносит уже существующее двоичное значение, которое чуть меньше 2.675. Конструктор не может восстановить исходное намерение по округлённому представлению числа. Если вход изначально десятичный, сохраняйте строку до создания Decimal. Метод quantize задаёт нужный показатель степени, а режим округления выбирайте по правилам расчёта. ROUND_HALF_EVEN в примере округляет точную середину к чётной последней цифре. Это конкретная политика, а не универсальное правило для любых сумм.
1 158
11
На PyPI снова нашли заражённый LiteLLM, популярный шлюз к API разных LLM: версия 1.107.0 провисела около двух часов и ставила стилер. Он срабатывает при старте любого Python-процесса в окружении, даже если litellm никто не импортирует. Заражены были и Docker-образы с тегами latest, main-latest и main-stable. Сейчас версия снята с PyPI, а BerriAI подтвердила удаление образов. Стилер забирает SSH-ключи, доступы к AWS, GCP, Azure и Kubernetes, пароли из браузеров, секреты CI, токены Claude Code, Cursor, Codex и других ИИ-инструментов, а при доступном DATABASE_URL пытается выгрузить из базы LiteLLM-прокси ключи провайдеров. На Linux и macOS отдельный демон раз в час готов скачать и выполнить новый код, хотя вторая стадия так и не была замечена. По provenance образов исследователи Upwind нашли, что релиз собрал официальный конвейер BerriAI из репозитория-двойника Berri-AI/litellm. Как атакующий это провернул, пока неизвестно. В марте проект уже взламывали через украденные учётки публикации, у нынешней атаки другие код и инфраструктура, связь между ними не установлена. Если ставились wheels 1.107.0 или запускались заражённые образы, доступные им секреты считаются скомпрометированными. До запуска pip из shell удаляют cook.pth, cook.py, sitecustomize.py и их файлы в __pycache__, останавливают фоновый Python-демон, пересобирают окружения с litellm==1.106.2 и меняют секреты. Индикаторы заражения собраны в issue проекта. @neuro_channel
1 094
12
Зелёный CI с устаревшим lock-файлом Вы добавили зависимость в pyproject.toml, а обновлённый uv.lock забыли закоммитить. Флаг --frozen может показаться строгой проверкой, но у него другой контракт: использовать существующий lock-файл, не проверяя его соответствие проекту. Чтобы заметить такое расхождение, нужен --locked. По документации uv, команда завершится ошибкой, если lock-файл требует обновления. Например, uv sync --locked проверит его перед синхронизацией окружения. Отдельная проверка без установки зависимостей: uv lock --check. «Актуальный» здесь означает согласованный с метаданными проекта. Выход новой версии пакета на PyPI сам по себе не делает lock-файл устаревшим. А --no-sync решает третью задачу: отключает проверку и обновление окружения перед запуском. Эти флаги отвечают за разные условия воспроизводимости.
1 087
13
ExitStack: закрываем ресурсы в обратном порядке Список файлов приходит из конфигурации. Их может быть два, а может двадцать. Вкладывать один with в другой неудобно, а при ошибке на пятом файле первые четыре всё равно нужно закрыть. Для этого есть contextlib.ExitStack. Внутри with ExitStack() as stack вызывайте stack.enter_context(open(path)) для каждого пути. Метод вернёт открытый файл и зарегистрирует его выход из контекста. Если следующий open завершится ошибкой, уже открытые файлы будут закрыты в обратном порядке. В тот же стек можно добавить обычную функцию очистки через stack.callback. Она тоже выполнится при выходе, но подавить исключение не сможет. В документации ExitStack есть важная граница: сборка мусора сама по себе очистку не запускает. Управляйте сроком жизни стека через with или явно вызывайте close().
1 218
14
Почему обновления Django важны даже без SQL-инъекций Запрос может вредить серверу, просто заставляя его тратить слишком много
Почему обновления Django важны даже без SQL-инъекций Запрос может вредить серверу, просто заставляя его тратить слишком много памяти или процессорного времени на разбор данных. В обновлении безопасности Django от 6 октября исправили несколько таких сценариев. Один связан с кешированием множества длинных языковых кодов, другой — с квадратичной сложностью разбора параметров HTTP-заголовка. Исправления вошли в 6.1.2, 6.0.9 и 5.2.18. Обновляться нужно до актуального исправленного выпуска своей поддерживаемой ветки. После обновления проверьте обработку необычных заголовков: внутри парсера изменился механизм разбора, поэтому некоторые некорректные значения могут обрабатываться иначе. Общий урок для своего кода: ограничивать размер входа до дорогой обработки и помещения в кеш. Даже полезный кеш становится проблемой, если ключи бесконтрольно задаёт внешний запрос. #python #django
1 303
15
Как найти медленную функцию новым профилировщиком Tachyon Приложение тормозит, но непонятно, где оно проводит время. В Python
Как найти медленную функцию новым профилировщиком Tachyon Приложение тормозит, но непонятно, где оно проводит время. В Python 3.15 появился статистический профилировщик profiling.sampling, известный как Tachyon. В разборе Astral показывают запуск через uv: uv run --python 3.15 -m profiling.sampling run --flamegraph --browser app.py Профилировщик периодически снимает состояние выполнения. Граф помогает найти участки, которые часто попадают в выборку, и выбрать место для дальнейшего исследования. Число выборок не равно точному числу вызовов. А изменение короткой функции не обязательно ускорит весь сценарий. После правки повторите тот же замер с теми же данными и отдельно сравните полное время работы. Авторское ускорение на одном примере нельзя переносить на любое приложение. #python #производительность
1 205
16
Python 3.16 alpha: что уже может проверить автор библиотеки Первая альфа Python 3.16 вышла 13 октября. Набор возможностей ещё
Python 3.16 alpha: что уже может проверить автор библиотеки Первая альфа Python 3.16 вышла 13 октября. Набор возможностей ещё меняется, но ждать финального выпуска для первой проверки совместимости необязательно. В анонсе разработчики предлагают запускать библиотеки и приложения на предварительной версии и сообщать об ошибках CPython. Для библиотеки полезно проверить установку, импорт, тесты и сборку расширений. Если установка не удалась, отделите несовместимость своего кода от отсутствия готовых сборок зависимостей. Такую проверку можно добавить отдельным заданием CI, сохранив основную матрицу поддерживаемых версий. Сбой предварительной версии нужно разобрать, а не автоматически считать регрессией библиотеки. Это ранний выпуск для тестирования. Перенос рабочего сервиса на него не требуется; финальный Python 3.16 запланирован на октябрь 2027 года. #python #тестирование
1 214
17
Как дать помощнику контекст ошибки из Logfire Помощник видит код репозитория, но не знает, какой запрос завершился ошибкой и
Как дать помощнику контекст ошибки из Logfire Помощник видит код репозитория, но не знает, какой запрос завершился ошибкой и сколько времени заняла база. Без телеметрии он может уверенно искать причину не в том месте. В разборе Logfire MCP показывают, как передать клиенту MCP доступ к трассам, логам и метрикам. Помощник может запросить данные через SQL, сопоставить ошибку с обработчиком и проверить гипотезу на реальном выполнении. Начать расследование лучше с конкретного сервиса, интервала времени и проблемного запроса. Так проще получить проверяемый ответ и ограничить объём данных. Права нужно выбирать по задаче: сервер предоставляет инструменты не только для запросов, но и для управления объектами мониторинга. Доступ к просмотру телеметрии сам по себе не требует разрешать изменения алертов или настроек. #python #отладка
1 233
18
После GIL: почему одних потоков недостаточно Убрать общую блокировку — не значит убрать гонки данных. Если несколько потоков
После GIL: почему одних потоков недостаточно Убрать общую блокировку — не значит убрать гонки данных. Если несколько потоков меняют общие объекты, приложению по-прежнему нужны правила доступа. На Python Language Summit обсуждали модель BOC: задачи заранее объявляют, какие защищённые данные им нужны, а планировщик координирует выполнение. Идея — перенести часть работы с блокировками из прикладного кода в механизм запуска задач. Прототип bocpy использует отдельные интерпретаторы. Его уже можно исследовать, но полноценное владение объектами потребует изменений среды выполнения. Авторы также отмечают цену обмена данными. Это исследовательское предложение, а не новая гарантия стандартного Python. Для рабочего приложения пока нужно явно выбирать модель параллельности и проверять совместное использование изменяемых объектов. #python #параллельность
1 264
19
Enum ограничивает состояния, но не проверяет переходы Статус "paied" — допустимая строка. Enum позволяет проверить значение н
Enum ограничивает состояния, но не проверяет переходы Статус "paied" — допустимая строка. Enum позволяет проверить значение на границе приложения: from enum import Enum class Status(Enum): NEW = "new" PAID = "paid" print(Status("paid") is Status.PAID) # True # Status("paied") вызовет ValueError В разборе Enum отдельно рассматривают значения для сериализации и имена членов. Status("paid") ищет по значению, а Status["PAID"] — по имени. Но наличие статусов NEW и PAID не запрещает переход обратно. Разрешённые переходы нужно описать отдельно, например в методе объекта или таблице правил. Если значения уходят в API или базу, выбирайте их явно. Переименование элемента перечисления и изменение внешнего строкового значения могут иметь разные последствия для совместимости. #python #архитектура
1 156
20
Таблицы из PDF: локальная библиотека или облачный API Текст из PDF извлечён, а столбцы таблицы перемешались. Для отчёта важны
Таблицы из PDF: локальная библиотека или облачный API Текст из PDF извлечён, а столбцы таблицы перемешались. Для отчёта важны не только слова, но и связи между строками, заголовками и ячейками. В сравнении Docling и LlamaParse один документ обрабатывают двумя способами. Docling работает локально, LlamaParse отправляет PDF в облачный сервис. Отличаются установка, стоимость, форматы результата и возможности настройки. Docling умеет отдавать таблицы в pandas DataFrame. Для облачного варианта нужно отдельно учитывать отправку документов и условия обработки данных. Скорость авторы измеряют на одном десятистраничном PDF. Это пример эксперимента, а не универсальный рейтинг парсеров. Для своего набора проверьте объединённые ячейки, многострочные заголовки, переносы таблиц между страницами и точность чисел после извлечения. #python #данные
1 222