20070
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL
PEP 822 предлагает d-строки — новый способ работы с многострочным текстом в Python 3.15.
Проблема: при использовании тройных кавычек внутри функций приходится либо ломать отступы кода, либо получать лишние пробелы в строке. d-строки автоматически удаляют общий ведущий отступ.
def example():
query = d"""
SELECT *
FROM users
WHERE active = true
"""
# query не содержит лишних пробелов слева
textwrap.dedent(), но на уровне синтаксиса — без вызова функции и накладных расходов в рантайме.df"""...""" для шаблонов с подстановкой переменных.
⚡️ Вышли критические обновления безопасности Django — 6.0.2, 5.2.11 и 4.2.28.
Закрыты три SQL-инъекции высокой критичности:
CVE-2026-1207 — инъекция через raster lookups в PostGIS при использовании пользовательских данных как индексов band.
CVE-2026-1287 — инъекция через управляющие символы в алиасах колонок при использовании FilteredRelation со специально сформированными словарями.
CVE-2026-1312 — инъекция через order_by() и FilteredRelation при использовании точки в алиасах колонок.
Также исправлены: DoS через повторяющиеся заголовки в ASGI (CVE-2025-14550), DoS через незакрытые HTML-теги в Truncator (CVE-2026-1285), timing-атака для перечисления пользователей в mod_wsgi (CVE-2025-13473).
Если используете PostGIS или FilteredRelation — обновляйтесь срочно.
@zen_of_python
Bandit — SAST-сканер для Python от PyCQA (те же люди, что делают pylint и flake8). Парсит AST, ищет типичные дыры: eval(), хардкод паролей, слабая криптография, небезопасные temp-файлы.
➡️ Как работает
Каждый файл → AST → прогон плагинов по нодам → отчёт. У каждой находки два атрибута: severity (критичность) и confidence (уверенность, что это реальная проблема). Это помогает расставить приоритеты — сначала High/High, потом остальное.
Интеграция:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/PyCQA/bandit
rev: 1.7.5
hooks:
- id: bandit
args: ['-ll', '-ii']
PyCQA/bandit-action@v1) и расширение для VS Code.
Django в продакшене на 500 000 пользователей в месяц — не стартап, а французское правительство.
La Suite — экосистема цифровых инструментов для госслужащих Франции. 15 министерств, 500 000 активных пользователей ежемесячно.
Что внутри:
🔘Tchap — мессенджер на Matrix, 375 000 активных пользователей ежемесячно
🔘Visio — видеозвонки с ИИ-транскрипцией на LiveKit
🔘Docs — совместное редактирование
🔘Grist — таблицы как база данных
🔘France Transfert — передача больших файлов
Бэкенд на Django. Весь код в открытом доступе.
Данные хранятся на SecNumCloud во Франции с полной портабельностью — экспорт в .ppt, .xls, .odt без vendor lock-in.
Это хороший пример того, как выглядит Django в govtech-продакшене уровня страны. Можно изучить архитектуру, посмотреть как они решают масштабирование, безопасность и интеграцию с legacy-системами.
📎 La Suite, GitHub
@zen_of_python
Репозиторий anthropics/skills — самый популярный Python-репозиторий на GitHub прямо сейчас. +1400 звёзд в день, 50 тыс. уже набежало.
➡️ Что такое Skills
Skills — это папки с инструкциями и скриптами, которые Claude динамически подгружает для выполнения специализированных задач. По сути, плагины для ИИ: вместо того чтобы каждый раз объяснять модели, как работать с вашими процессами, вы описываете это один раз в файле.
Примеры: создание документов с учётом правил компании, анализ данных по специфическим воркфлоу, генерация MCP-серверов, тестирование веб-приложений.
➡️ Как устроено
Skill — это YAML с названием, описанием и markdown-инструкциями. Можно указать примеры использования и ограничения. Claude читает это при активации и следует описанным правилам.
---
name: my-skill-name
description: What this skill does
---
# Instructions for Claude...
Один разработчик реализовал bytes.replace() из Python на CUDA — для обработки многогигабайтных файлов прямо на GPU без передачи данных на CPU.
Бенчмарки (RTX 3090)
🔘1 MB: 1,09x (почти одинаково)
🔘5 MB: 1,80x
🔘50 MB: 3,43x
🔘100 MB: 4,37x
Среднее ускорение: 3,45x, пропускная способность: 0,79 GB/s
Ключевые фичи
🔘Точная семантика Python (leftmost, non-overlapping replacements)
🔘Streaming mode — файлы больше VRAM обрабатываются чанками
🔘Session API — несколько замен подряд без переинициализации
🔘Thread-safe
Пример
from cuda_replace import CReplaceLib
lib = CReplaceLib()
result = lib.unified(data, b"pattern", b"replacement")
# Для больших файлов
cleaned = lib.gpu_streaming(huge_data, b"old", b"new", chunk_size=256*1024*1024)
Бывший CTO поделился тестом, который за 15 секунд отсеивал половину кандидатов. И это не фигура речи, реально 53% ошибались.
Я специально спрячу объяснение за спойлер, чтобы вы могли перейти по ссылке и попробовать решить задачу. Осуждать никого не будем, просто проверьте себя.
Если ваш ответ 1, то поздравляю, вы быстро в уме разобрали код и поняли логику. Если -11, то значит вы скопировали код в ChatGPT или интерпретатор и поленились делать в уме. Так же поступают в среднем 50% кандидатов.
Дело в том, что в коде спрятан знак =, который появляется только при копировании и условие меняется на >= 3. Ну и ответ, конечно, тоже.
И в чём смысл?
Не то чтобы копировать — это прям плохо. Смысл скорее в том, что для простой задачи быстрее прогнать код в голове, чем открывать терминал. Если кандидат не может выполнить три итерации цикла мысленно — это сигнал.
Автор признаёт: метод не идеальный, бывают false negatives. Но он вдвое сокращает время на обработку откликов.
@zen_of_python
Niquests — это современная версия requests: быстрее и с поддержкой новых фич протокола HTTP/2 и HTTP/3. Автор позиционирует вообще как самую быструю и показывает бенчмарки с обгоном httpx и aiohttp по количеству запросов в секунду.
Основная фишка — вместо кучи соединений используется настоящий HTTP/2+ multiplexing — много запросов через несколько установленных коннектов. На больших нагрузках это решает. По сути это то, как делают запросы современные браузеры.
Drop-in замена для requests — тот же API, просто меняешь импорт. При этом автоматически работает HTTP/1.1, HTTP/2 и HTTP/3 — либа выбирает лучший протокол сама. Есть Async, WebSocket через HTTP/1, 2, 3, DNS‑over‑HTTPS, DNSSEC и поддержка нового питона без GIL.
Если просто иногда дёргаете один‑два API — можно не париться и оставаться на той либе, что сейчас используете. Если хотя бы сотни запросов, то можно попробовать получить прирост скорости просто заменой импорта.
📎 Код на GitHub, на видео тот самый бенчмарк
@zen_of_python
dbgpu — база 2000+ видеокарт с TechPowerUp в Python
Python-пакет для работы со спецификациями GPU. Парсит TechPowerUp, отдаёт структурированные данные. MIT лицензия.
Установка и использование
pip install dbgpu
dbgpu lookup "GeForce RTX 4090"
from dbgpu import GPUDatabase
db = GPUDatabase.default()
spec = db["GeForce RTX 4090"]
# или нечёткий поиск: db.search("4090")
pip install dbgpu[build]
dbgpu build --manufacturer NVIDIA --start-year 2023
Если взять конкретный язык, то всё может быть ещё хуже.
В Python, например, тип bool наследуется от int, поэтому True и False — это полноценные объекты — целые числа. Каждый объект в CPython несёт накладные расходы:
🔘PyObject header — счётчик ссылок + указатель на тип (~16 байт на 64-бит)
🔘PyLongObject — структура для хранения целых чисел произвольной длины (~12 байт дополнительно)
Можно проверить самостоятельно:
import sys
print(sys.getsizeof(True)) # 28
print(sys.getsizeof(False)) # 28
numpy.array с dtype=bool (1 байт на значение) или битовые массивы.
PCA — стандартный способ уменьшить размерность данных (1000 фичей → 50). Главная боль: нужно выбирать n_components — сколько компонент оставить. Обычно либо перебор через GridSearch, либо «ну возьму 50, должно хватить». Библиотека randomized-svd решает проблему автоматически.
🔘Сама определяет, где заканчивается сигнал и начинается шум
🔘Отрезает лишнее без ручного подбора
🔘Один проход вместо кросс-валидации
➡️ Бонус для больших данных
PCA требует центрирования матрицы. Если матрица разреженная (sparse), центрирование делает её плотной — память взрывается. Библиотека умеет считать PCA на sparse-матрицах без этой проблемы.
Использование
from randomized_svd import RandomizedSVD
rsvd = RandomizedSVD(n_components=100, rank_selection='auto')
X_reduced = rsvd.fit_transform(X) # сама выберет сколько компонент нужно
Pyrethrin — exhaustive error handling для Python, теперь с обёртками для pandas/numpy/FastAPI
Библиотека, которая привносит Rust-стиль обработки ошибок в Python: нельзя проигнорировать исключение, компилятор (ну, рантайм) заставит обработать все варианты.
Новое в v0.2.0: Shields
Drop-in замены для библиотек с явным объявлением исключений:
# Было — исключения неявные
import pandas as pd
df = pd.read_csv("data.csv")
# Стало — нужно обработать все возможные ошибки
from pyrethrin.shields import pandas as pd
from pyrethrin import match, Ok
result = match(pd.read_csv, "data.csv")({
Ok: lambda df: process(df),
OSError: lambda e: log_error("File not found", e),
pd.ParserError: lambda e: log_error("Invalid CSV", e),
# ... остальные
})
Напомнию, что есть канал по нейронкам, который ведёт тот же автор, что и этот канал. Это всё часть медиа Tproger, где я работаю.
⚡️ Основная фишка — на все свежие ИИ-релизы я делаю посты, чтобы вы могли читать только один канал. Иногда получается даже раньше официального запуска, чем я особенно горжусь :)
И есть моя любимая рубрика:
➡️ Обзор трендов Hugging Face за неделю с супер-кратким описанием моделей, выходит регулярно.
Иногда закидываю мемчики или что-то полезное для изучения (о, это очень крутая книга, рекомендую если раньше не видели).
Заходите и подписывайтесь: @neuro_channel
«Стандартная рабочая станция» согласно регламенту компании
Читать полностью…
Servy — свежий проект для запуска Python-скриптов (на самом деле не только Python) как Windows-сервисов без боли
Проблема: нужно, чтобы Python-скрипт работал в фоне как сервис Windows: стартовал при загрузке, перезапускался при падении, писал логи. Стандартный sc работает только с приложениями, специально написанными как сервисы, а pythonw.exe + Task Scheduler — костыль без нормального мониторинга.
Решение: Servy. Указываешь путь к Python, скрипт, аргументы, рабочую директорию, env-переменные → Install → готово. Есть GUI для тех, кто не любит CLI.
Что умеет
🔘Логирование stdout/stderr с ротацией (по размеру и дате)
🔘Health checks + автоперезапуск при падении
🔘Мониторинг CPU/RAM в реальном времени
🔘Уведомления о падениях
🔘Pre/post-launch хуки
🔘Экспорт/импорт конфигов
Установка
winget install servy
choco install -y servy
scoop install servy
И ещё один свежий релиз: вышел Python 3.14.3 с несколькими крупными фичами.
🔘Free-threading (PEP 779)
Официальная поддержка потоков без GIL. Теперь можно собрать Python без глобальной блокировки интерпретатора и получить настоящую многопоточность. Для большинства это пока не актуально — требует пересборки и совместимых библиотек. Но направление задано.
🔘T-strings (PEP 750)
Новый синтаксис t"..." — как f-strings, но без автоматической интерполяции. Возвращает шаблон, который можно обработать отдельно. Полезно для безопасной работы со строками в SQL, HTML, логах.
query = t"SELECT * FROM users WHERE id = {user_id}"
# query — не строка, а Template объект
Мелочь, но приятно: copier-astral — шаблон, который генерит для нового проекта настройки для ruff, uv, pytest, CI/CD одной командой. Как вы поняли, всё для любителей Astral-стека (а кто сейчас не такой?).
Что внутри:
🔘uv — пакетный менеджер
🔘ruff — линтер + форматтер (замена black/isort/flake8)
🔘ty — новый тайпчекер от Astral на Rust
🔘pytest + hatch — тесты с матрицей версий
🔘MkDocs Material — документация
🔘prek — Rust-альтернатива pre-commit (быстрее)
🔘GitHub Actions — CI/CD из коробки
🔘git-cliff — changelog по Conventional Commits
Опционально: Typer CLI scaffold, Docker
Установка:
pip install copier copier-template-extensions
copier copy --trust gh:ritwiktiwari/copier-astral my-project
🔄 Артефакт №1. Категория: «Город» 🔄
От кого только не прилетает самокатчикам. Иногда за дело, иногда нет. Не нам судить, но мы обсудим, что делать, например, с явными нарушителями? Как их контролировать, если операторы кикшеринга не пускают в свои данные? Закрывать глаза на хаос на тротуарах или тотально запрещать?
Мы получили кейс, где за 4 месяца команда из 7 человек создала платформу мониторинга, которая фиксирует самокатовские нарушения. Их задачей было сделать инструмент для структурирования данных, чтобы чиновники и операторы нашли общий язык.
🤩 Что скрывает этот артефакт? 🤩
🤩 Смекалистый метод охоты за данными, когда реальные видео с камер недоступны.
🤩 Принципы, которые помогли сделать мониторинг более объективным.
🤩 Гибридный R&D: тактика, которая помогла запустить MVP за четыре месяца, вместо шести.
Планируем поделиться с вами целой пачкой интересных артефактов. Ставьте 👀, если любопытно узнать их все.
Вышел packaging 26.0 — тот самый релиз с ускорением в три раза, о котором писал пару недель назад.
Напомню контекст: packaging — библиотека для работы с версиями и зависимостями. Встроена в pip, а pip — в Python. 650+ миллионов скачиваний в месяц.
➡️ Что в релизе
Обещанные оптимизации: регулярки больше не перекомпилируются каждый раз, добавлены __slots__ для Version и Specifier, улучшено кэширование. Результат — парсинг версий стал в три раза быстрее, количество создаваемых объектов в pip упало с 4,8 млн до 400 тыс.
➡️ Новые фичи
PEP 751 — поддержка pylock-файлов для воспроизводимых установок. PEP 794 — импорт метаданных имён пакетов. Positional pattern matching для Version и Specifier — теперь работает match version:
from packaging.version import Version
match Version("3.14.0"):
case Version(major=3, minor=14):
print("Python 3.14!")
.contains() теперь возвращает False вместо исключения для невалидных версий. Если ловили InvalidVersion — проверьте код.
Вышел pandas 3.0: строки теперь хранятся через PyArrow (до 70% экономии памяти, до 13x быстрее), а Copy-on-Write стал обязательным.
Что сломается
🔘Цепочечное присваивание больше не работает:
# Было: работало с warning'ом
df["foo"][df["bar"] > 5] = 100
# Стало: молча НЕ работает
# Правильно:
df.loc[df["bar"] > 5, "foo"] = 100
# Было
if df['col'].dtype == object: ...
# Стало
if pd.api.types.is_string_dtype(df['col']): ...
pd.options.future.infer_string = Truedtype == object и цепочечные присваивания
Уютный канал про MicroPython и AI
Канал ведёт Артём — инженер, который просто делится тем, как на самом деле устроена его работа: как он исследует новые инструменты, какие нейросети использует в задачах и какие делает выводы.
Внутри много личного опыта:
🔘путь от админа до инженера;
🔘как нейронки становятся испытанием для нервной системы;
🔘итоги большого личного исследования разных ИИ-инструментов.
Это не поток советов и не обучающий курс, скорее увлекательные заметки инженера и новости из мира нейросетей, которыми интересно делиться с коллегами.
Точно стоит подписаться, если вам близки Python, эксперименты и вдумчивый подход к ИИ.
На Reddit обсудили, с какими инструментами питонисты стартуют новые проекты в 2026. В треде 170+ комментариев, подведу краткие итоги.uv + ruff + httpx + pytest — этот стек набрал больше всего голосов. Poetry и venv уходят в прошлое, uv забирает всё: и venv, и зависимости, и запуск скриптов.
А вот в тайп-чекинге единства нет. Одни ждут pyright, другие пробуют ty или pyrefly. Ruff сам по себе типы не проверяет, нужен отдельный инструмент.
Что ещё упоминают
🔘pydantic — почти как стандарт для валидации
🔘direnv — автоматическая активация окружения при входе в папку
🔘pandas остаётся дефолтом, но для больших данных смотрят на PySpark/Polars
Для старта нового проекта
uv init myproject
cd myproject
uv add --dev ruff pytest
ty?
Библиотеку packaging ускорили в 3 раза
packaging — это библиотека, которую использует почти всё в Python-экосистеме для работы с версиями и зависимостями. Она встроена в pip, а pip встроен в Python — так что это буквально самая распространённая сторонняя библиотека в мире.
Когда pip резолвит зависимости, он создаёт миллионы объектов Version и SpecifierSet. Буквально миллионы — в бенчмарке, который использовал автор, было 4,8 миллиона. Каждый раз парсится регулярка, создаются объекты, сравниваются версии. Это занимает время.
➡️ Что сделал мейнтейнер библиотеки?
Взял новый статистический профайлер из Python 3.15, прогнал через него реальные данные (все версии когда-либо загруженные на PyPI) и нашёл узкие места.
Оказалось, что регулярка — не главная проблема. Основное время уходило на:
🔘Создание лишних объектов (NamedTuple внутри Version — убрал, +20%)
🔘Дублирование работы (Version создавался дважды в одном месте — исправил, +37%)
🔘Неоптимальный код (генераторы вместо map, singledispatch вместо if — переписал)
Результат:
🔘Чтение версий: 19,6 сек → 9,9 сек (2x)
🔘Проверка requires-python: 105 сек → 33,9 сек (3x)
🔘Количество создаваемых Version в pip: 4,8M → 400K
Все исправления будут в версии 26, уже вышла rc1, финальный релиз обещают на днях.
@zen_of_python
Один начинающий программист читал Effective Python и завис на первой главе про форматирование строк. Искал что-то типа Pythex, но для f-strings — не нашёл. Попросил Claude сделать HTML-приложение по спеке.
Получился вот такой сайт с визуализацией форматирования строк в питоне.
Format spec mini-language выглядит так:
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
f'{value:0>10.2f}' — не сразу понятно, что где. Визуализатор разбирает строку на части и показывает, за что отвечает каждый символ.f'{3.14159:.2f}' # → '3.14'
f'{"test":#>10}' # → '######test'
f'{12345:,}' # → '12,345'
f'{-42:010}' # → '-000000042'
calgebra — алгебра множеств для календарей в Python
Есть задача: найти время, когда вся команда свободна, с учётом Google Calendar, .ics файлов и рабочих часов. Обычно это превращается в ад из циклов и условий. Новый проект решает это через операторы множеств — как будто пишешь SQL, но для временных интервалов.
Как это работает
from calgebra import day, time_of_day, HOUR
# Рабочие часы
work_hours = day("weekday") & time_of_day(start=9*HOUR, duration=8*HOUR)
# Календари команды
team = alice | bob | charlie
# Свободное время для встречи от 2 часов
free = (work_hours - team).filter(hours >= 2)
| (объединение), & (пересечение), - (разность), ~ (дополнение). Ленивые вычисления — выражение выполняется только при слайсинге.
Каждый баг в 2025 — мой, натуральный, человеческий
Читать полностью…
Состоялся релиз pyauto-desktop — современной замены PyAutoGUI с поддержкой HiDPI
Если автоматизировали десктоп через PyAutoGUI — знаете боль: скрипт ломается при смене разрешения, на 4K всё едет, мультимонитор не работает. Новая библиотека решает это.
Отличия от PyAutoGUI
🔘Автоскейлинг координат и изображений через Session-логику
🔘До 5x быстрее (mss + Pyramid Template Matching + кэширование)
🔘locateAny / locateAll из коробки вместо циклов
🔘Встроенный GUI Inspector: снипы, редактор, генерация кода
🔘Бэкенд: opencv-python, mss, pynput
Из комментариев
Session management, который абстрагирует DPI — это то, чего не хватало PyAutoGUI
Почему Python наконец-то убирает GIL
GIL — Global Interpreter Lock — один глобальный мьютекс на весь интерпретатор CPython. Любой поток, который хочет выполнить Python-код, должен сначала захватить этот lock. Один lock = только один поток работает в любой момент времени.
➡️ Почему так сделали
В 1991 году, когда появился Python, многоядерных CPU практически не было. Потоки добавили в язык в середине 90-х, и вместо того чтобы защищать каждую внутреннюю структуру интерпретатора отдельным мьютексом — поставили один глобальный. Проще, быстрее, работает.
«Нам казалось, что мы нормально разобрались с потоками. Многоядерных процессоров тогда всё равно ни у кого не было» — Гвидо ван Россум
Выпущен Mesa 3.4.0 — фреймворк для агентного моделирования на Python
➡️ Что такое агентное моделирование
Вместо описания системы уравнениями — задаёте простые правила для отдельных «агентов» (птицы, машины, люди) и смотрите, как из их взаимодействий возникают паттерны. Как формируются пробки? Как распространяются эпидемии? Как стаи птиц самоорганизуются? ABM (agent-based model) отвечает на такие вопросы.
➡️ Что такое Mesa
Основной Python-фреймворк для ABM. Интегрирован с NumPy, pandas, Matplotlib. Даёт инструменты для пространственных отношений, планирования агентов, сбора данных. Используется для моделирования эпидемий, рыночной динамики, экологических систем.
➡️ Что нового в 3.4.0
🔘Единое время симуляции. Раньше время было разбросано: model.steps в простых моделях, simulator.time в discrete event. Теперь единый model.time для всех.
🔘Воспроизводимость batch run. Новый параметр rng для явного контроля random seeds. Раньше при фиксированном seed все итерации давали одинаковые результаты вместо независимых реплик.
Прочее:
🔘Визуализация: поддержка AgentPortrayalStyle в Altair
🔘Удалён экспериментальный cell space → стабильный mesa.discrete_space
🔘Python 3.12+ обязателен
🔘Миграция на новую GitHub-организацию mesa
📎 Код на GitHub, подробнее в заметках по релизу, есть онлайн-демо
На скриншоте — классический пример Wolf Sheep: волки (красные) охотятся на овец (голубые), овцы едят траву (зелёные клетки). Справа — график динамики популяций: видно, как система приходит к равновесию.
@zen_of_python
Вышел Gazetteer — офлайн геокодер на Python, который не врёт на границах
Небольшое напоминание, зачем это вообще нужно:
➡️ Reverse geocoding — когда есть координаты, а нужно понять что там: страна, регион, город. Нужно для аналитики доставки, логистики, геотаргетинга, обработки GPS-логов. Проблема: большинство офлайн-решений ищут ближайшую точку (nearest-neighbor). У границ это ломается — ближайший город может быть в другой стране.
Gazetteer проверяет, в какой полигон реально попадает координата. KD-Tree для быстрого отсева + валидация вхождения в polygon.
Характеристики
🔘210+ стран, 145 000+ административных границ
🔘10 000 координат за <2 секунды (<0,4 мс на точку)
🔘Single-process и multiprocessing
🔘Без внешних API — никаких лимитов и платежей
🔘Автор говорит, что начинал как toy project, но оказалось production-ready.
📎 Код на GitHub, документация на сайте
@zen_of_python