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

📊 受众指标与增长动态

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

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

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

📝 描述与内容策略

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

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

18 731
订阅者
-824 小时
-367 天
-8730 天
帖子存档
Как разделить синхронный и асинхронный Python-клиенты При переписывании akismet автор отказался от одного класса с обычными и
Как разделить синхронный и асинхронный Python-клиенты При переписывании akismet автор отказался от одного класса с обычными и асинхронными методами. Клиент проверяет ключ API при создании, а для этого нужен HTTP-запрос. Синхронный запрос заблокировал бы асинхронный код, а запуск проверки через async потребовал бы заранее выбрать и получить работающий цикл событий. Решением стали отдельные SyncClient и AsyncClient. Заодно новые имена позволили оставить прежний класс Akismet устаревшим, но рабочим, чтобы пользователи могли перейти без немедленной поломки API. Названия скучные, зато состояние клиента и способ ввода-вывода больше не приходится угадывать. Разбор переписывания библиотеки также показывает, почему набор функций оказался хуже класса: ключ, адрес сайта и результат их проверки пришлось бы хранить в скрытом общем состоянии.

Как заменить цепочку isinstance на singledispatch Когда обработка типов разрастается, цепочка isinstance() превращает одну функцию в дерево условий. Декоратор functools.singledispatch оставляет единый интерфейс, а реализации для отдельных типов регистрируются независимо. Выбор происходит по типу первого аргумента. Учитывается и наследование: регистрация для Mapping подходит обычному dict через порядок разрешения методов. Обратная сторона той же механики: bool наследуется от int, поэтому для иной семантики ему нужен отдельный обработчик. Аннотация помогает register() определить тип, но list[str] и list[int] не становятся разными случаями во время выполнения. В разборе singledispatch также показано, как тестировать обработчики отдельно, проверять выбор через dispatch() и проектировать явный fallback.

Как собирать динамические фильтры Django через Q-объекты Q() представляет условие для SQL-запроса. Такие объекты можно объеди
Как собирать динамические фильтры Django через Q-объекты Q() представляет условие для SQL-запроса. Такие объекты можно объединять операторами & и |, отрицать через ~ и передавать в один вызов filter(). Это позволяет явно задать, какие условия должны выполняться вместе, а какие служат альтернативами. В примерах с Q-объектами поисковая строка разбивается на слова, для каждого строится проверка icontains, а затем условия соединяются через OR. Для небольших наборов данных этого достаточно, но на больших SQL-запросы с OR могут работать медленно. Фильтры можно вынести в функции или методы моделей и собирать из пользовательских параметров. Автор предпочитает один filter(): так вся логика запроса видна в одном месте и проще контролировать JOIN при обходе связей. Явное условие лучше неявной цепочки, почти по PEP 20.

Почему str.splitlines() видит больше переносов, чем чтение файла У Python два разных понятия границы строки. Универсальный ре
Почему str.splitlines() видит больше переносов, чем чтение файла У Python два разных понятия границы строки. Универсальный режим чтения файла распознаёт LF, CR и CR LF. str.splitlines() шире: десять отдельных кодовых точек плюс CR LF. Туда входят вертикальная табуляция, перевод страницы, разделители строки и абзаца Unicode и три ASCII-разделителя данных. Python собрал этот набор из правил ASCII, Unicode-переносов и двунаправленного текста. За простым методом стоят несколько наборов символов и пять документов Unicode. История всех разделителей полезна при обработке внешнего текста: символ, задуманный как граница записи, может стать границей строки. Поэтому сначала сверяйте формат входа, а потом выбирайте чтение файла или splitlines().

Как вручную разрешить ленивый импорт в Python У объекта, созданного через lazy import json, есть метод resolve(). Его можно о
Как вручную разрешить ленивый импорт в Python У объекта, созданного через lazy import json, есть метод resolve(). Его можно обнаружить с помощью dir(globals()["json"]), а справка поясняет: метод разрешает ленивый импорт и возвращает настоящий объект модуля. Вызов globals()["json"].resolve() возвращает модуль json, но имя в глобальном пространстве по-прежнему указывает на объект lazy_import. Автор предполагает, что при автоматическом разрешении Python вызывает тот же метод, а затем присваивает имени полученный модуль. В этот раз «явное лучше неявного» можно понимать буквально. В разборе показано, как исследовать этот механизм через dir() и help(); открытым остаётся вопрос, что именно запускает автоматическое разрешение импорта.

