Zen of Python
19K subscribers
1.38K photos
202 videos
38 files
3.53K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
Тесты бэкенда 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥52
Правила типизации Python рассыпаны по десяткам PEP и страницам документации, а два разных проверяющих на одном коде дают разные ответы. Андрей Наку и Дорел Лукану попробовали собрать это в одну модель.

Отправная точка: каждый тип в Python представлен классом, класс задаёт абстрактный тип данных, а такой тип описывается в терминах экзистенциальных типов. Дальше авторы разводят три отношения, которые в разговорах обычно смешивают: быть подклассом, быть экземпляром объекта и быть экземпляром типа.

По дороге разбираются вещи, полезные и без формализма:

🔘 почему объединение типов и классов в Python 2.2 и переход к порядку разрешения методов C3 в 2.3 определили нынешнее поведение множественного наследования;
🔘 чем Protocol отличается от абстрактного базового класса и где проходит граница между проверкой во время выполнения и статической;
🔘 как устроен слой метаклассов, где класс одновременно и шаблон для экземпляров, и обычное значение;
🔘 чем расходятся mypy и Pyright: первый сильнее опирается на аннотации и знание стандартной библиотеки, второй заточен под быстрый статический анализ.

Авторы честно ограничивают область: формализм описывает программы, где типы не меняются на ходу, а подтипизация и динамика оставлены на будущее.

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
В асинхронных генераторах появится 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
Please open Telegram to view this post
VIEW IN TELEGRAM
4
⚡️ Тестовое собеседование на Middle Python с разработчиком из Яндекса завтра вечером

Уже завтра вечером в 19:00 по МСК приходите на открытое онлайн-собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.

Как это будет:
🔘 Хачатур — старший разработчик в Яндексе — будет задавать реальные вопросы и задачи разработчику-добровольцу;
🔘 Хачатур будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью;
🔘 В конце можно будет задать любой вопрос Хачатуру.

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходите в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
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
Please open Telegram to view this post
VIEW IN TELEGRAM
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
👍2
Михаил Суриков собрал конвейер, который берёт сгенерированный моделью код на 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
Встречайте новую мини-игру — «Отпуск».

За несколько шагов нужно подготовить героя к поездке: навести порядок, разобрать вещи, отыскать билет и упаковать чемодан. Отдельный этап — отпускной гардероб, и тут всё непросто.

Простое управление, короткие уровни, юмор. Отличный способ отвлечься на пару минут между задачами и заодно поймать промокоды от партнёров!

Попробовать: https://tprg.ru/H2cI
Фильтры распаковки 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
Официальная документация Python теперь доступна на русском — объявили в блоге Python Insider 22 августа.

Открывается по адресу docs.python.org/ru/3/ или переключателем языка в шапке любой страницы: туториал, справочник по языку, описание стандартной библиотеки.

В записи отдельно напоминают, что переводы держатся на участниках сообщества и отстают от оригинала ровно настолько, насколько их перестают обновлять. Ссылки на руководство для переводчиков и панель со статусом языков — там же.

@zen_of_python
8🔥7❤‍🔥4👍2
Понятное сообщение об ошибке и быстро исправленная ошибка — это не одно и то же. В работе из Делфтского технического университета 103 человека чинили баги в Python: 38 новичков и 65 опытных.

Сравнивали три варианта одного и того же сообщения: обычный traceback, короткий совет по делу и развёрнутое объяснение с разбором. Среднее время до исправления — 415,69 секунды у обычного, 324,56 у короткого совета и 423,85 у развёрнутого.

По доле починенных багов расклад разошёлся по опыту. У опытных развёрнутое объяснение оказалось лучшим вариантом: 90 процентов против 68 у обычного traceback. У новичков оно же оказалось худшим: 42 процента против 46.

Субъективные оценки при этом сдвинулись значимо — переписанные сообщения людям нравятся больше. Объективного выигрыша в отладке авторы не нашли.

@zen_of_python
2
EVE Online переезжает с Python 2.7 на Python 3. Прошлый раз версию интерпретатора в игре меняли в 2010 году.

CCP рассказала 25 августа, из чего эта работа состоит. Кодовая база — 2,4 млн строк Python примерно в 20 тысячах файлов, поверх 23 лет данных живых игроков: персонажи, навыки, имущество, ISK. Часть кода написана по правилам Python 2.3 и 2.5, которые тройка уже не принимает.

Первый этап — сделать код совместимым сразу с обеими версиями, продолжая запускаться на 2.7; помогают python-future и 2to3. При компиляции обоими интерпретаторами 95,9% файлов собрались сразу. Осталось около 3300 строк с явными несовместимостями: примерно 1500 старых print, 800 литералов вида 123L, 600 старых форм except и 50 операторов <>.

Опаснее другое: нашлось около 20 тысяч строк, синтаксически корректных в обеих версиях, но работающих по-разному. Классика — 1 / 2, которое даёт 0 в Python 2 и 0.5 в Python 3.

Отдельное ограничение — сервер Tranquility должен оставаться доступным 23,75 часа из каждых 24.

@zen_of_python
5🌚1
Polars 1.44.0 вышел 24 августа, и основная работа в нём пришлась на SQL-слой и на Iceberg.

🔘 Общие табличные выражения теперь кэшируются, а cross join, который раньше появлялся при декорреляции подзапросов в предикатах равенства, устраняется. Неквалифицированные предикаты соединения опускаются до inner join.

🔘 В SQL добавили коррелированные подзапросы с IN и квантифицированные сравнения с подзапросом.

🔘 Нативный scan_iceberg понимает эволюцию схемы, deletion vectors третьей версии и свойства снапшотов, а пути к объектному хранилищу принимает напрямую.

🔘 join_where поддерживает больше типов соединения, появились скалярные произведения для массивов фиксированного размера и метод struct.drop().

🔘 При разрешении схемы в __arrow_c_stream__ Polars освобождает GIL. Отдельно починили порчу данных во вложенных LargeList при работе через Arrow.

🔘 Параметр rechunk у функций чтения и сканирования вместе с Expr.rechunk() объявлены устаревшими.

Чисел по скорости в релизе нет, так что заявлять конкретное ускорение не станем.

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1