ru
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 613 подписчиков, занимая 7 030 место в категории Технологии и приложения и 35 241 место в регионе Россия.

📊 Показатели аудитории и динамика

С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 18 613 подписчиков.

Согласно последним данным от 14 ноября, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -161, а за последние 24 часа — 2, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 7.25%. В первые 24 часа после публикации контент обычно набирает 4.20% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 1 349 просмотров. В течение первых суток публикация набирает 782 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 2.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как 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 613
Подписчики
+224 часа
-447 дней
-16130 дней
Привлечение подписчиков
нояб. '26
ноябрь '26
+20
в 1 каналах
октябрь '26
+75
в 0 каналах
Get PRO
сентябрь '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 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
15 ноября+1
14 ноября+4
13 ноября+1
12 ноября+1
11 ноября0
10 ноября+2
09 ноября+1
08 ноября0
07 ноября0
06 ноября+3
05 ноября+1
04 ноября+3
03 ноября0
02 ноября+2
01 ноября+1
Посты канала
os.cpu_count() может считать больше, чем доступно потоку Число логических CPU в системе и число CPU, на которых разрешено раб
os.cpu_count() может считать больше, чем доступно потоку Число логических CPU в системе и число CPU, на которых разрешено работать текущему потоку, могут различаться. Начиная с Python 3.13, os.process_cpu_count() возвращает второе. По документации Python, оно может быть меньше os.cpu_count() из-за CPU affinity. Если определить число не удалось, результатом будет None. Есть важная поправка для диагностики: параметр запуска -X cpu_count=n или переменная PYTHON_CPU_COUNT переопределяет результат обеих функций. В отдельном проверенном процессе с -X cpu_count=2 обе вернули 2. Это заданная настройка, а не измерение оборудования или демонстрация ограничения affinity. Проверяйте конфигурацию запуска, прежде чем выбирать размер пула по этому числу. API не считает физические ядра и не обещает универсально определять квоты cgroup. Оптимальное число воркеров всё ещё зависит от вашей нагрузки.

