fa
Feedback
Zen of Python

Zen of Python

رفتن به کانال در Telegram

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

نمایش بیشتر

📈 تحلیل کانال تلگرام Zen of Python

کانال Zen of Python (@zen_of_python) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 18 952 مشترک است و جایگاه 6 826 را در دسته فناوری و برنامه‌ها و رتبه 34 989 را در منطقه روسيا دارد.

📊 شاخص‌های مخاطب و پویایی

از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 18 952 مشترک جذب کرده است.

بر اساس آخرین داده‌ها در تاریخ 25 اوت, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -164 و در ۲۴ ساعت گذشته برابر -9 بوده و همچنان دسترسی گسترده‌ای حفظ شده است.

  • وضعیت تأیید: تأیید نشده
  • نرخ تعامل (ER): میانگین تعامل مخاطب 11.07% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 6.35% واکنش نسبت به کل مشترکان کسب می‌کند.
  • دسترسی پست‌ها: هر پست به طور میانگین 2 099 بازدید دریافت می‌کند. در اولین روز معمولاً 1 204 بازدید جمع‌آوری می‌شود.
  • واکنش‌ها و تعامل: مخاطبان به‌طور فعال حمایت می‌کنند؛ میانگین واکنش به هر پست 6 است.
  • علایق موضوعی: محتوا بر موضوعات کلیدی مانند 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 952
مشترکین
-924 ساعت
-517 روز
-16430 روز
آرشیو پست ها
Фильтры распаковки tar и data в tarfile создавали каталоги за пределами каталога назначения. Стан из Ирландии завёл issue 18
Фильтры распаковки tar и data в tarfile создавали каталоги за пределами каталога назначения. Стан из Ирландии завёл issue 18 августа, исправление влили в main 19 августа. Имя элемента в архиве вида ../escaped.evil/../dest/sub/file выходит из назначения и возвращается обратно. Проверка контейнмента смотрит на итоговый путь после realpath, а он оказывается внутри dest — значит, элемент считается безопасным. Но промежуточные каталоги создаются по имени как оно записано, и ../escaped.evil появляется снаружи. Правка в Lib/tarfile.py занимает семь строк: если среди компонентов имени есть .., имя прогоняется через os.path.normpath до вычисления целевого пути. В документации к этому сразу добавлена оговорка — нормализация убирает внутренние .., а это меняет смысл имени, если оно проходит через символические ссылки. Запись легла в Misc/NEWS.d/next/Security. Бэкпорты в 3.14, 3.13 и 3.12 влиты, в 3.15, 3.11 и 3.10 пока открыты. @zen_of_python

Встречайте новую мини-игру — «Отпуск». За несколько шагов нужно подготовить героя к поездке: навести порядок, разобрать вещи,
Встречайте новую мини-игру — «Отпуск». За несколько шагов нужно подготовить героя к поездке: навести порядок, разобрать вещи, отыскать билет и упаковать чемодан. Отдельный этап — отпускной гардероб, и тут всё непросто. Простое управление, короткие уровни, юмор. Отличный способ отвлечься на пару минут между задачами и заодно поймать промокоды от партнёров! Попробовать: https://tprg.ru/H2cI

Михаил Суриков собрал конвейер, который берёт сгенерированный моделью код на Python, ищет в нём уязвимости, чинит и проверяет заново. Сканируют параллельно CodeQL и Bandit, отдельная модель-валидатор смотрит своим взглядом, находки обогащаются техниками MITRE ATT&CK и примерами CWE, после чего другая модель пишет исправление. Проверяли на 26 промптах из LLMSecEval, девяти категориях CWE и четырёх моделях Claude — всего 80 прогонов. Если валидатору дополнительно показать находки CodeQL и Bandit, число срабатываний статических анализаторов падает на 29–69% против 9–54% без этого. Интересного тут два. Во-первых, само исправление в 15–22% случаев заносит новую уязвимость, и примерно в 70% таких случаев это ровно одна новая находка. Во-вторых, лучшая модель-генератор не дала лучший результат в конвейере: меньше всего остаточных находок и выше процент успешных починок оказались у Sonnet 4.6, а не у Opus 4.8. @zen_of_python