Почему Python предупреждает о последовательности \477 и как это исправить В строках Python обратная косая черта и до трёх циф
Почему Python предупреждает о последовательности \477 и как это исправить В строках Python обратная косая черта и до трёх цифр от 0 до 7 задают восьмеричный код символа. Значение \477 равно 319 и выходит за предел 255, для которого такие последовательности задумывались. В обычной строке оно превращается в символ Ŀ, а в байтовой строке обрезается до 63 и даёт знак вопроса. Не самый явный способ записать путь. В Python 3.11 предупреждение DeprecationWarning можно было увидеть в режиме разработки. Начиная с Python 3.12 компилятор выдаёт SyntaxWarning и без него; позднее конструкция должна стать синтаксической ошибкой. Если косая черта в пути или регулярном выражении должна остаться символом, удвойте её: \\477. Если восьмеричный код был намеренным, укажите нужный символ явно. Механику и различие между str и bytes автор разбирает в статье Adam Johnson.

Как запускать Python-код в песочнице на MicroPython и WebAssembly В проектах Саймона Уиллисона плагины получают все права осн
Как запускать Python-код в песочнице на MicroPython и WebAssembly В проектах Саймона Уиллисона плагины получают все права основного приложения: ошибка или вредоносный код могут повредить данные. Пакет micropython-wasm переносит интерпретатор MicroPython в WebAssembly и изолирует выполнение. Память ограничивает wasmtime, а процессорное время контролирует «топливо»: запас операций, после исчерпания которого выполнение прекращается. Файлы, сеть и функции основного приложения доступны только через явно выданные интерфейсы. Состояние между вызовами сохраняет сессия с отдельным потоком и очередями запросов. Пакет уже опубликован на PyPI, но пока имеет статус альфы: автор использует его сам, однако не рекомендует без готовности принять существенный риск. Архитектура, ограничения и команды для запуска разобраны в Simon Willison’s Weblog.

Как emojet ускоряет работу с эмодзи в Python Библиотека emojet преобразует названия в эмодзи и обратно, поддерживает поиск и
Как emojet ускоряет работу с эмодзи в Python Библиотека emojet преобразует названия в эмодзи и обратно, поддерживает поиск и закрывает основное API пакета emoji. Имена доступны на 14 языках, а также в вариантах, принятых в GitHub и Slack. В тестах автора на Python 3.14 для macOS и ARM импорт оказался в 23,7 раза быстрее, преобразование эмодзи в названия в 69,9 раза, обратная операция в 3,5 раза. Импорт с первым вызовом использовал около 17,4 МБ памяти вместо 29,2 МБ у emoji. Раньше emoji при импорте загружал и разбирал JSON-файл размером 520 КБ. emojet написан на Rust и хранит данные в скомпилированных статических таблицах: разбирать файл при запуске не нужно. Для поиска имён используется хеш-таблица без коллизий, а для распознавания последовательностей эмодзи — дерево символов. В статье разобраны устройство библиотеки и воспроизводимый тест производительности.

Как читать многострочный ввод в Python REPL несколько раз Вызов open(0).read() читает стандартный ввод до конца потока и сохр
Как читать многострочный ввод в Python REPL несколько раз Вызов open(0).read() читает стандартный ввод до конца потока и сохраняет строки вместе с переносами. Для завершения ввода нажмите Ctrl+D в Unix или Ctrl+Z в Windows. Повторный вызов заканчивается ошибкой OSError: после первого чтения Python закрывает файловый дескриптор 0. Передайте closefd=False, и стандартный ввод останется доступен: open(0, closefd=False).read() можно вызывать снова. Явный параметр здесь действительно лучше неявно закрытого ввода. Приём пригодится, когда в интерактивной сессии нужно последовательно прочитать несколько блоков текста. Два таких чтения показаны в разборе TIL #139.

Как исправить вызов NamedTuple в Python 3.15 В Python 3.15 больше не поддерживается создание NamedTuple через именованные арг
Как исправить вызов NamedTuple в Python 3.15 В Python 3.15 больше не поддерживается создание NamedTuple через именованные аргументы полей. В версиях 3.13 и 3.14 такой код выдаёт предупреждение об устаревании. Этот синтаксис никогда не был документирован и работал лишь потому, что старая реализация принимала произвольные именованные аргументы. «Явное лучше неявного» здесь стало требованием интерпретатора. Исправить код можно двумя способами: объявить класс, наследующий NamedTuple, или передать в функциональную форму список пар «имя, тип». Классовый вариант читается проще и оставляет место для методов и строк документации. Ruff 0.16 автоматически переводит обе формы в классовую по правилу UP014: достаточно запустить ruff check --fix. Для старых версий правило нужно включить отдельно. Примеры обоих исправлений есть в разборе Адама Джонсона.