2
Почему batch_size не ограничивает всю подготовку bulk_update В bulk_update(objects, fields, batch_size=100) размер пачки огра
Почему batch_size не ограничивает всю подготовку bulk_update В bulk_update(objects, fields, batch_size=100) размер пачки ограничивает число объектов в одном SQL-запросе. Но Django заранее готовит WHEN-выражения для всех переданных объектов, включая следующие пачки. Маленький batch_size не делает один большой вызов потоковым. В документации Django 6.0 предлагают внешний цикл: взять порцию ID через islice, загрузить только её модели, изменить поля и вызвать bulk_update() для этой порции. В проверенном примере шесть строк обновились за три отдельных вызова по две модели. Внутри каждого batch_size=1 дал два UPDATE-запроса. Это два разных уровня разбиения. Если заранее собрать все модели в список, внешний цикл не вернёт уже занятую ими память. И массовое обновление не вызывает save() и сигналы pre_save/post_save. Учитывайте это, если там находится нужная вам логика.
673
3
Process.interrupt() даёт дочернему процессу KeyboardInterrupt В Python 3.14 у multiprocessing.Process появился interrupt(). Н
Process.interrupt() даёт дочернему процессу KeyboardInterrupt В Python 3.14 у multiprocessing.Process появился interrupt(). На POSIX он посылает дочернему процессу SIGINT. При стандартном обработчике в нём возникает KeyboardInterrupt, а стек Python разворачивается с выполнением блоков finally. В нашем проверенном примере родитель дождался готовности собственного дочернего процесса, вызвал interrupt() и сделал join(3). Дочерний процесс оставил файл из finally и завершился с exitcode == 1, как при неперехваченном исключении. У terminate() такой гарантии выполнения finally нет. Это не гарантия остановки: второй тестовый процесс перехватил KeyboardInterrupt и продолжил работать до отдельного разрешения на выход. Обработчик сигнала тоже может изменить поведение. После ожидания проверяйте is_alive(). На Windows поведение метода не определено — это ограничение прямо указано в документации interrupt.
679
4
PEP 639 разделяет лицензию и файлы с её текстом В метаданных пакета нужно различать обозначение лицензии и файлы с юридически
PEP 639 разделяет лицензию и файлы с её текстом В метаданных пакета нужно различать обозначение лицензии и файлы с юридическими текстами. Финальная спецификация PEP 639 вводит для Core Metadata 2.4 поле License-Expression с выражением SPDX и отдельные поля License-File. В pyproject.toml строка license = "MIT" задаёт выражение, а license-files = ["LICENSE"] указывает файлы для включения в дистрибутив. Это пример записи, а не выбор лицензии за автора. Каждый явно заданный шаблон должен найти хотя бы один файл. Старые таблицы license = {text = ...} и {file = ...} объявлены устаревшими. Карточка показывает схему спецификации. Мы проверили разбор TOML и наличие файла в учебной папке, но это не проверка поддержки сборочным backend. В своём пакете проверьте метаданные и файлы уже собранных wheel и sdist. Выражение SPDX не заменяет лицензионные тексты и само по себе не предоставляет новых прав.
820
5
Как закрыть asyncio.Queue без стоп-сигнала в данных В Python 3.13 у asyncio.Queue появился shutdown(). После вызова очередь б
Как закрыть asyncio.Queue без стоп-сигнала в данных В Python 3.13 у asyncio.Queue появился shutdown(). После вызова очередь больше не принимает элементы: новые и уже ожидающие put() получают QueueShutDown. Для завершения конвейера не нужен специальный объект, который потребители должны отличать от обычных данных. При обычном завершении оставшиеся элементы можно забрать через get(). Когда очередь опустеет, он тоже вызовет QueueShutDown — потребитель может перехватить исключение и выйти. Для каждого обработанного элемента по-прежнему нужен task_done(), чтобы дождаться join(). Завершения самих задач потребителей ждите отдельно. Режим immediate=True отбрасывает лежащие в очереди элементы. Уже взятая работа остаётся незавершённой: в проверенном примере join() ждал её task_done(). Возврат из него не доказывает, что отброшенные элементы обработаны. Различия режимов описаны в документации shutdown.
870
6
Placeholder оставляет место перед связанным аргументом У str.replace исходная строка стоит перед заменяемым фрагментом. Если
Placeholder оставляет место перед связанным аргументом У str.replace исходная строка стоит перед заменяемым фрагментом. Если нужен колбэк, удаляющий дефисы из любой строки, хотелось бы заранее задать второй и третий позиционные аргументы, оставив первый свободным. В Python 3.14 это делает functools.Placeholder. Импортируйте его как _ и создайте partial(str.replace, _, "-", ""). При вызове strip_dash("a-b-c") строка займёт пропуск, и получится "abc". Раньше partial тоже связывал аргументы по имени, но позиционные пропуски позволяют фиксировать аргументы после свободного места, включая параметры, которые нельзя передать по имени. Если пропусков несколько, входящие позиционные аргументы заполняют их слева направо. Все пропуски нужно заполнить при вызове, иначе будет TypeError. Передать сам Placeholder как именованный аргумент в partial нельзя.
926
7
Как узнать, какие тесты выполняли строку кода Зелёная строка в coverage-отчёте показывает, что код выполнялся. Чтобы увидеть,
Как узнать, какие тесты выполняли строку кода Зелёная строка в coverage-отчёте показывает, что код выполнялся. Чтобы увидеть, в каких тестах это происходило, у pytest-cov есть --cov-context=test. Он сохраняет ID теста и фазу выполнения: setup, run или teardown. Запустите pytest --cov=calc --cov-context=test --cov-report=html, заменив calc именем своего модуля. В .coveragerc включите [html] show_contexts = True. В нашем запуске coverage 7.17.2 на CPython 3.14.4 понадобился ещё [run] core = ctrace: стандартный sysmon предупреждал о неполных контекстах. По документации pytest-cov, нажатие на число у покрытой строки раскрывает список контекстов. У параметризованных случаев будут разные test ID, включая заданные вами имена. В проверенном примере два случая neg и pos дали шесть контекстов у одной строки: её вызывали в каждой из трёх фаз. Число контекстов не равно числу тестов. И такой отчёт показывает выполнение кода, а не качество проверок результата.
890
8
Как читать BLOB из SQLite по частям Если вложение хранится в SQLite, не обязательно получать его целиком как один bytes. Начи
Как читать BLOB из SQLite по частям Если вложение хранится в SQLite, не обязательно получать его целиком как один bytes. Начиная с Python 3.11, Connection.blobopen() открывает существующий BLOB по имени таблицы, столбца и rowid. У полученного объекта есть файловые операции чтения и записи. Размер задаётся заранее: zeroblob(8) создаёт восемь нулевых байтов, которые затем можно перезаписать частями. На карточке — фрагмент проверенного примера: после двух записей по четыре байта чтение с read(4) выдаёт два блока. Для большого объекта выбирайте подходящий размер блока и обрабатывайте каждый сразу, не собирая их обратно в список. Без аргумента read() прочитает весь остаток до конца. Сам BLOB через этот интерфейс увеличить нельзя, а таблицы WITHOUT ROWID не поддерживаются. Контекстный менеджер закрывает BLOB-дескриптор. Детали — в описании Blob.
948
9
pytest --sw возвращает к последнему упавшему тесту После правки несколько тестов падают подряд. Если исправляете их по одному
pytest --sw возвращает к последнему упавшему тесту После правки несколько тестов падают подряд. Если исправляете их по одному, pytest --sw помогает не прогонять уже пройденное начало набора при каждой попытке. Он останавливается на первом падении и сохраняет позицию между запусками. Следующий запуск с --sw начинает с того же упавшего теста. Если вы его починили, pytest идёт дальше до следующей ошибки. В нашем проверенном примере первый прогон остановился на test_b, а после исправления второй повторил test_b и дошёл до падения test_c. Это отличается от --lf, который выбирает ранее упавшие тесты. Механизм описан в документации pytest. Позиция хранится в кэше, а не в памяти остановленного процесса. Ранние успешные тесты после ваших правок могли сломаться. Когда закончите исправления, запустите весь набор обычным pytest.
1 006
10
ZIP с Zstandard может не открыться у получателя Архив успешно собрался и распаковался вашим Python, но это ещё не проверка со
ZIP с Zstandard может не открыться у получателя Архив успешно собрался и распаковался вашим Python, но это ещё не проверка совместимости с утилитой получателя. Для ZIP с Zstandard важны и поддержка алгоритма, и его числовой идентификатор в архиве. В Python 3.14 появился zipfile.ZIP_ZSTANDARD. По документации zipfile, модуль читает Zstandard с ID 20 и 93, а записывает только 93. Старый ID 20 заменили в спецификации, чтение сохранили ради совместимости. Локальный пример на CPython 3.14.4 подтвердил запись 93 и восстановление исходных байтов. Нужна сборка Python с необязательным модулем compression.zstd. Если архив уйдёт за пределы вашей среды, проверьте распаковку именно инструментом получателя: часть утилит, включая старые версии Python, Zstandard в ZIP не поддерживает.
1 020
11
Как посмотреть локальные переменные после ошибки в REPL Вызов в интерактивном Python завершился исключением, а по traceback н
Как посмотреть локальные переменные после ошибки в REPL Вызов в интерактивном Python завершился исключением, а по traceback непонятно, какое значение привело к ошибке. Пока эта сессия открыта, можно посмотреть локальные переменные в месте ошибки без повторного запуска вызова. Импортируйте pdb и выполните pdb.pm(). Функция берёт последнее необработанное исключение из sys.last_exc и открывает отладчик на кадре, где оно возникло. Команда p x покажет значение x в этом кадре. На карточке — выполненный пример: после f(0) виден локальный x = 0. Такой сценарий есть и в документации pdb. Это просмотр сохранённого traceback в том же живом REPL. Продолжить исходный вызов, завершившийся исключением, нельзя. После выхода из интерпретатора этот приём уже не поможет.
1 018
12
abi3t сокращает число сборок нативного расширения Нативному расширению обычно нужны отдельные сборки под версии CPython, а fr
abi3t сокращает число сборок нативного расширения Нативному расширению обычно нужны отдельные сборки под версии CPython, а free-threaded варианты ещё увеличивают их число. Начиная с CPython 3.15, Stable ABI для free threading, или abi3t, позволяет одной сборке на платформу поддерживать несколько версий. Она совместима и с обычными сборками CPython 3.15+. Для этого придётся ограничиться доступной частью C API и, возможно, пожертвовать скоростью. Руководство рекомендует сначала подготовить расширение к free threading. Если оно использует генератор кода или биндинги, стоит дождаться поддержки abi3t в соответствующем инструменте. Расширения с собственными типами переменного размера нельзя перенести на abi3t 3.15. А совместимость ABI не исключает изменений поведения между версиями: тесты нужно запускать на каждой поддерживаемой версии, в обычной и free-threaded сборках Python.
1 058
13
Установщик Python 3.15 для macOS ставит обе сборки по умолчанию В установщике Python 3.15 с python.org для macOS free-threade
Установщик Python 3.15 для macOS ставит обе сборки по умолчанию В установщике Python 3.15 с python.org для macOS free-threaded сборка отмечена по умолчанию. Она ставится рядом с обычной, в отдельный PythonT.framework, и запускается командой python3.15t. Отключить этот компонент можно через Customize. У сборок отдельные каталоги site-packages и собственные экземпляры pip. Наличие пакета в обычном Python поэтому не означает, что он установлен и во free-threaded варианте. В инструкции для macOS рекомендуют использовать виртуальные окружения, чтобы не путать интерпретаторы. Эта настройка относится к официальному установщику, а не ко всем дистрибутивам Python для Mac. Нативные расширения могут ещё не поддерживать работу без GIL и включать его обратно. Перед запуском приложения во второй сборке проверьте совместимость его зависимостей.
1 110
14
Unicode-идентификатор начинается и продолжается по разным правилам Если вы пишете токенизатор или подсветку для языка с Unicode-именами, проверки «это буква или цифра» может оказаться недостаточно. У Unicode есть отдельные свойства для начальной и последующих позиций идентификатора. В Python 3.15 эти проверки добавили в unicodedata. Функция isxidstart проверяет свойство XID_Start, а isxidcontinue — XID_Continue по UAX #31. Каждая принимает один символ. Модуль использует базу Unicode 17.0.0. Так можно проверять свойства символов без собственного списка диапазонов, который придётся обновлять вместе с Unicode. Для проверки целого имени нужны ещё правила конкретного языка. Например, эти функции не проверяют, является ли имя зарезервированным словом.
1 218
15
Обновление Python не обновляет pip в старых venv В Python 3.15.1 обновили комплектный pip до 26.2.2. В его состав входит certifi 2026.10.19 с изменениями после инцидента с центрами сертификации eMudhra / emSign. Но установка нового интерпретатора сама по себе не обновляет инструменты внутри уже созданных виртуальных окружений. На странице релиза отдельно просят обновить pip и uv в существующих venv до последних версий. Там же приведены ссылка на wheel pip с SHA-256 и отдельная инструкция по обновлению сертификатов для установки на macOS. Проверяйте версию pip внутри нужного окружения. Версия системного Python этого не показывает. Для обновления сертификатов выбирайте инструкции релиза, относящиеся к вашему способу установки.
1 248
16
Стартовый код пакета переезжает из .pth в .start Файл .pth может не только расширять sys.path. При запуске Python модуль site
Стартовый код пакета переезжает из .pth в .start Файл .pth может не только расширять sys.path. При запуске Python модуль site исполняет найденные в нём строки, начинающиеся с import. Этот код выполняется ещё до первой строки приложения. В Python 3.15 PEP 829 вводит файлы .start с явными точками входа в форме pkg.mod:callable. Функция вызывается без аргументов, возвращённое значение отбрасывается. У PEP статус Final. Если рядом есть одноимённый .start, строки import из соответствующего .pth игнорируются. Добавление путей из .pth сохраняется. Это позволяет переносить стартовую инициализацию отдельно от настройки путей, сохраняя старый файл для прежних интерпретаторов.
1 230
17
Decimal в тайм-ауте не делает ожидание точнее Тайм-аут может прийти в программу как Decimal из конфигурации или как Fraction после вычисления. В Python 3.15 функции с аргументами timestamp и timeout принимают любые вещественные числа, а не только int и float. В описании изменения отдельно оговорено: точность от этого не повышается. Изменение позволяет передавать уже вычисленное значение без преобразования на стороне вызывающего кода. Что именно ограничивает тайм-аут и когда функция возвращает управление, по-прежнему зависит от её контракта. Допустимый числовой тип этих правил не меняет.
1 224
18
wxPython 4.3.2 добавил wheels для Python 3.15 и проверку типов обработчиков Bind При переходе Python-приложения с нативным GUI на новый интерпретатор нужны и подходящие бинарные сборки GUI-библиотеки. В wxPython 4.3.2 заявлены официальная поддержка Python 3.15 и сборка wheels для него. Релиз использует wxWidgets 3.3.4. Выпуск Windows wheels для 32-битной архитектуры прекращён. Сгенерированные .pyi теперь позволяют проверять типы обработчиков, передаваемых в Bind. Среди других правок в stubs — представление enum в виде классов и более полное описание методов и типов. Типизатор сможет найти часть ошибок при подключении событий до запуска окна. Работу виджетов в вашей ОС нужно проверять отдельно. Перед миграцией проверьте наличие подходящего wheel и поведение GUI на целевой платформе.
1 287
19
Фильтры предупреждений в CLI научились понимать регулярки В CI бывает нужно превратить в ошибку конкретное семейство предупре
Фильтры предупреждений в CLI научились понимать регулярки В CI бывает нужно превратить в ошибку конкретное семейство предупреждений и оставить остальные видимыми. Настройку для дочернего процесса удобно передать через -W или PYTHONWARNINGS, без правок приложения. Начиная с Python 3.15 поля сообщения и модуля поддерживают регулярные выражения, если поле начинается и заканчивается косой чертой. Без этих разделителей сохраняется буквальное сопоставление. Это дополнение к синтаксису фильтра, его действия и категории остаются прежними. У полей разные правила. Сообщение сопоставляется с начала без учёта регистра. Имя модуля учитывает регистр: буквальная строка должна совпасть целиком, а регулярное выражение проверяет начало полного имени. Поэтому одинаковый шаблон в этих двух полях может охватить разные предупреждения.
1 260
20
Одинаковое имя XMP-тега ещё не означает одно поле В метаданных изображения могут встретиться XML-теги с одинаковым локальным
Одинаковое имя XMP-тега ещё не означает одно поле В метаданных изображения могут встретиться XML-теги с одинаковым локальным именем из разных пространств имён. Если убрать URI пространства, различить такие свойства по одному имени уже не получится. В Pillow 13.0.0 метод Image.getxmp получил аргумент strip_namespaces. По умолчанию он равен True, и библиотека по-прежнему убирает URI. Значение False сохраняет полное имя тега в форме {namespace-uri}local-name. Если вам нужно различать свойства из разных пространств имён, выбирайте False и учитывайте полные ключи при чтении результата. Опция меняет только представление имён XMP-тегов.
1 203