CPython официально поддерживает RISC-V. Стан Ульбрих объявил об этом 24 августа в Python Insider: архитектура добавлена в PEP 11 как платформа третьего уровня. RISC-V — открытая архитектура набора команд: в отличие от x86 и ARM, её может реализовать кто угодно. В записи ссылаются на прогноз, по которому экосистема вырастет вчетверо к 2032 году. Держится всё на живом железе: несколько машин RISC-V передал проект RISE, на них крутятся боты сборки. Автор благодарит Людовика Анри из RISE, Фуркана Ондера и Эмму Смит, а свою работу вёл при поддержке Sovereign Tech Agency. Что дальше. Боты сборки запускаются уже после слияния патча, поэтому команда разбирается, как завести RISC-V прямо в CI CPython — через инициативу RISE RISC-V Runners. В долгую цель — второй уровень поддержки и оптимизации под саму архитектуру. Отдельно просят тех, у кого есть железо: собрать CPython, прогнать свои задачи и тесты и рассказать, что сломалось. @zen_of_python

pip 26.2 стал учитывать Cache-Control индекса, и это первое, что заметят пользователи: только что опубликованный пакет может не появиться сразу, если между вами и PyPI кэширующий прокси. Для принудительного обновления есть --refresh-package. Релиз вышел 29 июля, 26.2.1 — 4 августа. 🔘 PIP_CONSTRAINT больше не влияет на изолированные сборочные окружения; для них появились --build-constraint и PIP_BUILD_CONSTRAINT; 🔘 экспериментальный режим venv-isolation запускает сборку в обычных virtualenv вместо временных окружений; 🔘 добавлены поддержка Python 3.15, self-referential extras, флаг --only-deps и поле upload-time в pylock.toml; 🔘 закрыты утечка системных пакетов в изолированную сборку на 3.15, несовпадение метаданных PEP 658, symlink traversal в tar-архивах и CVE-2026-13346; 🔘 26.2.1 вернул использование keyring из неактивированного virtualenv. @zen_of_python

Starlette научился сжимать большие ответы вне event loop. В релизах с 1.4.0 по 1.6.0, вышедших 5 и 8 августа, переделан GZipMiddleware и подтянута защита FileResponse. 🔘 тела от 128 КиБ сжимаются в рабочем потоке, а не в цикле событий; вместо GzipFile используется zlib.compressobj, и компрессор создаётся лениво; 🔘 потоковые ответы получают flush на каждом чанке, частичные ответы (206) больше не сжимаются; 🔘 FileResponse отклоняет перевёрнутый однобайтовый Range и ограничивает число диапазонов сотней; 🔘 в 1.6.0 появился max_body_size и поддержка расширения http.response.debug. Starlette лежит под FastAPI, так что изменение задевает и его. Полный список правок по версиям в release notes. @zen_of_python

⚡️ Тестовое собеседование на Middle Python с разработчиком из Яндекса завтра вечером Уже завтра вечером в 19:00 по МСК приход
⚡️ Тестовое собеседование на Middle Python с разработчиком из Яндекса завтра вечером Уже завтра вечером в 19:00 по МСК приходите на открытое онлайн-собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика. Как это будет: 🔘 Хачатур — старший разработчик в Яндексе — будет задавать реальные вопросы и задачи разработчику-добровольцу; 🔘 Хачатур будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью; 🔘 В конце можно будет задать любой вопрос Хачатуру. Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходите в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot Реклама. О рекламодателе.

В асинхронных генераторах появится yield from. PEP 828 принят 3 августа, целевая версия — Python 3.16. Сейчас делегировать другому асинхронному генератору можно только циклом async for с ручным yield. Это прячет намерение, ломает связь asend(), athrow() и aclose() с вызывающей стороной и не даёт вернуть значение: приходится бросать исключение. 🔘 result = yield from agenerator() делегирует aiter(), anext(), asend(), athrow() и aclose(); 🔘 return 3 внутри асинхронного генератора становится законным, значение приезжает через новый атрибут StopAsyncIteration.value, по аналогии со StopIteration.value; 🔘 компилятор перестаёт выдавать SyntaxError на return с значением и yield from в async def с yield. PEP 525 в 2016 году отказался от этого из-за сложности реализации; автор нового PEP Питер Бирма считает, что нынешний код CPython это позволяет, и приложил рабочую реализацию. Вариант async yield from отвергли ради симметрии с обычными генераторами, и в тексте прямо сказано, что переключение контекста без явного await — спорное место. @zen_of_python

