Forwarded from Python: задачки и вопросы
Please open Telegram to view this post
VIEW IN TELEGRAM
🤷♂8👍3
Выбор библиотеки для логирования в Python, автор сделал свежий обзор, кратко перескажу.
Стандартный logging остаётся базой — им пользуются все фреймворки и библиотеки, и через него проходит интеграция с OpenTelemetry. Но конфигурация через dictConfig не самая удобная, а контекст на уровне запроса приходится прокидывать вручную через contextvars.
Главный вывод статьи: выбор библиотеки менее важен, чем практики. Structured output, консистентный контекст, правильные уровни и чистота полей — вот что делает логи полезными в production. Если stdlib с python-json-logger работает, не мигрируйте ради миграции. Если boilerplate мешает — берите structlog.
@zen_of_python
Стандартный logging остаётся базой — им пользуются все фреймворки и библиотеки, и через него проходит интеграция с OpenTelemetry. Но конфигурация через dictConfig не самая удобная, а контекст на уровне запроса приходится прокидывать вручную через contextvars.
structlog — главный кандидат на замену. Процессорный pipeline из коробки даёт redaction, enrichment и sampling. contextvars работают через asyncio без дополнительного кода. При этом можно оставить stdlib на бэке — вся хэндлер-экосистема сохраняется. По бенчмаркам structlog примерно в 2 раза быстрее stdlib и Loguru: 242k ops/s против 139k и 147k соответственно.Loguru — минимум setup, но ценой глобального логгера без иерархии компонентов. Нет нативной OpenTelemetry-интеграции, только через InterceptHandler в обход.Logbook — legacy от Armin Ronacher. Нет structured JSON из коробки, нет OTel. Для новых проектов не рекомендуется.picologging — drop-in replacement на C от Microsoft, в 4–17 раз быстрее, но проект не поддерживается с 2023 года, нет поддержки Python 3.13+. Не для продакшена.Главный вывод статьи: выбор библиотеки менее важен, чем практики. Structured output, консистентный контекст, правильные уровни и чистота полей — вот что делает логи полезными в production. Если stdlib с python-json-logger работает, не мигрируйте ради миграции. Если boilerplate мешает — берите structlog.
@zen_of_python
👍5❤1
Pyrefly — быстрый type checker и language server для Python — добрался до релиза версии 1.0
С бета-версии в ноябре 2025 года прошло больше 60 выпусков. Diagnostics после сохранения ускорились в 2–125 раз, полная проверка крупных проектов — на 20–36%, памяти стало меньше на 40–60%. Соответствие спецификации Python typing выросло с 70% до 90%.
Добавили пресеты конфигурации: от отключённых проверок до strict. Для проектов без конфига — автоматический lightweight basic preset, для миграции с mypy и pyright — автоматическая конвертация настроек.
Улучшили LSP: Safe Delete, точная навигация, hover cards с богатой информацией. Полная поддержка Jupyter notebooks на уровне обычных .py файлов. Расширили поддержку Django, Pydantic, Pytest.
Два новых инструмента для внедрения в существующие кодовые базы: coverage report и baseline files (снимок текущих ошибок, чтобы показывать только новые).
Не скажу, что я план фанат, мне больше по душе ty, но они пока что на версии 0.0.35 т.е. сами дают понять, что делают крутую штуку, но в прод рановато.
@zen_of_python (теперь в VK и Max)
С бета-версии в ноябре 2025 года прошло больше 60 выпусков. Diagnostics после сохранения ускорились в 2–125 раз, полная проверка крупных проектов — на 20–36%, памяти стало меньше на 40–60%. Соответствие спецификации Python typing выросло с 70% до 90%.
Добавили пресеты конфигурации: от отключённых проверок до strict. Для проектов без конфига — автоматический lightweight basic preset, для миграции с mypy и pyright — автоматическая конвертация настроек.
Улучшили LSP: Safe Delete, точная навигация, hover cards с богатой информацией. Полная поддержка Jupyter notebooks на уровне обычных .py файлов. Расширили поддержку Django, Pydantic, Pytest.
Два новых инструмента для внедрения в существующие кодовые базы: coverage report и baseline files (снимок текущих ошибок, чтобы показывать только новые).
Не скажу, что я план фанат, мне больше по душе ty, но они пока что на версии 0.0.35 т.е. сами дают понять, что делают крутую штуку, но в прод рановато.
@zen_of_python (теперь в VK и Max)
❤4👍4
В Python 3.14 в стандартную библиотеку добавили модуль
Это финал длинной истории. PEP 554 в 2017 году описал идею, PEP 684 в 2023 дал каждому интерпретатору собственный GIL, и PEP 734, принятый в июне 2025, превратил всё это в стандартный Python-модуль. До 3.14 функционал был доступен только через C API.
API ровно такой, какой ожидаешь:
Каждый интерпретатор изолирован: своя память, свой GIL, свой импорт-кеш. Простые типы передаются через специальный канал без копирования, сложные идут через сериализацию вроде
Что это даёт:
— Настоящая многозадачность в одном процессе без
— Совместимость с
— Один процесс. Общие файловые дескрипторы, единое управление, без накладных расходов на
У подхода одно главное ограничение: C-расширения. Стабильность под per-interpreter GIL не гарантирована, и многим библиотекам ещё предстоит дозревать. Чистый Python и библиотеки с поддержкой PEP 684 работают, остальные могут падать.
PEP 734 и free-threading решают одну задачу разными способами. Free-threading убирает GIL вообще: больше совместимости, меньше изоляции. Sub-interpreters сохраняют GIL на интерпретатор: меньше совместимости, больше изоляции. Похоже, в долгую Python поддержит оба пути.
Свежий разбор с примерами и архитектурой: https://alexeev-dev.bearblog.dev/running-multiple-interpreters-in-python-code-incredible-speed/
@zen_of_python (теперь в VK и Max)
@zen_of_python (теперь в VK и Max)
concurrent.interpreters: публичный API для запуска нескольких полноценных интерпретаторов внутри одного процесса.Это финал длинной истории. PEP 554 в 2017 году описал идею, PEP 684 в 2023 дал каждому интерпретатору собственный GIL, и PEP 734, принятый в июне 2025, превратил всё это в стандартный Python-модуль. До 3.14 функционал был доступен только через C API.
API ровно такой, какой ожидаешь:
import concurrent.interpreters as interpreters
interp = interpreters.create()
interp.exec('print("Hello from subinterp")')
interp.close()
Каждый интерпретатор изолирован: своя память, свой GIL, свой импорт-кеш. Простые типы передаются через специальный канал без копирования, сложные идут через сериализацию вроде
pickle.Что это даёт:
— Настоящая многозадачность в одном процессе без
multiprocessing. Каждый интерпретатор едет на своём GIL и параллельно работает на отдельном ядре.— Совместимость с
asyncio. CPU-bound подзадачи можно гонять в субинтерпретаторах, а сетевой ввод-вывод оставить в основном цикле событий.— Один процесс. Общие файловые дескрипторы, единое управление, без накладных расходов на
fork и spawn.У подхода одно главное ограничение: C-расширения. Стабильность под per-interpreter GIL не гарантирована, и многим библиотекам ещё предстоит дозревать. Чистый Python и библиотеки с поддержкой PEP 684 работают, остальные могут падать.
PEP 734 и free-threading решают одну задачу разными способами. Free-threading убирает GIL вообще: больше совместимости, меньше изоляции. Sub-interpreters сохраняют GIL на интерпретатор: меньше совместимости, больше изоляции. Похоже, в долгую Python поддержит оба пути.
Свежий разбор с примерами и архитектурой: https://alexeev-dev.bearblog.dev/running-multiple-interpreters-in-python-code-incredible-speed/
@zen_of_python (теперь в VK и Max)
@zen_of_python (теперь в VK и Max)
1❤12🔥5👍3💊1
vLLM-инференс в облаке без собственной инфраструктуры
Selectel запустил Foundation Models Catalog — управляемый сервис, где вы выбираете модель из каталога, а провайдер берёт на себя GPU, масштабирование и наблюдаемость. Движок под капотом: vLLM, питоновская библиотека поверх PyTorch, которую сейчас называют производственным стандартом для инференса.
Что это даёт на практике: вместо того чтобы поднимать свой vLLM-сервер, арендовать GPU и настраивать мониторинг, вы обращаетесь к уже готовому OpenAI-совместимому эндпоинту через openai-клиент или requests. Код тот же, что при локальном запуске. Автомасштабирование, логи и метрики включены.
В каталоге сейчас IBM Granite, Qwen, DeepSeek, Phi, Mistral; скоро Gemma и Whisper. Оплата пока за вычислительные ресурсы, следующим шагом станет тарификация по токенам.
Подробнее на Tproger.
@zen_of_python (теперь в VK и Max)
Selectel запустил Foundation Models Catalog — управляемый сервис, где вы выбираете модель из каталога, а провайдер берёт на себя GPU, масштабирование и наблюдаемость. Движок под капотом: vLLM, питоновская библиотека поверх PyTorch, которую сейчас называют производственным стандартом для инференса.
Что это даёт на практике: вместо того чтобы поднимать свой vLLM-сервер, арендовать GPU и настраивать мониторинг, вы обращаетесь к уже готовому OpenAI-совместимому эндпоинту через openai-клиент или requests. Код тот же, что при локальном запуске. Автомасштабирование, логи и метрики включены.
В каталоге сейчас IBM Granite, Qwen, DeepSeek, Phi, Mistral; скоро Gemma и Whisper. Оплата пока за вычислительные ресурсы, следующим шагом станет тарификация по токенам.
Подробнее на Tproger.
@zen_of_python (теперь в VK и Max)
❤2🔥1
В Long Beach на PyCon US 2026 14 мая прошёл Typing Summit: четыре часа, восемь докладов, один трек. Несколько моментов с саммита.
Гвидо ван Россум открыл саммит докладом про то, что правило PEP 484 «никакого нового синтаксиса для типов» де-факто давно нарушено:
Дуглас Креагер из Astral (его слайд гласил «an OpenAI joint») показал девятистрочный пример, на котором все продакшен-чекеры (mypy, pyright, pyre, Pyrefly, ty) дают неверный ответ:
Прямой вызов
Коннер Нильсен из команды Pyrefly доложил результаты экспериментов с ИИ-агентами. Если код хорошо типизирован и type checker подключён к агенту через обёртку с циклом «думай, действуй, наблюдай»:
— Доля успешных решений на внутренних бенчмарках команды поднялась с 79,6 до 83,9 процента.
— На 21 процент меньше шагов до решения.
— На 14 процентов быстрее по полному времени работы.
На слабо типизированном коде из SWE-bench Verified эффекта почти нет. Type checker ловит ошибки в соседних с задачей файлах, и агент уходит чинить их вместо основной задачи. Наблюдение по моделям: Claude Sonnet 4.5 чинит каждую ошибку, GPT-5 codex игнорирует типы, пока обёртка насильно их не подсунет.
Ещё были доклады про intersection types (Jelle Zijlstra), PEP 827 от Vercel про conditional и mapped types по образцу TypeScript, tensor-shape типы в Pyrefly, и формализация подмножества Python в Lean 4. Полный обзор здесь: https://bernat.tech/posts/pycon-us-2026-typing-summit-recap/
@zen_of_python (теперь в VK и Max)
Гвидо ван Россум открыл саммит докладом про то, что правило PEP 484 «никакого нового синтаксиса для типов» де-факто давно нарушено:
TypedDict, ParamSpec, оператор type и прочее. Его аргумент: пора признать это формально и выбирать приоритеты по реальной боли пользователей. Опирался на Python Typing Survey 2025.Дуглас Креагер из Astral (его слайд гласил «an OpenAI joint») показал девятистрочный пример, на котором все продакшен-чекеры (mypy, pyright, pyre, Pyrefly, ty) дают неверный ответ:
def choose[A](a1: A, a2: A) -> A:
return random.choice([a1, a2])
def partial[X, Y, Z](fn: Callable[[X, Y], Z], x: X) -> Callable[[Y], Z]: ...
p = partial(choose, None)
p(2) # все говорят: ошибка, 2 не None
p("hello") # то же самое
Прямой вызов
choose(None, 2) работает корректно: A решается в None | Literal[2]. После применения partial система ломается. Креагер предлагает другую стратегию: тянуть весь набор констрейнтов как отложенный обобщённый тип, без преждевременной подстановки. ty переезжает на этот подход, внутри используется тернарная структура BDD (двоичные решающие диаграммы с третьим «неопределённым» ребром).Коннер Нильсен из команды Pyrefly доложил результаты экспериментов с ИИ-агентами. Если код хорошо типизирован и type checker подключён к агенту через обёртку с циклом «думай, действуй, наблюдай»:
— Доля успешных решений на внутренних бенчмарках команды поднялась с 79,6 до 83,9 процента.
— На 21 процент меньше шагов до решения.
— На 14 процентов быстрее по полному времени работы.
На слабо типизированном коде из SWE-bench Verified эффекта почти нет. Type checker ловит ошибки в соседних с задачей файлах, и агент уходит чинить их вместо основной задачи. Наблюдение по моделям: Claude Sonnet 4.5 чинит каждую ошибку, GPT-5 codex игнорирует типы, пока обёртка насильно их не подсунет.
Ещё были доклады про intersection types (Jelle Zijlstra), PEP 827 от Vercel про conditional и mapped types по образцу TypeScript, tensor-shape типы в Pyrefly, и формализация подмножества Python в Lean 4. Полный обзор здесь: https://bernat.tech/posts/pycon-us-2026-typing-summit-recap/
@zen_of_python (теперь в VK и Max)
❤7👍3
Наткнулся тут на обсуждение, которое мне тоже периодически приходит в голову: стоит ли использовать uv, если OpenAI покупает Astral. Напомню, Astral это те ребята, которые сделали uv, ruff и ty, которые мы так любим.
Короткий вывод: для новых Python-проектов uv всё ещё выглядит самым практичным выбором.
Почему разработчики так за него держатся: uv закрывает сразу несколько бытовых задач: ставит Python-версии, создаёт venv, ставит зависимости, фиксирует lockfile, запускает команды в окружении и заменяет часть сценариев pip, pip-tools, pipx, poetry и pyenv.
Типичный flow становится проще:
Риск с OpenAI тут скорее управленческий, а не технический. Важно смотреть на лицензию, телеметрию, темп релизов и то, останется ли core-разработка открытой. На практике же зависимости живут в стандартном
То есть вопрос скорее не про то, использовать ли uv, а о том как использовать его без религии и без лишней привязки к одному владельцу.
А вы как думаете? Продолжаем жить на uv, всё норм?
@zen_of_python
Короткий вывод: для новых Python-проектов uv всё ещё выглядит самым практичным выбором.
Почему разработчики так за него держатся: uv закрывает сразу несколько бытовых задач: ставит Python-версии, создаёт venv, ставит зависимости, фиксирует lockfile, запускает команды в окружении и заменяет часть сценариев pip, pip-tools, pipx, poetry и pyenv.
Типичный flow становится проще:
uv init
uv add fastapi
uv run app.py
uv sync --frozen
Риск с OpenAI тут скорее управленческий, а не технический. Важно смотреть на лицензию, телеметрию, темп релизов и то, останется ли core-разработка открытой. На практике же зависимости живут в стандартном
pyproject.toml, а Python уже движется к стандартному lockfile через PEP 751 / pylock.toml, так что миграция с uv должна быть проще, чем с более закрытых форматов.То есть вопрос скорее не про то, использовать ли uv, а о том как использовать его без религии и без лишней привязки к одному владельцу.
А вы как думаете? Продолжаем жить на uv, всё норм?
@zen_of_python
👍4❤2
PyPy 7.3.23 стал доступен для скачивания, а PyPy описала релиз как bugfix-обновление.
Напомню, PyPy — альтернативный интерпретатор Python с JIT. Его обычно пробуют там, где много долгоживущего CPU-bound кода на чистом Python и хочется ускорения без переписывания на C.
Что важно в 7.3.23:
🔘 убрали ложные warning'и про неиспользованные корутины при доступе к
🔘 починили множественное наследование для смешанных Python/C-extension типов, включая сценарии вокруг
🔘 PyPy3.11 теперь идёт со стандартной библиотекой CPython 3.11.15;
🔘 дизассемблер стал ближе к CPython: интерпретатор перешёл на exception tables вместо отдельных opcodes. На скорость это пока не влияет.
Если вы уже используете PyPy, то обновление стоит поставить, API совместим с линейкой 7.3. Если только думаете попробовать — начните с прогона тестов на PyPy3.11 и проверки зависимостей.
PyPy лучше всего раскрывается на чистом Python-коде. В проектах, где основная нагрузка уходит в NumPy, pandas, torch или другие C-расширения, прирост может быть совсем другим.
@zen_of_python
Напомню, PyPy — альтернативный интерпретатор Python с JIT. Его обычно пробуют там, где много долгоживущего CPU-bound кода на чистом Python и хочется ускорения без переписывания на C.
Что важно в 7.3.23:
cr_frame;pybind11 и cpyext;Если вы уже используете PyPy, то обновление стоит поставить, API совместим с линейкой 7.3. Если только думаете попробовать — начните с прогона тестов на PyPy3.11 и проверки зависимостей.
PyPy лучше всего раскрывается на чистом Python-коде. В проектах, где основная нагрузка уходит в NumPy, pandas, torch или другие C-расширения, прирост может быть совсем другим.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🆒3👌1
Попалось обсуждение про опенсорс. Мейнтейнер описывает ситуацию: кто-то форкает репозиторий, ссылается в коммитах на его issue — это приятно, человек заинтересовался. А открываешь ветку, и там чистый ИИ-слоп. Файлы свалены в корень вместо
Отдельная деталь: у автора такого PR обычно куча форков других репозиториев, и везде он охотится за меткой good first issue. Похоже на сбор очков на GitHub, а не на желание реально закрыть задачу. Отсюда вопрос: стоит ли тратить силы на честное ревью и как закрыть PR, не отпугнув нормальных будущих контрибьюторов.
Что советуют бывалые мейнтейнеры:
🔘 Просто закрыть и заблокировать. Самый частый ответ. К остальным это не враждебно: либо человек игнорит правила проекта, либо приносит код без ценности. И то и другое повод закрыть.
🔘 Завести метку вроде «doesn't follow contribution rules» и объяснить её в гайдлайнах. Тогда на закрытие уходит три клика, а если вернётся живой человек и поправит PR, это уже сигнал, что стоит посмотреть.
🔘 Поднять минимальный порог через CI. ruff, mypy или basedpyright, pytest с требованием покрытия, проверка докстрингов. Линтеры отсекают мусор автоматически, ещё до человеческого ревью.
🔘 Не закрывать вслепую каждый случай. Люди с неродным английским всё чаще прогоняют описание и доки через ИИ. Если контрибьюция небольшая, есть смысл быстро глянуть сам код.
Был и спор про
А вы как с этим справляетесь, если ведёте свои репозитории?
@zen_of_python
src, тесты с print вместо pytest (хотя в CONTRIBUTING всё расписано), импорты вида from mylib import Foo, Bar, которых в коде и документации никогда не было. Сверху сабклассы от этих галлюцинированных типов, разобрать невозможно.Отдельная деталь: у автора такого PR обычно куча форков других репозиториев, и везде он охотится за меткой good first issue. Похоже на сбор очков на GitHub, а не на желание реально закрыть задачу. Отсюда вопрос: стоит ли тратить силы на честное ревью и как закрыть PR, не отпугнув нормальных будущих контрибьюторов.
Что советуют бывалые мейнтейнеры:
Был и спор про
AGENTS.md. Одни считают, что инструкции для агента поднимают качество PR. Другие, что само наличие файла как бы говорит «здесь рады ИИ-коду» и только притягивает слоп.А вы как с этим справляетесь, если ведёте свои репозитории?
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Осенью нас ждёт Python 3.15, набор фич для него уже заморожен в бете. Заглянул, что там приедет, и нашёл пару вещей, которые поменяют привычки.
Самое заметное: явные ленивые импорты (PEP 810). Появляется ключевое слово lazy. Модуль пишется в импорте как обычно, но реально подгружается только при первом обращении.
Раньше ради быстрого старта тяжёлые импорты прятали внутрь функций. Теперь их можно держать наверху файла, как и положено, без платы за импорт при запуске. Есть и глобальные переключатели: флаг -X lazy_imports и переменная окружения, если хочется включить лень разом. И это не воскрешение отклонённого когда-то PEP 690, механизм тут другой и явный.
Второе приятное: встроенный frozendict (PEP 814). Неизменяемый и хешируемый словарь прямо в языке, без импортов. То же, чем frozenset является для set.
Ещё одно: PEP 661 даёт штатный способ делать sentinel-значения вместо самодельных MISSING = object(). Теперь это нормальный механизм с человеческим repr и поддержкой в аннотациях типов.
Под капотом тоже движение: переработанный JIT даёт около 8-9% на Linux x86-64, интерпретатор с tail-call приехал и на Windows (там плюс 15-20%), появился стабильный ABI для free-threaded сборок.
Финальный 3.15 ждём осенью, но облик версии уже ясен. Лично я больше всего жду lazy import: сколько раз приходилось прятать импорты в функции ради быстрого CLI.
А вы ждёте 3.15 или пока сидите на чём-то постарше?
@zen_of_python
Самое заметное: явные ленивые импорты (PEP 810). Появляется ключевое слово lazy. Модуль пишется в импорте как обычно, но реально подгружается только при первом обращении.
lazy import json
lazy from pathlib import Path
print("старт") # json и pathlib ещё не загружены
data = json.loads('{"ok": true}') # здесь json наконец подгружается
Раньше ради быстрого старта тяжёлые импорты прятали внутрь функций. Теперь их можно держать наверху файла, как и положено, без платы за импорт при запуске. Есть и глобальные переключатели: флаг -X lazy_imports и переменная окружения, если хочется включить лень разом. И это не воскрешение отклонённого когда-то PEP 690, механизм тут другой и явный.
Второе приятное: встроенный frozendict (PEP 814). Неизменяемый и хешируемый словарь прямо в языке, без импортов. То же, чем frozenset является для set.
config = frozendict({"debug": True, "retries": 3})
# поменять значение уже нельзя, будет TypeErrorЕщё одно: PEP 661 даёт штатный способ делать sentinel-значения вместо самодельных MISSING = object(). Теперь это нормальный механизм с человеческим repr и поддержкой в аннотациях типов.
Под капотом тоже движение: переработанный JIT даёт около 8-9% на Linux x86-64, интерпретатор с tail-call приехал и на Windows (там плюс 15-20%), появился стабильный ABI для free-threaded сборок.
Финальный 3.15 ждём осенью, но облик версии уже ясен. Лично я больше всего жду lazy import: сколько раз приходилось прятать импорты в функции ради быстрого CLI.
А вы ждёте 3.15 или пока сидите на чём-то постарше?
@zen_of_python
🔥13❤1