Как запустить урезанный Python в браузерной песочнице Monty от Pydantic исполняет небольшой Python-подобный язык внутри прило
Как запустить урезанный Python в браузерной песочнице Monty от Pydantic исполняет небольшой Python-подобный язык внутри приложения. Интерпретатор написан на Rust для кода, который генерируют языковые модели: файловая система, переменные окружения и сеть недоступны, а функции хоста вызываются только с разрешения разработчика. Саймон Уиллисон собрал Monty для WebAssembly как модуль JavaScript и Python-пакет для Pyodide: получается песочница внутри песочницы. Поддерживается часть синтаксиса, пока без классов. В разборе в Simon Willison’s Weblog есть команды сборки, устройство вариантов и браузерные демо.

Как __getitem__ превращает объект Python в итерируемый Для цикла for объекту не всегда нужен __iter__. Если класс принимает ц
Как __getitem__ превращает объект Python в итерируемый Для цикла for объекту не всегда нужен __iter__. Если класс принимает целые индексы от 0, Python последовательно запрашивает элементы с индексами 0, 1, 2 и так далее. Получив IndexError, интерпретатор считает последовательность законченной. В примере из статьи арифметическая последовательность вычисляет элемент по формуле прямо в __getitem__: seq[3] возвращает 14, а тот же объект без дополнительного метода работает в цикле. Проверять поддержку целочисленных индексов заранее Python не станет. Поэтому обёртка над словарём выдаёт значения для ключей 0 и 1, а на ключе 2 падает с KeyError: эта ошибка не означает конец итерации. Механику и код можно посмотреть в статье Indexable iterables.

Что меняет re.prefixmatch() в Python 3.15 re.match() проверяет совпадение только в начале строки. Поэтому шаблон из шести циф
Что меняет re.prefixmatch() в Python 3.15 re.match() проверяет совпадение только в начале строки. Поэтому шаблон из шести цифр принимает и 345071-in-abbey-wood: подходящий префикс найден, а остаток не мешает успеху. Для проверки всей строки по-прежнему нужен fullmatch(). В Python 3.15 появится prefixmatch(), точный синоним match(). Поведение не изменится, зато имя прямо сообщит, что проверяется лишь начало строки. Явное лучше неявного, даже когда речь всего лишь о названии метода. match() получит статус мягко устаревшего: предупреждений и планов удаления нет, существующий код продолжит работать. В новом коде под Python 3.15+ стоит выбирать prefixmatch() для проверки префикса, а fullmatch() для валидации значения целиком. Примеры и объяснение различий собраны в разборе Адама Джонсона.

Pyodide разрешил публиковать WASM-колёса прямо в PyPI В Pyodide 314.0 появилась прямая публикация пакетов для WebAssembly в P
Pyodide разрешил публиковать WASM-колёса прямо в PyPI В Pyodide 314.0 появилась прямая публикация пакетов для WebAssembly в PyPI. Раньше команда сама собирала и размещала пакеты, а теперь сопровождающие могут выпускать колёса для Pyodide так же, как для Linux, macOS и Windows. На момент публикации в Simon Willison’s Weblog новые теги pyemscripten использовали 28 пакетов.

Как применять структурное сопоставление с образцом к деревьям в Python Структурное сопоставление особенно выразительно на рек
Как применять структурное сопоставление с образцом к деревьям в Python Структурное сопоставление особенно выразительно на рекурсивных структурах. Автор моделирует булевы выражения датаклассами Var, And, Or и Not, а затем разбирает каждый тип веткой case. Вычислитель захватывает поля прямо в образце. Для переменной он берёт значение из словаря, для And и Or рекурсивно обходит дочерние выражения через all() и any(), для Not инвертирует результат. Общая ветка выбрасывает ошибку, если появился неизвестный подкласс: явное лучше неявного. Тот же приём автор переносит на форматированный вывод дерева. Получается компактный разбор того, как рекурсивно применять match к древовидным данным, не превращая обход в цепочку проверок типов.