Правила типизации Python рассыпаны по десяткам PEP и страницам документации, а два разных проверяющих на одном коде дают разные ответы. Андрей Наку и Дорел Лукану попробовали собрать это в одну модель. Отправная точка: каждый тип в Python представлен классом, класс задаёт абстрактный тип данных, а такой тип описывается в терминах экзистенциальных типов. Дальше авторы разводят три отношения, которые в разговорах обычно смешивают: быть подклассом, быть экземпляром объекта и быть экземпляром типа. По дороге разбираются вещи, полезные и без формализма: 🔘 почему объединение типов и классов в Python 2.2 и переход к порядку разрешения методов C3 в 2.3 определили нынешнее поведение множественного наследования; 🔘 чем Protocol отличается от абстрактного базового класса и где проходит граница между проверкой во время выполнения и статической; 🔘 как устроен слой метаклассов, где класс одновременно и шаблон для экземпляров, и обычное значение; 🔘 чем расходятся mypy и Pyright: первый сильнее опирается на аннотации и знание стандартной библиотеки, второй заточен под быстрый статический анализ. Авторы честно ограничивают область: формализм описывает программы, где типы не меняются на ходу, а подтипизация и динамика оставлены на будущее. @zen_of_python

Тесты бэкенда PyPI шли 163 секунды, стали 30 — при том что самих тестов стало больше: было около 3900, стало больше 4700. Але
Тесты бэкенда PyPI шли 163 секунды, стали 30 — при том что самих тестов стало больше: было около 3900, стало больше 4700. Алексис Шалланд описал, что именно сделали. Порядок действий подойдёт любому медленному набору на pytest: 🔘 распараллелить через pytest-xdist с --numprocesses=auto; на 32 ядрах замер упал с 191 до 63 секунд; 🔘 чтобы процессы не топтали данные друг друга, фикстура базы берёт идентификатор рабочего процесса: у каждого своя база tests-{worker_id}; 🔘 для покрытия в параллельном режиме добавить sitecustomize.py с coverage.process_startup(); 🔘 переключить измерение покрытия на механизм наблюдения из Python 3.12 через COVERAGE_CORE=sysmon — с 58 до 27 секунд; 🔘 указать testpaths: сбор тестов ускорился с 7,84 до 2,60 секунды; 🔘 прогнать python -X importtime и выкинуть лишний импорт. Логику тестов при этом не меняли и покрытие не снижали. @zen_of_python

Ромен Моротти разобрал профилировщиком, куда уходит время `pip install`, и довёл установку до двукратного ускорения, а скачив
Ромен Моротти разобрал профилировщиком, куда уходит время `pip install`, и довёл установку до двукратного ускорения, а скачивание — до семикратного. На картинке тот самый профиль в SnakeViz. 🔘 создание каталогов при установке одного пакета вызывалось 14 425 раз; осталось 1 538; 🔘 набор поддерживаемых меток колёс, 889 значений, пересчитывался заново для каждого пакета — кэширование дало около 17 процентов; 🔘 функция получения установленного пакета вела себя квадратично: на трёхстах пакетах итоговая сводка занимала треть времени; 🔘 распаковка читала архив мелкими кусками, блок в 1 мебибайт дал ещё около 10 процентов; 🔘 библиотека запросов тянула сеть кусками по 10 килобайт: переход к 256 килобайтам поднял скорость с 60 до 260 мегабайт в секунду; 🔘 отрисовка полосы прогресса съедала до 30 процентов времени загрузки. Поучительна и судьба правок: исправление двойного сброса на диск, а это 7 процентов, не приняли из-за разного поведения файловых систем. @zen_of_python

Почему obj.prop вызывает функцию, а C.prop возвращает объект, и откуда метод знает про self Антонио Куни разобрал по шагам, ч
Почему obj.prop вызывает функцию, а C.prop возвращает объект, и откуда метод знает про self Антонио Куни разобрал по шагам, что происходит при обращении к атрибуту — от байткода до кода CPython. Порядок поиска на картинке. Из него сразу объясняется несколько загадок. Дескриптор данных, то есть объект с __get__ и __set__, проверяется раньше словаря экземпляра — поэтому property не перекрыть, положив одноимённый ключ в obj.__dict__. И property остаётся дескриптором данных, даже когда сеттера нет: он определяет __set__ и сам поднимает AttributeError. Там же видно, откуда берётся связанный метод: обычная функция — это дескриптор без записи, и obj.meth разворачивается в C.meth.__get__(obj, C). У классов поиск устроен иначе: сначала дескрипторы данных метакласса, потом полный проход по порядку разрешения методов. Автор берёт CPython 3.12.11: в 3.13 этот код усложнён оптимизациями. @zen_of_python

