Zen of Python
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL
Ko'proq ko'rsatish📈 Telegram kanali Zen of Python analitikasi
Zen of Python (@zen_of_python) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 18 952 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 6 826-o'rinni va Rossiya mintaqasida 34 989-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 18 952 obunachiga ega bo‘ldi.
25 Avgust, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -164 ga, so‘nggi 24 soatda esa -9 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 11.07% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 6.35% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 2 099 marta ko‘riladi; birinchi sutkada odatda 1 204 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 6 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent github, rust, pip, api, install kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Полный Дзен Пайтона в одном канале
Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site
Регистрация в перечне РКН: https://tprg.ru/xZOL”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 26 Avgust, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
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_pythonGZipMiddleware и подтянута защита FileResponse.
🔘 тела от 128 КиБ сжимаются в рабочем потоке, а не в цикле событий; вместо GzipFile используется zlib.compressobj, и компрессор создаётся лениво;
🔘 потоковые ответы получают flush на каждом чанке, частичные ответы (206) больше не сжимаются;
🔘 FileResponse отклоняет перевёрнутый однобайтовый Range и ограничивает число диапазонов сотней;
🔘 в 1.6.0 появился max_body_size и поддержка расширения http.response.debug.
Starlette лежит под FastAPI, так что изменение задевает и его. Полный список правок по версиям в release notes.
@zen_of_pythonyield 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_pythonProtocol отличается от абстрактного базового класса и где проходит граница между проверкой во время выполнения и статической;
🔘 как устроен слой метаклассов, где класс одновременно и шаблон для экземпляров, и обычное значение;
🔘 чем расходятся mypy и Pyright: первый сильнее опирается на аннотации и знание стандартной библиотеки, второй заточен под быстрый статический анализ.
Авторы честно ограничивают область: формализм описывает программы, где типы не меняются на ходу, а подтипизация и динамика оставлены на будущее.
@zen_of_pythonpytest-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_pythonobj.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__get__, __set__ и __delete__. Класс, реализующий их, перехватывает доступ к атрибуту. Из этого собрано больше, чем кажется:
🔘 property, staticmethod, classmethod и super() — всё это дескрипторы, и в руководстве показаны их упрощённые реализации на Python;
🔘 обычная функция становится связанным методом ровно потому, что функция — тоже дескриптор;
🔘 __set_name__ позволяет дескриптору узнать имя атрибута, под которым его объявили;
🔘 разница между дескрипторами с записью и без определяет, кто победит: дескриптор или словарь экземпляра;
🔘 на этом же построены __slots__ и модели в ORM.
Практическая часть — готовый класс Validator и валидаторы OneOf, Number и String: проверка типов и диапазонов при присваивании, без единой строчки проверок в коде, который этими полями пользуется.
@zen_of_python__shareable__ только на чтение, со значением Immutable, Local, Protected или Synchronized. Контролируется доступ к объекту, а не отдельные операции: проверка нужна лишь при создании ссылки потока из ссылки в куче.
🔘 Классы, функции и модули создаются Local. Замыкание, меняющее nonlocal, останется Local, и передача его в чужую группу потоков даст IllegalThreadAccessException.
🔘 Добавляются SynchronizedList, SynchronizedDict и SynchronizedSet; sys.modules станет первым, sys.path — вторым. Авторы предупреждают: эти классы защищают объект от порчи, но потокобезопасности не дают.
🔘 Мотив: PEP 703 даёт параллелизм, но допускает гонки, а PEP 734 безопасен, но объекты между интерпретаторами без копирования не передать. Без чего-то подобного, считают авторы, две сборки CPython останутся навсегда.
@zen_of_pythonexport и прячет из модуля всё, что им не помечено
Питер Бирма опубликовал черновик 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_pythonyield — это способ задачи добровольно приостановиться, и из этого прямо на глазах собирает планировщик с очередью задач, а потом цикл событий с select, ожиданием и пробуждением через пару сокетов.
После этого asyncio перестаёт быть магией: видно, из каких частей он состоит и почему устроен именно так.
@zen_of_python--index и --default-index появился выбор настроенного индекса по имени;
🔘 экспорт SBOM в CycloneDX по умолчанию содержит URL и хеши артефактов;
🔘 cache-physical-space откатывается к логическому размеру файла там, где физический размер файловая система не отдаёт;
🔘 в скриптах по PEP 723 относительные пути к индексам разрешаются относительно каталога скрипта, а не текущего каталога.
Выбор индекса по имени авторы помечают как preview. Численных бенчмарков в заметках к релизу нет.
@zen_of_pythonnp.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_pythonx = 23. Ответ — не «в переменную кладётся значение», а «имя привязывается к объекту». Из этого простого сдвига вырастает объяснение почти всех классических непоняток:
🔘 почему Python нельзя описать ни как передачу по значению, ни как передачу по ссылке;
🔘 почему два имени могут указывать на один объект и менять его вместе;
🔘 почему присваивание никогда не копирует объект;
🔘 почему += для списка и для числа ведут себя по-разному;
🔘 почему изменяемый аргумент по умолчанию живёт между вызовами;
🔘 почему аргументы функции, атрибуты объекта и переменная цикла — это всё одна и та же операция связывания имени.
Бэтчелдер разбирает это на диаграммах с коробочками и стрелками, без единой строчки про внутренности интерпретатора. Именно поэтому доклад одиннадцатилетней давности не устарел ни на строчку: семантика имён и объектов с тех пор не менялась.
@zen_of_python