Почему в Python стоит подменять свой интерфейс, а не httpx Если бизнес-тест напрямую подменяет httpx.Client и httpx.Response,
Почему в Python стоит подменять свой интерфейс, а не httpx Если бизнес-тест напрямую подменяет httpx.Client и httpx.Response, даже проверка пустого списка требует трёх вложенных моков. Тест повторяет чужой API, а его смысл тонет в настройке объектов. Автор предлагает поставить между бизнес-логикой и httpx тонкий DockerRegistryClient с методами get_repos() и get_repo_tags(). Бизнес-код работает с понятными операциями, тест подменяет один собственный объект, а смена HTTP-библиотеки не затрагивает эти проверки. Вложенность отступает перед явным интерфейсом: вполне по-питоновски. В статье «Don’t Mock What You Don’t Own» in 5 Minutes есть код до и после рефакторинга и границы эвристики. Обёртка не нужна, если сторонний API уже удобен; для редких сетевых ошибок прямой мок тоже может оказаться проще.

Как точно типизировать *args и **kwargs в Python Запись *args: tuple[int, str] выглядит как тип всего кортежа, но проверщик ч
Как точно типизировать *args и **kwargs в Python Запись *args: tuple[int, str] выглядит как тип всего кортежа, но проверщик читает её иначе: каждый позиционный аргумент должен быть таким кортежем. У **kwargs: dict[...] тип также относится к каждому именованному аргументу. Типизатор здесь не телепат. Для разнородных аргументов нужен Unpack: Unpack[tuple[int, str]] задаёт типы и порядок позиционных аргументов. Именованные описываются через TypedDict и Unpack[Kw], поэтому проверщик знает тип каждого ключа. В разборе аннотаций показаны и необязательные ключи: все сразу через total=False либо отдельные через NotRequired. До Python 3.12 эти типы берутся из typing_extensions. Подход пригодится обёрткам, которые передают аргументы функции с той же сигнатурой.

Как точечно сравнивать скорость функций Python с tprof Профилировщик помогает найти медленную функцию. Но после каждой правки
Как точечно сравнивать скорость функций Python с tprof Профилировщик помогает найти медленную функцию. Но после каждой правки снова измерять всю программу неудобно: отчёт приходится фильтровать, а профилировщик добавляет накладные расходы. tprof для Python 3.12+ следит только за выбранными функциями. В режиме сравнения одна функция становится базовой, а столбец delta показывает разницу. В примере sum(range(...)) выполнялся примерно на 62% быстрее цикла с накоплением. Запустить замер можно из командной строки, через контекстный менеджер или декоратор. В разборе Адам Джонсон показывает команды и Python API. tprof работает через sys.monitoring: регистрирует обработчики только для целевых функций, а время измеряет в C. Остальная программа не получает накладных расходов профилировщика.

Как писать Python-скрипты, которые удобно запускать в пайплайнах В разборе Bite code! собраны приёмы, которые оставляют одноф
Как писать Python-скрипты, которые удобно запускать в пайплайнах В разборе Bite code! собраны приёмы, которые оставляют однофайловый скрипт простым, но делают его предсказуемым для пользователя. Зависимости указываются в комментарии в начале файла: uv run создаёт временное виртуальное окружение, ставит пакеты и запускает скрипт. Секрет сначала ищется в переменной окружения с префиксом имени скрипта, затем в хранилище ключей ОС, а при отсутствии запрашивается через getpass и сохраняется после проверки. Результат операции отправляйте в stdout, ошибки и журнал в stderr: тогда конвейер получит только данные. Для пользователя оставляйте print(), диагностику включайте через logging по запросу, а переменные окружения перечисляйте в --help через argparse.

Как упаковать Go-бинарник в wheel и подключить к Python PyPI может раздавать не только Python-код. go-to-wheel собирает Go-пр
Как упаковать Go-бинарник в wheel и подключить к Python PyPI может раздавать не только Python-код. go-to-wheel собирает Go-программу в отдельные wheel-пакеты для Windows, macOS и Linux, а pip или uv выбирают сборку под ОС и архитектуру. Внутри пакета лежит бинарник; Python-точка входа находит его и запускает с переданными аргументами. Simon Willison показывает схему на sqlite-scanner: утилиту можно вызвать через uvx sqlite-scanner, а другой Python-пакет может объявить её зависимостью и запускать через subprocess. Пользователю не нужны Go и ручная сборка. PyPI немного выходит за должностную инструкцию, зато граница остаётся явной: Go отвечает за бинарник, Python — за установку и запуск. В статье Simon Willison’s Weblog разобраны структура wheel, команда сборки и пример плагина Datasette.