Дескрипторы — та часть объектной модели Python, которую большинство использует каждый день, не зная названия. Официальное руководство Раймонда Хеттингера объясняет её по шагам и остаётся живой документацией, а не архивом. Протокол состоит из трёх методов: __get__, __set__ и __delete__. Класс, реализующий их, перехватывает доступ к атрибуту. Из этого собрано больше, чем кажется: 🔘 property, staticmethod, classmethod и super() — всё это дескрипторы, и в руководстве показаны их упрощённые реализации на Python; 🔘 обычная функция становится связанным методом ровно потому, что функция — тоже дескриптор; 🔘 __set_name__ позволяет дескриптору узнать имя атрибута, под которым его объявили; 🔘 разница между дескрипторами с записью и без определяет, кто победит: дескриптор или словарь экземпляра; 🔘 на этом же построены __slots__ и модели в ORM. Практическая часть — готовый класс Validator и валидаторы OneOf, Number и String: проверка типов и диапазонов при присваивании, без единой строчки проверок в коде, который этими полями пользуется. @zen_of_python

Марк Шеннон и Даниэле Пармеджани опубликовали PEP 805 «Safe Parallel Python»: параллелизм в CPython без гонок по умолчанию. Ц
Марк Шеннон и Даниэле Пармеджани опубликовали PEP 805 «Safe Parallel Python»: параллелизм в CPython без гонок по умолчанию. Целевая версия 3.16, статус Draft. 🔘 Каждый объект получает атрибут __shareable__ только на чтение, со значением Immutable, Local, Protected или Synchronized. Контролируется доступ к объекту, а не отдельные операции: проверка нужна лишь при создании ссылки потока из ссылки в куче. 🔘 Классы, функции и модули создаются Local. Замыкание, меняющее nonlocal, останется Local, и передача его в чужую группу потоков даст IllegalThreadAccessException. 🔘 Добавляются SynchronizedList, SynchronizedDict и SynchronizedSet; sys.modules станет первым, sys.path — вторым. Авторы предупреждают: эти классы защищают объект от порчи, но потокобезопасности не дают. 🔘 Мотив: PEP 703 даёт параллелизм, но допускает гонки, а PEP 734 безопасен, но объекты между интерпретаторами без копирования не передать. Без чего-то подобного, считают авторы, две сборки CPython останутся навсегда. @zen_of_python

PEP 842 предлагает ключевое слово export и прячет из модуля всё, что им не помечено Питер Бирма опубликовал черновик 25 июля, целевая версия — Python 3.16. Идея в том, чтобы у модуля появился явный публичный интерфейс, а не соглашение об именах с подчёркиванием и переменная __all__, о которой знает только импорт со звёздочкой. 🔘 объявление помечается прямо в определении: export class Public видно снаружи, а обычный class Private из dir(module) исчезает; 🔘 при обращении к скрытому имени поднимается ExportError, наследник AttributeError; 🔘 переменная __export__ со списком строк работает как список экспорта, а имена в ней могут быть ещё не определены, но тогда импорт со звёздочкой упадёт; 🔘 запись from module export NAME равносильна импорту имени с последующим его экспортом; 🔘 export перед def и class разрешён только на уровне модуля, внутри функции это синтаксическая ошибка; 🔘 слово мягкое, то есть существующий код с переменной по имени export продолжит работать, а модули без __export__ ведут себя как раньше. Автор сам подчёркивает, что это не модификатор доступа: ограничение обходится удалением __export__, правкой списка или обращением к __dict__ модуля. Смысл не в защите, а в том, чтобы автодополнение, документация и статический анализ видели границу библиотеки так же, как её видит автор. В обсуждении сразу поднялся вопрос производительности: эталонная реализация пока не оптимизирована и, вероятно, добавляет накладные расходы на обращение к атрибутам модуля. Открытым остаётся и то, как пакет должен добираться до приватных имён собственных подмодулей. Пока это черновик, и до 3.16 у предложения ещё есть время измениться. Обсуждение предложения @zen_of_python

Дэвид Бизли пишет с нуля живьём на сцене, за 46 минут проходя весь путь от простого сокета до собственного цикла событий. Слайдов почти нет, только редактор и терминал. Последовательность такая. Берётся заведомо тяжёлая функция — рекурсивные числа Фибоначчи — и простой сетевой сервис. Сначала он последовательный, и один клиент блокирует всех остальных. Дальше появляются потоки: они спасают там, где программа ждёт ввод-вывод, но на вычислениях упираются в глобальную блокировку интерпретатора. Затем процессный пул, который блокировку обходит, но платит за это сериализацией и передачей данных. Самая ценная часть в конце. Бизли показывает, что генератор с yield — это способ задачи добровольно приостановиться, и из этого прямо на глазах собирает планировщик с очередью задач, а потом цикл событий с select, ожиданием и пробуждением через пару сокетов. После этого asyncio перестаёт быть магией: видно, из каких частей он состоит и почему устроен именно так. @zen_of_python

Создаём программу, которая сама умеет выбирать модели в зависимости от задачи Чем дольше работаешь с ИИ, тем больше убеждаешь
Создаём программу, которая сама умеет выбирать модели в зависимости от задачи Чем дольше работаешь с ИИ, тем больше убеждаешься, что под разные задачи нужны разные модели. Дя простых задач не нужна дорогая модель, а со сложной дешевая может не справиться. А ещё, используя только одну модель, вы рискуете получить кирпич, если эта модель вдруг станет недоступна. Выход — разделить запросы по сложности и держать под рукой запасной вариант. Сначала ваш скрипт решает, насколько труден вопрос, потом отправляет простое к дешёвой модели, а сложное — к мощной. При сбое переключается на резервную модель. Туториал разбирает это на Python шаг за шагом. #python

uv 0.12.5 поменял правило выбора интерпретатора: при одинаковом приоритете теперь предпочитается более новая версия и стандартный вариант Python. Если в конфигурации несколько интерпретаторов с равным приоритетом, окружение может собраться уже не тем Python, что вчера. 🔘 подтянуты CPython 3.10.21, 3.11.16 и 3.12.14; 🔘 в preview у --index и --default-index появился выбор настроенного индекса по имени; 🔘 экспорт SBOM в CycloneDX по умолчанию содержит URL и хеши артефактов; 🔘 cache-physical-space откатывается к логическому размеру файла там, где физический размер файловая система не отдаёт; 🔘 в скриптах по PEP 723 относительные пути к индексам разрешаются относительно каталога скрипта, а не текущего каталога. Выбор индекса по имени авторы помечают как preview. Численных бенчмарков в заметках к релизу нет. @zen_of_python

PyPI перестал принимать новые файлы в релизы старше четырнадцати дней Сет Ларсон описал это изменение 22 июля. Правило простое: если версия пакета опубликована больше двух недель назад, добавить в неё новый файл больше нельзя. Цель — закрыть сценарий, при котором давно стабильную версию тихо дополняют после угона токена или доступа к сборочному процессу. Подтверждённых злоупотреблений на момент публикации не было. 🔘 обсуждение началось ещё вокруг PEP 740 в январе 2024 года и вернулось в марте 2026-го после компрометации двух проектов; 🔘 исправление влили 8 июля 2026 года; 🔘 главное возражение бытовое: проекты иногда докладывают колёса для новой версии Python в уже выпущенный релиз; 🔘 масштаб возражения измерили: среди 15 тысяч самых популярных пакетов так поступили только 56 проектов, добавив совместимое с CPython 3.14 колесо позже чем через две недели; 🔘 на профильной встрече в рамках PyCon US 2026 сочли приемлемым требование выпускать под новый Python новую версию пакета; 🔘 автор просит пока не закладываться на это правило как на гарантию: семантика закрытого релиза и соответствующий интерфейс ещё не определены. Окончательная модель должна приехать вместе с новым протоколом загрузки и предварительными релизами, после стандартизации PEP 694. Так что практический вывод для авторов пакетов такой: план поддержки нового CPython теперь придётся строить через выпуск новой версии, а не через дозагрузку колеса в старую. @zen_of_python

Numba 0.67.0 научилась работать с NumPy 2.5 и собирает пакеты для Python 3.14 и Windows ARM64. 🔘 у np.sum и np.cumsum появился динамический axis, ось теперь можно вычислять во время выполнения; 🔘 добавлена JIT-поддержка np.insert, пока без аргумента axis; 🔘 np.random.binomial в RandomState переключается с BINV на BTPE, когда n * min(p, 1 - p) > 30, поток случайных чисел при этом сохраняется; 🔘 анализ живости переменных перевели на топологический порядок, а проверка принадлежности стеку в _find_back_edges стала за O(1); 🔘 сборки через pycc теперь могут быть побайтно воспроизводимыми на Linux и macOS. Из ломающего: np.row_stack и двумерное векторное произведение убраны вслед за NumPy 2.5, cross2d остаётся только для старых версий. Пакеты под Windows ARM64 на старте ограничены Python 3.14, часть тестов там пропущена из-за проблемы в LLVM 22. Отдельно починили тихую ошибку компиляции при повторном присваивании нелокальной переменной во вложенной функции: раньше генерировался неверный код, теперь вылетает UnsupportedError. Численного бенчмарка ускорения BTPE авторы не приводят. @zen_of_python