Находки в опенсорсе
Привет! Меня зовут Никита Соболев. Я занимаюсь опенсорс разработкой полный рабочий день. Тут я рассказываю про #python, #c, #opensource и тд. Поддержать: https://boosty.to/sobolevn РКН: https://vk.cc/cOzn36 Связь: @sobolev_nikita
Показати більше📈 Аналітичний огляд Telegram-каналу Находки в опенсорсе
Канал Находки в опенсорсе (@opensource_findings) у мовному сегменті Англійська є активним учасником. На даний момент спільнота об'єднує 12 701 підписників, посідаючи 9 900 місце в категорії Технології та додатки та 50 884 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 12 701 підписників.
За останніми даними від 25 жовтня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на 116, а за останні 24 години на 7, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 55.07%. Протягом перших 24 годин після публікації контент зазвичай збирає 26.32% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 6 993 переглядів. Протягом першої доби публікація в середньому набирає 3 343 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 162.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як pyobject, питон, slots, gil, github.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Привет!
Меня зовут Никита Соболев. Я занимаюсь опенсорс разработкой полный рабочий день.
Тут я рассказываю про #python, #c, #opensource и тд.
Поддержать: https://boosty.to/sobolevn
РКН: https://vk.cc/cOzn36
Связь: @sobolev_nikita”
Завдяки високій частоті оновлень (останні дані отримано 26 жовтня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
Завантажуємо дані
| Дата | Залучення підписників | Згадування | Канали | |
| 26 жовтня | +5 | |||
| 25 жовтня | +7 | |||
| 24 жовтня | +6 | |||
| 23 жовтня | +2 | |||
| 22 жовтня | +9 | |||
| 21 жовтня | +2 | |||
| 20 жовтня | +1 | |||
| 19 жовтня | +6 | |||
| 18 жовтня | +14 | |||
| 17 жовтня | +12 | |||
| 16 жовтня | 0 | |||
| 15 жовтня | +1 | |||
| 14 жовтня | +4 | |||
| 13 жовтня | +5 | |||
| 12 жовтня | +4 | |||
| 11 жовтня | +3 | |||
| 10 жовтня | 0 | |||
| 09 жовтня | +7 | |||
| 08 жовтня | +2 | |||
| 07 жовтня | +6 | |||
| 06 жовтня | +4 | |||
| 05 жовтня | +9 | |||
| 04 жовтня | +3 | |||
| 03 жовтня | +8 | |||
| 02 жовтня | +1 | |||
| 01 жовтня | +1 |
| 2 | Доклады с большой встречи сообщества
17 октября мы провели большую встречу сообщества. Надеюсь, успешно!
Доклады: https://www.youtube.com/playlist?list=PLbr8rVGhPD0WJxhx-Sc2In7OMGJndsQ4f
Немного статистики:
- 1000+ человек на всей конференции
- 300+ человек на @pytho_nn части
- 125 человек в тусочате
- 7 крутых докладов
- 4 занятых бара
- десятки новых интересных знакомств
- половина нашего чата приехала
Большое спасибо всем, кто помогал делать нашу конфу:
- Нашему главному организатору Игорю, что вытащил такой проект @it52info
- Замечательным фотографам Екатерине (фотки от нее тут) и Ярославу (фотки от него)
- Всем волонтерам, кто помогал со всеми практическими задачами
- Ведущему, Леха - красава!
- Конечно же спикерам, (по ссылкам можно почитать их отзывы): Иван, Егор, Алексей Гладких, Сергей Макаров, Максим, Алексей Голобурдин, Никита, Валентин, и все-все-все. Спасибо вам большое! Было интересно, было полезно, был повод для дискуссии. Под некоторыми докладами настоящий бомбеж в комментах 🌚️️️️
- Гостям! Люди специально приехали из Минска, Махачкалы, Тюмени, Уфы, Самары, Коврова, Питера, Ростова, Москвы, Нижнего Новгорода, других городов. Вы все просто лучшие! Спасибо за ваш интерес, все отметили, что на конфе чувствовалась душа. Потому что все приехали сами, потому что хотели. Никого не отправлял компания потусить за деньги
Было несколько минусов, которые мы постараемся пофиксить на следующий год: шум у главного зала, очереди за едой и в целом логистика еды, вместимость бара подвела (мы планировали 60-70 человек, но было больше 150). Следующий раз выкупим самый большой бар рядом! Попробуем найти партнера вечеринки.
Доклады: https://www.youtube.com/playlist?list=PLbr8rVGhPD0WJxhx-Sc2In7OMGJndsQ4f
Еще раз: лучшее сообщество! Жду всех в следующем году!
Обсуждение: Как вам конференция? Как вам Нижний? Какой доклад понравился больше всего? Кого бы вы хотели видеть в следующем году в качестве спикеров?
Делитесь фотками в комментах! | 6 040 |
| 3 | Платформа для agentic разработки
Коллеги из GitVerse сегодня выкатили новое большое обновление. Теперь прямо на платформе можно запускать агентов для разных задач, с разным тулингом, на разных моделях.
Я протестировал новые возможности, выглядит очень круто. Я дико люблю GitHub Agents. Пользуюсь им чуть ли не каждый день: обновить зависимость, сделать ревью сложного кода, решить какую-то простую задачу. Мне кажется, что запускать агенты прямо рядом с кодом - лютейшая база. Очень удобно.
Рад, что такая же фича появилась в GitVerse. Делюсь впечатлениями и техническими подробностями. У меня было три разные задачи.
Создание проекта
Для начала я попросил встроенную бесплатную модель GigaCode сделать мне новый проект из моего шаблона для python пакетов.
Пример: https://gitverse.ru/sobolevn/test-ai-agents/issues/1
Как?
1. Включаешь в настойках "AI-Соавтора" GigaCode-разработчика (документация)
2. Создаешь задачу в трекере
3. Назначаешь GigaCode-разработчика на нее, можно просто в kanban таску передвинуть
4. Готово!
Агент сам развернет окружение, решит задачу, пришлет PR.
В интерфейсе можно выбрать модель, добавить дополнительный prompt.
Или можно просто тегнуть в PR и попросить агента доработать что-то.
Проверка задач
Следующий пример: допустим вы хотите научить коллег наконец создавать понятные задачи 🌚️️️️
Можно сделать AI частью вашего workflow, создаем .gitverse/workflows/issue_dor.yml (помните, я писал, что GitHub Actions можно брать и переиспользовать?)
on:
issues:
types: [opened]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/ai-developer-action@master
with:
prompt_file: .gitverse/prompts/issue_dor.md
Теперь мы можем разместить любой промпт для проверки Definition of Ready в файле .gitverse/prompts/issue_dor.md и агент будет на каждую новую задачу запускаться и выполнять проверку. Работает! Документация.
Пример: https://gitverse.ru/sobolevn/test-ai-agents/issues/3
Опять же, можно выбирать разные модели для разных задач и тут тоже.
Ключевое: вешать агента можно на любые события CI. От релизов до коммитов.
Использование внешней модели
Конечно же мне захотелось попробовать подключить какую-то внешнюю модель и потестить, как работает интеграция на задаче с программированием. Сначала настраиваем AI_SESSION_MODELS переменную:
[
{
"profile_id": "gpt-sol",
"name": "your-provider/api/v1/gpt-6.1-sol",
"auth_mode": "direct",
"base_url": "https://your-provider.example/api/v1",
"model": "openai/gpt-6.1-sol",
"api_key_secret": "CUSTOM_PROVIDER_KEY",
"input_modalities": ["text"],
"output_modalities": ["text"]
}
]
И указываем из какого секрета читать ключ. Можно добавлять много провайдеров, много моделей.
Создаем задачу, назначаем агента, выбираем нашу модель (на скриншоте).
Агент шуршит, присылает результат в PR: https://gitverse.ru/sobolevn/test-ai-agents/pulls/5
Приятные бонусы
- Чаты и сессии с агентами
- Собственные агенты и кастомные скиллы
- Поддержка кастомных MCP
- Свой MCP для работы с GitVerse API
- Интеграции с IDE
- Разбор ошибок CI
- Генерация сообщений к коммитам
- Удобный UI для обращения к агентам из любого места на сайте
Выглядит круто! Попробуйте для своего проекта.
Обсуждение: Какие фичи платформы для агентской разработки для вас наиболее нужны и важны? Какие модели там вы предпочитаете?
Реклама. ПАО "СБЕРБАНК", ИНН 7707083893. erid: 2W5zFHAvuSq | 6 240 |
| 4 | Немає тексту... | 8 112 |
| 5 | Еще анонсы докладов на бесплатную конференцию 17 октября в НН
Регистрация: https://itgorky.ru/bolshaya-vstrecha
Нам дали впихнуть невпихуемое и дали еще два слота под доклады.
К 6 прошлым докладам. Теперь их 8 на нашей секции.
Наша концепция конференции: ваши любимые опенсорсеры и ютюберы. Ровно их я и пригласил!
- Алексей Голобурдин @t0digital, с канала Диджитализируй: Будущее локальных LLM
Почему для многих задач полностью локальные агенты это будущее, как Microsoft, Apple и hardware-производители идут в сторону локального инференса, и как это использовать разработчику.
- Александр Целуйко, core-разработчик msgspec: Я твой fastapi msgspec'ом ускорял
Почему msgspec быстрее и меньше базовых структур (namedtuple, dataclass и тп) python и orjson (не всегда и везде есстессна).
Что нужно, чтобы fastapi работал на msgspec? Как разогнать Ваш сервис на fastapi ещё быстрее?
Устроим батл про msgspec vs adaptix!
Другие треки
На конференции будут и другие треки!
- Frontend
- DevOps
- InfoSec
- DevRel
- ODS от наших коллег из Нижегородского филиала @nnodsbreakfast
- QA
На них я особо отмечу доклады от моих коллег / друзей:
- DevRel: Ксения Романова @devrel_sklad: Как изменения в разработке уже меняют DevRel
- DevRel: Анастасия Маслова @za_predelami_koda: Не всё, что можно автоматизировать, стоит автоматизировать
- DevRel: Обед с Валентином Домбровским, где он расскажет про строительство сообществ, про мотивацию, про @moscow_python и про MoscowPython Pro
- Frontend: Никита Пастухов @fastnewsdev: Как научить AI красить кнопки
(ха! смотрите, Никита - фронтендер! 🌚)
Тусовка
Уникальная возможность всем вместе погулять, пообщаться, посмотреть город, хорошо провести время.
Будем тусить до и после конфереции, если хотите с нами, то вот специальный одноразовый чат под событие.
Всех приглашаем!
Техническое
- Письмо от нас ждать не надо, мы его высылаем всем. Просто не всем доходит 🌚
- Если зарегались, то смело приходите / приезжайте! Ничего ждать не надо.
Регистрация: https://itgorky.ru/bolshaya-vstrecha
Нижний Новгород, 17 октября
Обсуждение: А какой доклад больше всего ждете вы? С кем больше всего хочет вжарить пивчанского? | 10 979 |
| 6 | Монадические выражения в Python. Наконец-то!
Продолжаем разговор про интересные PEPы. Поговорим сразу про два:
- PEP-823: https://peps.python.org/pep-0823
- PEP-824: https://peps.python.org/pep-0824
В целом они оба об одном: использовании ? для решения проблемы обращения к None при работе с данными.
Первый PEP описывает два новых оператора ?. и ?[], которые позволяют представить выражение some?.field как:
if some is not None:
field = some.field
else:
field = None
Аналогично: some?[field] будет делать тоже самое, но для для some[field].
Второй - позволяет использовать оператор ?? вместо is not None и тернарных выражений. Теперь мы сможем писать some ?? 'default' вместо some if some is not None else 'default'. И есть вариант ??= по аналогии с +=, тд.
Данная попытка уже не первая. Первая была сделана очень много лет назад в PEP-505, который отклонили.
Но теперь, два данных PEP'а проспонсированы лично Гвидо, так что шансы хорошие.
Примеры
Давайте посмотрим на более реалистичные случаи. Например, если у вас есть вот такая вложенная структура данных, и нужно получить имя покупателя из очень глубокого слоя, то сейчас мы вынуждены писать:
def get_customer_name(data: Data) -> str | None:
"""Get customer name in lower case if it exists."""
customer = data.customer
if customer is not None:
user = customer.user
if user is not None:
return user.name.lower()
return None
Превращается в:
def get_customer_name(data: Data) -> str | None:
return data.customer?.user?.name.lower()
Как будет работать второй вариант? Если data.customer является None, то мы сразу его возвращаем. Если нет, пробуем получить .user, проверяем его на None. И тд.
Важный момент: __getattr__ и __getitem__ никак не меняются, они просто не вызываются при None.
В большинстве языков (PHP/JS/TS/C#/Kotlin/Swift/Rust/Dart) такая фича уже есть, она делает работу с вложенными опциональными данными сильно удобнее.
Типизация
Ничего не меняется:
- get_customer_name все еще возвращает str | None
- Обращение через . к optional полю - все еще ошибка
- Обращение через ?. к optional полю - не ошибка, а просто None
Перформанс
Самое интересно! Первый вариант get_customer_name выполняет много опкодов на ровном месте.
Условия, сравнения, прыжки, LOAD_ATTR и тд. Что делает данный код сложным для оптимизации и JIT'ирования. Но data.customer?.user?.name.lower() оптимизировать очень удобно, потому что можно сделать один новый опкод LOAD_OPTIONAL_ATTR (или добавить еще один oparg к текущему LOAD_ATTR`), а уже его будет очень удобно оптимизировать. Потому что весь код проверок будет жить в одном месте рядом на C, а не куча условий на питоне. И последовательность таких `LOAD_OPTIONAL_ATTR будет удобно находить и возможно оптимизировать в том числе.
Почему монадические?
Потому что на заголовок нужно было как-то забайтить! 🌚
Но и контекст, конечно, реально существует. Например в dry-python/returns уже много лет была доступна конструкция Maybe с методом .bind, который ведет себя прямо как ?. оператор и не продолжает выполнение после первого None / Nothing.
Как вы уже поняли, я дикий фанат таких штук. Ждем всем чатом!
Одной строкой
- dmr@0.16.0 почти готов; изменений просто капец сколько. Каждая часть фреймворка вылизывается и становится на порядок лучше. Релиз в конце #opensource_september
- Наша бесплатная конференция 17 октября в Нижнем Новгороде получила двух новых спикеров к 6 текущим. Итого: 8 докладов от топовых питон ютюберов и опенсорсеров! Анонс новых докладов будет в самое ближайшее время. А пока можно регистрироваться
- Обратите внимание, что ждать подтверждения не нужно! Мы стараемся всем сразу высылать письма, но они нужны только для моральной поддержки :) Было много вопросов по статусу письма. Если вы зарегались, то можете приходить! Пустим всех.
Обсуждение: Что вы думаете? Не возникает ли у вас вопросиков по данной фиче? Как вы сейчас решаете данную проблему с boilerplate кодом? | 11 298 |
| 7 | PEPы в Python окончательно вышли из-под контроля
Давайте посмотрим, что происходит с ПЕПами в CPython. Там много новых спорных штук.
Начнем с более базовых, перейдем в дичи в конце. Какие-то ПЕПы приняты, но большинство в обсуждении.
Докстринги для TypeAliasType
PEP-846: https://github.com/python/peps/pull/5116
Базовая база: пишем докстринги после ключевого слова type - у нас появляется __doc__ атрибут.
type Timeout = float | None
"""Maximum wait in seconds. """
Привычный синтаксис из-за sphinx аннотаций для атрибутов.
Кстати, поддержка правила для поиска докстрингов вне правильных мест уже в wps!
Паттерн-матчинг конкретных значений
PEP-845: https://github.com/python/peps/pull/5107
В питоне была проблема, что нельзя сматчить конкретное значение из переменной. Все имена в PM всегда переписываются. В первой версии PEP-622 хотели сделать паттерны для сравнения с переменной, но потом отказались. А без такого - жить довольно сложно.
Такой синтаксис предлагаю авторы:
def get_book_titles_for_author(author: str):
for book in BOOKS:
match book:
case {"title": title, "author": .author}:
yield title
Обратите внимание на .author, что показывает матч со значением внутри author, а не переназначение переменной author. Если бы добавили $ для "констант", то было $author 🌚
Мне нравится, выглядит полезно.
yield from в асинхронных генераторах
PEP-828: с python3.16 можно будет писать так:
async def agenerator():
yield 1
yield 2
return 3
async def main():
result = yield from agenerator()
assert result == 3
Я нейтрален, зависит от сложности реализации и граничных случаев.
Явные public и private декораторы
PEP 844:
# spam.py
@public
class Public:
...
@private
class Private:
...
# ex.py
import spam
spam.__all__ # ['Public']
Манипуляция __all__ через декоратор. А можно не надо?
Почему? __all__ используется для from spam import * и не для чего больше. __all__ надо заказывать, а не развивать. Более того декоратор нельзя повесить на имена и тайп-алиасы. Кажется очень непродуманным решением.
Ключевое слово export
PEP-843: Предлагают добавить ключевое слово export для ... я не знаю чего.
А, опять манипуляции __all__. Чем не устраивает простая текущая система? Если имя начинается с _ - то оно protected. Ключевое слово для управления списком! Я против.
Ребята из FastAPI тащат синтаксис для себя в stdlib
PEP-835: Предлагают сделать @ типовым и рантайм оператором для создания Annotated объектов.
Крайне неудачный PEP на мой взгляд, о чем я написал авторам и собрал кучу поддержки.
Не поймите меня неправильно: я всячески за операции над типами. Просто я не думаю, что int @ Field(max=100) должно значить Annotated[int, Field(max=100)]. Нет задачи сократить количество символов, которые мы пишем (а некоторые уже и не пишут).
Одной строкой
- На прошлой неделе я побывал в пресс-туре MAGNIT TECH в Суздале. Было очень круто. Приятно видеть, как развивается ритейл. Обсудил с коллегами умные кассы, внедрение ИИ, новые способы оплаты, предиктивную аналитику спроса, интересное в логистике, предложил им внедрить wps. Хорошо провел время с коллегами @alexgladkovblog, @t0digital, @MrTeamlead. Суздать - очень красивый! Кароч, очень понравилось. Спасибо за приглашение!
- Мы релизнули dmr@0.15.0 в рамках #opensource_septmber, все большое спасибо за участие. Наш самый большой релиз. Пока что!
- Про PEP-805 и про будет отдельный пост
- В Нижний на конфу уже собралось очень много людей из разных городов, приезжайте и вы! Можно даже отбивку о регистрации не ждать, всех пустим :)
Обсуждение: Как вам данные ПЕПы? Нашли что-то полезное для себя? | 9 407 |
| 8 | Большая бесплатная конференция в Нижнем Новгороде 17 октября
Регистрация: https://itgorky.ru/bolshaya-vstrecha
При поддержке @it52info
Мы продолжаем нашу традицию делать большую осеннюю конференцию в Нижнем.
Вот тут можно почитать / посмотреть как было в прошлом году: https://t.me/opensource_findings/934
Что будет?
- Много разных секций: Python / DevRel / Frontend / Mobille
- Слет всего нашего сообщества @pytho_nn: приедет весь наш опенсорс чат, будет кучу людей из Москвы, Казани, других городов
- Много дружеского и профессионального общения
- Настолки!
- Встреча подписчиков. Приедет много людей из телевизора, всех их мы заманим в бар после конференции, с ними можно будет поговорить, выпить пива, сфотаться, подружиться :)
- Бар, кальяны и тусовка до утра (самое главное, очевидно)
В текущем году я решил позвать в качестве докладчиков ваших любимых ютюберов и опенсорсеров.
Доклады
- 11:00
Иван Кирпичников, опенсорс разработчик
Adaptix. Опыт в проде и какие приколюхи можно творить
Посмотрим на конкурента Pydantic от нашего сообщества. Посмотрим: где и когда не стоит использовать Pydantic, какие у него актуальные проблемы. Поговорим, за счет чего Adaptix насколько быстрый, как он устроен. И какие уникальные фичи у него есть.
- 12:00
Егор Бугаенко, Huawei, @yegor256news, https://youtube.com/@yegor256
Типичные ошибки начинающего опенсорс разработчика
Проанализирую свой опыт работы с сотнями разработчиков в десятках опенсорс проектах, укажу на их ошибки, предложу альтернативы.
- 13:00
Алексей Гладких, Arenadata, @gaxeliy_tdd, https://twitch.tv/gaxeliy
Зачем программисту Twitch (что?)
Расскажу про недооценённую платформу для коммуникации, выстраивания горизонтальных связей и создания личного бренда.
Покажу как можно стримить с технической стороны.
- 14:00
Александр Кондратьев, Ростелеком
Modern Tests для Modern REST: современный подход к тестированию Django Modern REST
Тесты API могут проверять разные уровни системы: логику контроллера, обработку HTTP-запроса, взаимодействие компонентов и соответствие реализации заявленному контракту. Если не разделять эти задачи, тесты становятся медленными и хрупкими, а высокое покрытие кода не гарантирует корректную работу API. На докладе поговорим о нашем опыте использования django-modern-rest в проде и организации тестов вокруг него: какие уровни проверок мы используем, что тестируем в запросах и ответах и какие инструменты помогают сократить рутинный код. Отдельно рассмотрим роль точной семантической схемы API: как на её основе генерировать тестовые сценарии, проверять реальные ответы и оценивать покрытие операций, параметров и вариантов ответа, а не только строк кода.
- 15:00
Максим Мельников, @pylounge, https://youtube.com/@pylounge
Я в СКРЫТОМ ПУЛЕ: выстраиваем процессы в команде без тильта
Работа в IT-команде иногда подозрительно напоминает Dota 2: кто-то фармит, кто-то руинит, кто-то молчит до 40-й минуты, а тимлид начинает думать, что снова играет 1 vs 9. Только вместо Рошана - прод, вместо 0/10 мидера - соседняя CRM-команда, а вместо "gg ez" - очередной аварийный комитет.
На докладе поговорим о том, как перестать играть в такой режим и начать выстраивать систему: почему токсичность и дизмораль только мешают, зачем учить людей говорить ртом и управлять ожиданиями, почему процессы не должны держаться на одном "рокстар-игроке" и как не превращать каждый фейл в поиск того, кто заруинил. Разберём, как продавать изменения команде, договариваться с бизнесом и другими командами, фиксировать договорённости и автоматизировать правила - чтобы вместо вечного 1 vs 9 получилась команда, которая действительно играет на победу как для бизнеса, так и технического развития проекта.
- 16:00
Хоренян Сурен, Яндекс Реклама, @Khorenyan, https://youtube.com/@SurenKhorenyan
Агент пишет код. Я всё ещё программирую
У кого-то ИИ забрал удовольствие от программирования; для меня это второе дыхание. Я смотрю на то, что пишет агент, а в голове только одна мысль: "я сделаю лучше". Разберём архитектурные странности в Python-коде от агентов: что можно упростить, переделать или с удовольствием удалить. Для разработчиков, которые пишут с агентами, ревьюят код от агентов и хотят понимать, что вообще происходит с кодовой базой.
А еще будут и другие треки по другим направлениям, их анонсы будут в их сообщества Нижнего и на @it52info.
Нужна только регистрация: https://itgorky.ru/bolshaya-vstrecha
Приходите! Приезжайте! Буду рад всех видеть лично. Хорошо и интересно проведем время.
Поддержать проект
Даже если вы не сможете присоединиться, нас можно поддержать. От сообщества - для сообщества.
Сделайте репост своим коллегам в чатик, закиньте в ваше локальное сообщество питонистов, поделитесь в своем тг канале. Будем рады любой медийной поддержке!
Обсуждение: Что вы реально думаете про текущее состояние платных конференций? Есть ли в них еще хоть какой-то смысл? Я вот думаю, что не особо.
| Поддержать | YouTube | GitHub | Чат | | 12 550 |
| 9 | Немає тексту... | 10 577 |
| 10 | JIT могут удалить из CPython!
PEP-836: https://peps.python.org/pep-0836
JIT в CPython имеет очень много проблем, давайте их обсудим.
Если вы все пропустили, то вот вам краткий таймлайн всей истории:
- В мае 2021 года создается команда Faster CPython, под руководством Гвидо в MS, которая должна работать над улучшением скорости CPython
- Где-то в 2022м году к команде присоединяется Brandt Butcher, автор первой версии JIT
- В октябре 2023 года, Brandt презентовал свою идею добавления JIT в CPython
- В январе 2024 года, PR был влит в 3.13, создана первая версия Copy-and-Patch JIT
- В апреле 2024 года релиз менеджеры и SC с таких новостей немного прифигели и попросили сделать PEP хотя бы пост-фактум: https://peps.python.org/pep-0744
- В октябре 2024 года выходит 3.13 с JITом, который можно включить опционально
- В мае 2025 года MS увольняет всех участников команды Faster CPython
- В октябре 2025 года выходит 3.14 с JIT бинарниками. Теперь можно было выбрать образ, который планируешь использовать. Free-Threading все еще не поддерживается
- В июне 2026 года SC выпускает объявление, что работа над JIT полностью заморожена до момента пока: не будет опубликован четкий план развития JIT, конкретные метрики успешности проекта, дизайн АПИ (планировали подключать разные JITы в будущем, но от такой идеи отказались)
- В июле 2026 появляется PEP-836 с ответами на вопросы SC, пока его статус "ждет ответа от SC"
Что произойдет, если SC откажется от текущего PEP? Весь код JIT должен быть удален из 3.16+
Возможно ли такое? Вероятность мала, но она пока есть.
А что по скорости?
Перформанс - основная проблема текущего JITа. А точнее отсутствие перформанса.
Официальные цифры такие:
- В 3.13 разница была +-0%, потому что задача была по сути просто добавить инфру для дальнейших оптимизацией. Принимается.
- В 3.14 разброс был от -10% до +20% на разных кейсах. Говорить, что стало быстрее в общем - нельзя, потому надо замерять каждый кусок кода отдельно.
- В 3.15 наконец-то появилась заявленная цель в 5% среднего ускорения. Чего вроде бы добились на всех платформах. Где-то чуть лучше, где-то похуже. Но и кейсы ускорились не все.
- В 3.16 сейчас ставят цель в 10%, пока рано говорить об успешности
Все точные данные можно посмотреть на официальном сайте: https://www.doesjitgobrrr.com
Какие еще большие задачи ждут JIT?
- Необходимо добавить полную поддержку Free-Threading
- Увеличить покрытие тестами
- Добавить поддержку дебаггеров и профайлеров для JIT кода
Цели выше ставились для 3.15, их успешно продолбали. В том числе из-за необходимости писать PEP.
- Добавить 2х человек в команду
- Поддержать LLVM 22 и возможно другие версии
- Полноценная документация
- Возможно получится убрать build-time зависимость от LLVM для сборки JIT, как планировалось ранее
В работе прямо сейчас в рамках 3.16 релиза.
Итоги
Денег больше нет, команда работает на волонтерских началах, сроки жмут, начальство душит. Знакомо? 🌚
Но вера все еще живет!
Я приглашаю вас всех присоединяться к развитию JIT! Давайте вместе сделаем CPython быстрее.
Как? Открывайте задачки, читайте код, реализуйте оптимизации, улучшайте существующие, добавляйте thread-safety для FT, гоняйте бенчмарки, пишите тесты! Работы - буквально вагон.
Обсуждение: Верите ли вы в JIT в CPython? Готовы ли вы помочь?
Одной строкой
- В четверг будет митап MoscowPython, где я буду выступать, приходите. Места для регистраций еще есть!
- Релизнули подкаст с @pylounge, поговорили про DMR, псиопы в разработке, общее ощущение усталости и упадка в мировом IT
| Поддержать | YouTube | GitHub | Чат | | 9 965 |
| 11 | Нерегулярная рубрика "посмотрите, что творится!". Данная история была в оригинале рассказана Кареном в нашем чате (там регулярно происходит интересное), публикую в своем канале с его разрешения.
Как AWS у опенсорсера пакеты отжимал
Новый SDK для AWS от Карена (автора zapros, автора httpx-aiohttp, топ-3 контрибьютора httpx): https://github.com/kap-sh/capo
Как-то я решил написать нормальный SDK для AWS. Их текущий SDK — boto3 — это суперлегаси с кучей костылей: без нормальной типизации, без поддержки асинхронности, почему-то с PascalCase и ещё кучей странных решений.
У меня уже был хороший опыт работы с SDK: до этого я работал над SDK для OpenAI и Anthropic на Python и TypeScript, так что успел накопить некоторое понимание того, как делать SDK хорошо.
С AWS всё немного сложнее: у них около 450 сервисов и примерно 17 миллионов строк сгенерированного кода. Конечно, я не собирался писать всё это вручную. Вместо этого я пишу кодогенератор, который генерирует SDK из спецификаций Smithy (язык и тулинг для спецификаций). Примерно такой же подход я использовал, работая над SDK для OpenAI и Anthropic.
И, конечно, я не стал делать это одним пакетом на PyPI. Прикиньте, устанавливать 17 миллионов строк кода только для того, чтобы создать S3-бакет.
Поэтому я делаю отдельный пакет для каждого сервиса.
Для всех пакетов я выбрал префикс aws-sdk: aws-sdk-s3, aws-sdk-ecs и так далее. Успешно опубликовал около 60 сервисов на PyPI.
А на следующий день до меня достучались ребята из AWS.
Они заметили мою работу, пореспектовали, но сказали, что именно эти имена они сами давно хотели использовать для своего нового SDK — замены boto3. И попросили вернуть им эти имена.
И тут есть ещё одно интересное совпадение: в тот же день PyPI заморозил мой аккаунт. В заморозке он продержался больше месяца. Причины мне так и не объяснили, но, думаю, каждый может сделать свои выводы 🙂
Я не стал с ними бороться и согласился вернуть имена.
Что интересно в данном контексте?
1. Существует PEP, который определяет разрешение конфликтов в пакетах: https://peps.python.org/pep-0541 Там есть пункт о том, что если пакет "нарушает торговую марку", то он может быть отозван как "некорректный". Но там есть важная оговорка, что "честно использование" (например для создания SDK) - разрешено
2. AWS являются спонсорами PyPI: https://aws.amazon.com/ru/blogs/opensource/securing-pypi-for-the-future
Кстати, история про left-pad начиналась так же.
Техническая часть
Что удивительно, так то, что сами AWS не могу сделать нормальный SDK для питона. А один человек в опенсорсе - может. Сделать и синхронную, и асинхронные версии - довольно сложно. Вот так оно выглядит у capo:
from capo_s3 import AsyncS3Client
async def main():
async with AsyncS3Client() as s3:
response = await s3.create_bucket("capo")
print(response)
и
from capo_s3 import S3Client
with S3Client() as s3:
response = s3.create_bucket("capo")
print(response)
Внутри, конечно же, zapros, как HTTP фреймворк для запросов.
Что прикольно: все модели данных построены на TypedDict, все ответы типизированы, но с 0 дополнительных кастов. Но типизация все еще помогает понять, какие ответы от каких сервисов можно использовать как входные данные для других, а где - так сделать будет нельзя.
Развязка
Карену поступило предложение работы в AWS с релокацией в США (да, после опенсорс проекта), он отказался по личным причинам.
Они созвонились с разработчиками оттуда, выразили друг другу уважение (как капо и делают 🌚), обсудили технические решения.
Кажется, никто не остался в обиде.
Хорошо, что история хорошо закончилась: у нас есть и контент для канала, и новая библиотека, и счастливый финал.
Обсуждение: Как вы думаете, что на самом деле там произошло? Почему аккаунт заморозили? Как вы думаете, найм через такой опенсорс - реальность или супер-редкая уникальная история? Насколько сильно вы страдали от boto3?
| Поддержать | YouTube | GitHub | Чат | | 11 099 |
| 12 | Какие уникальные фичи есть в django-modern-rest?
Иногда, когда я добавляю какие-то фичи в мой https://github.com/wemake-services/django-modern-rest ⭐, то я думаю про себя: почему таких фичей больше нет нигде?
Давайте сегодня посмотрим на них. А вы мне расскажите свое мнение в комментах.
Семантическая схема
Допустим, вы навесили на какой-то свой endpoint auth:
class UserController(Controller[MsgspecSerializer]):
@modify(auth=[JWTAsyncAuth()])
async def get(self) -> User: ...
В OpenAPI автоматически появятся все коды ошибок, которые могут случиться в auth (401).
Ничего не надо допом писать. И так происходит со всеми частями фреймворка: добавил throttling=[SyncThrottle(1, Rate.minute)]? Теперь у тебя в ответах автоматом 429. Если нужно, можно отключить любые семантические статусы.
Не должно ли такое быть дефолтом везде?
Умные типы ошибок
Не уходя далеко: как кастомизировать формат ошибки, например, в FastAPI? Через боль. Как поменять в спеке формат? Руками.
В DMR мы просто добавили везде error_model как параметр. Можно заменять любые ошибки, все автоматом сконвертится и покажет правильную схему. Зачем? Хочешь Problem Details - используешь. Хочешь свой формат - реализуешь. Можно даже content negotiation на ошибки навесить.
Почему никто о таком не думает в других фреймворках?
Нормальный throttling
Фича, которая принесла мне больше всех боли. Я прочитал throttling реализации во всех фреймворках. В Litestar даже фиксы присылал.
1. Почти нигде нет из коробки нет поддержки разных алгоритмов, бекендов, иногда даже cache-keys. Очень жаль, есть только обычный counter с в бекендом в памяти
2. Нигде (пришлите в комменты контр-пример) нет разделения на throttling до auth и после. Почему такое вообще важно? Чтобы не заддосить auth. И чтобы иметь возможность выдавать per-user правила. Нужны и важны оба варианта
3. Кастомизация заголовков ответа? Ха!
Что? Почему?
Простое переиспользование кода
Когда я смотрю на АПИ разных DRF проектов или FastAPI, мне становится больно. FastAPI строит все на view функциях, которые нельзя нормально кастомизировать. А DRF строит все на импортах строк внутри настроек. А как на счет классов и наследования?
У нас подобное сделано как абстрактные generic классы. Например: получить JWT. Можно выбрать любой сериализатор, можно выбрать любые модели для запроса и ответа:
class RequestPayload(pydantic.BaseModel):
username: str
password: str
class ResponsePayload(pydantic.BaseModel):
access: str
refresh: str
class ObtainAccessAndRefreshSyncController(
ObtainTokensSyncController[
PydanticSerializer,
RequestPayload,
ResponsePayload,
],
): ... # надо еще переопределить 2 метода
Все типизировано, документировано, очевидно.
Как вы думаете, почему так больше никто не делает?
Внешние вьюхи
Интегрировать один фреймворк в другой - крайне сложно. Вот мы недавно даже стрим проводили, потому что не могли использовать dj-rest-auth из DRF. Так быть не должно.
Теперь в DMR можно использовать любые внешние Django View. Хоть DRF, хоть django-ninja, хоть ванильные вьюхи. И отображать любой внешний OpenAPI. Вот настолько просто:
raw_schema = read_openapi_yaml('openapi.yml')
router = Router(
urls=[
external_path(
'number/', number, name='number',
openapi=load_schema(raw_schema['paths']['/api/number'], PathItem),
),
],
)
Почему другие фреймворки не стараются вписать существующие решения?
Одной строкой
- У нас есть еще куча других крутых фичей! Заглядывайте в наш чатик по DMR @django_modern_rest
- Релизнули django-stubs@6.1 с поддержкой django@6.1
- Сделали папку с крутыми каналами ребят из нашего Python сообщества. Смело можно закидывать коллегам как базовую папку "на кого подписаться в тг по питону". Внутри все мои друзья и коллеги, советую!
Поддержать мою работу над опенсорсом и данным каналом можно на бусти и github sponsors.
Знание, что люди тебя поддерживают, мотивирует работать дальше! | 9 846 |
| 13 | Я попробовал uv, обплевался и вернулся на poetry
Если вы последние полгода не читали чат, то вы не знаете, как сильно у меня горело после перехода на uv. Сейчас расскажу! Данный пост специально написан, чтобы и вас тоже сгорело. Если к концу вы подойдете без боли в ... душе, то все было зря.
Как все было?
Обычно, я первый прыгаю пробовать все новые и модные штуки.
Так было с Pipenv, когда он только появился. Что там творилось!
Так было с poetry, которым я начал пользоваться через год, в 2018м.
Но вот с uv так не было, потому что я не знал, зачем бы мне хотелось переехать. Быстрее?
Но ладно, мы решили попробовать его на 3х проектах. Быстро же! Ух 🌚
- https://github.com/typeddjango/django-stubs (терпим)
- https://github.com/wemake-services/django-modern-rest (сложно съехать)
- https://github.com/wemake-services/wemake-django-template (откатили)
Почему?
Ох, даже не знаю с чего начать! Я напишу только про то, с чем столкнулся лично.
- У uv нет своей системы сборки для бинарников, uv_build умеет собирать только Python пакеты. DMR компилирует часть своих исходников, нам приходится доставлять hatch (другой пакетный менеджер), чтобы вообще иметь возможность работать. Топ кек
- Полное игнорирование стандартов. PEP 751? pip.conf? Нет, не слышали.
- uv публиковал нам сломанные README в PyPI, пришлось ставить плагин
- uv ставит вам совсем не тот питон, который вы думаете. pyenv ставит вам ровно то, что вы попросили, то uv тянет "relocatable" сборку: питон собранный на одной платформе для других платформ. Будет ли все работать? Конечно же нет. Сборка с ним пакетов локально просто не работает. Разбираться в C стектрейсе я не стал, просто поставил нужный питон через pyenv
- Сломанные дефолты. uv run автоматически ставит зависимости, что скрывало от нас баг в CI (нужно ставить UV_NO_SYNC=1`). `uv sync создает виртуально окружение без pip (нужно указывать UV_VENV_SEED=1`), из-за чего `pip install package ставит пакет в глобальный pip, даже с включенным venv. Ну то есть: вирутальное окружение начинает протекать :(
- Для шаблонов uv не подходит, потому что добавляет имя пакета в uv.lock (даже когда ты явно говоришь, что сам пакет ставить не надо), если оно меняется, то лок разваливается. Нам пришлось убрать параметризацию имени пакета в шаблоне. Потом откатили
- uv записывает текущую версию проекта (не пакета) в uv.lock, что ломает релиз тулы вроде semantic-release
- uv add package добавляет его в dependencies как "package>=current.version", что ломает будущие вызовы uv sync -U, когда к нам прилетают ломающие изменений из новых мажорных версий пакетов
- Нет возможности посмотреть устаревшие пакеты как в poetry show --outdated, есть внешний плагин
- Не работает uv sync без pyproject.toml, что нужно для кеша докер слоев. Уже джва года
- uv допускает дубликаты зависимостей с разными версиями (!), что вызвало у нас странный баг
- uv self update не работал в punq из-за наличия tox-uv в зависимостях
- uv не работает с dependabot, если используется workspace, пришлось переходить на renovate. PRов просто не было. uv sync -U с workspaces крайне плохо работает, какие-то пакеты приходилось руками обновлять
- Для продвижения ty добавили более длинный алиас uvx ty: uv check
Ну и самое главное: теперь uv принадлежит OpenAI. Можно ли им доверять важную часть инфраструктуры? Я сильно сомневаюсь.
Получил ли я что-то взамен на все мои новые страдания? Пример из wemake-django-template:
- poetry: 20 секунд
- uv: 11.4 секунды
Я понимаю, что для каких-то больших проектов разница может быть значительной.
Использовать? Если вы пофиксите дефолты у себя в конфиге, у вас стандартный проект, у вас есть линтер на номера версий, бот для обновления зависимостей, и вы реально замечаете время установки пакетов локально / в CI с другими тулами.
Ключевой вопрос: может стоило просто переписать резолвер и скачивание пакетов в poetry на rust?
Обсуждение: Какой ваш опыт? Заметили ли вы, что последнее время инструменты хайпят только за счет "скорости"? | 10 777 |
| 14 | Итог стрима
Что получилось?
- Провести 3 часа в хорошей компании ✅
- Еще до стрима Claude нашел два бага в тестах: один серьезный, один более мелкий (пока мы тестировали сетап для трансляции)
- На стриме был сделан 1 PR с фиксом серьезного бага: https://github.com/wemake-services/django-modern-rest/pull/1196 PR смерджен!
- Сам фикс сначала был полностью навайбкожен, он вроде бы и правил баг, но с точки зрения меинтейнера - все равно было не совсем корректно. Мы не могли показывать такой пример пользователю (баг был в doctest)
- После моих замечаний Claude за 3 итерации ревью (31 коммент за все итерации) смог сделать небольшую правку в проект, задачка примерно джуновского уровня и чистый крудошлеп
- Мы провели неплохое исследование большой задачи с новыми security фичами. Поняли, каких фичей в DMR сейчас не хватает, чтобы сделать хорошо
- В результате исследований Claude сделал второй PR: https://github.com/wemake-services/django-modern-rest/pull/1198
- wemake-python-styleguide, тесты и другие линтеры очень хорошо себя показали: агент был вынужден писать код очень высокого качества
Что не получилось?
- Руками я бы сделал первый PR значительно быстрее
- Во втором PR - снова нейрослоп, как в первой итерации первого PRа
- Мне будет проще его закрыть и сделать самому с нуля, в процессе обдумывая дизайн и АПИ
- К большой фиче из таска мы так и не подошли
Модель: Opus 5
Режим: High Reasoning
Harness: Cursor + набор кастомных скиллов
Токенов потрачено: ~1М
Стоимость в теории: от 5$ до 30$ (но у Никиты подписка, так что реальная стоимость 0$)
Что я думаю?
- ИИ - реально полезный инструмент для некоторых задач, если ты понимаешь, что ты делаешь (или у тебя есть в проекте такой человек)
- У нас появилась возможность править баги в проектах, даже не до конца понимая все детали проекта (пожалуйста, отнеситесь к новой большой силе с большой ответственностью, обратите ее во благо)
- Но то, что пишут в твиттере про "да ИИ теперь ваще все может, программисты не нужны" - маркетинговое преувеличение
- Никита - огромный красавчик, без контекста проекта смог приструнить агентов во время публичного стрима сделать что-то большое и полезное - очень крутой навык
- Про Никитин стек скилов / сетап Claude можно почитать вот тут: https://t.me/fastnewsdev/365
- Его тема в Cursor'е: https://github.com/pustota-theme/pustota (очень красивая, мне очень понравилась, буду пользоваться!)
Посмотрите запись, кто пропустил: https://www.youtube.com/watch?v=laJQcNAqxc0
Составьте свое мнение!
Обсуждение: Что вы думаете про ИИ хайп? Вам интересно про такое читать? Или уже утомило везде про ИИ слушать? Как вам формат стрима? Повторять? Что можно улучшить?
| Поддержать | YouTube | GitHub | Чат | | 8 749 |
| 15 | Вайбкодим security компоненты в django-modern-rest (или нет)
https://www.youtube.com/watch?v=laJQcNAqxc0
В django-modern-rest появилась большая задача: полностью мигрировать в себя dj-rest-auth.
Ссылочка (мы ищем контрибьюторов, особенно специалистов в безопасности OAuth / MFA / Passkeys!): https://github.com/wemake-services/django-modern-rest/issues/1193
На что @fastnewsdev (как главный пропагандист ИИИ = "инженерный искусственный интеллект" ) сказал, что он мне такое заваншотит клодом еще до того, как я успею выпить бутылку пива.
Ну вот и посмотрим, пиво я пью быстро 🌚
Завтра стрим в 19:00:
- Никита будет вайбкодить Django код (он не знает джангу)
- Никита будет ревьюить и пытаться дотащить код хоть до какого-то вменяемого состояния
Приходите смотреть, на что реально способен ИИ. Сбивайте нас с толку своими остроумными комментариями, задавайте провокационные вопросы.
Обсуждение: На какой результат ставите? Что в итоге получится? За какого Никиту будете болеть лично вы? Сколько Никит будет на стриме?
| Поддержать | YouTube | GitHub | Чат | | 8 246 |
| 16 | id() в питоне не выдает уникальные значения
Наверняка, многие из вас, когда изучали питон читали, что id(obj) дает уникальный идентификатор объекта. Его даже назвали, блин, id 🌚️️
Но, все не совсем так. Сегодня будем срывать покровы с одной из самых простых и сложных механик в питоне.
Что вообще такое id?
Сначала, давайте посмотрим на то, как id() устроен:
static PyObject *
builtin_id_impl(PyModuleDef *self, PyObject *v)
{
PyObject *id = PyLong_FromVoidPtr(v);
if (id && PySys_Audit("builtins.id", "O", id) < 0) {
Py_DECREF(id);
return NULL;
}
return id;
}
Что тут происходит?
1. Объявляем C builtin функцию id
2. Получаем указатель на объект v, id которого хотим узнать
3. Получаем число из указателя (???)
4. Вызываем событие аудита для id
5. Возвращает результат (или NULL вместе с исключением)
Вроде бы все понятно, кроме пункта 3. Как можно из указателя получить обычный int?
Сначала разберемся с указателем в C.
int x = 0;
int *y = &x;
Здесь x - значение в ячейке памяти.
А *y - указатель на ячейку x. *y хранит в себе числовой адрес оригинальной ячейки.
Указывает на оригинальное значение в памяти. Как в известном меме.
По сути - работает как одна lea инструкция из x86_64.
https://godbolt.org/z/9xco3j8Y4
Возвращаемся к нашей C-API функции:
PyObject *
PyLong_FromVoidPtr(void *p)
{
// тут еще есть код унификации разных размерностей для разных платформ, но я его выкинул для простоты
return PyLong_FromUnsignedLongLong((unsigned long long)(uintptr_t)p);
}
А что за касты?
- uintptr_t - числовой тип, в который гарантировано поместится любой адрес
- unsigned long long - достаточно большой числовой тип, который поддерживает C-API
Вот так мы и получили int из указателя. Потому что указатель и есть числовое значение изначально.
Так почему не уникальный?
Потому что ячейки памяти можно и нужно переиспользовать!
Простой пример:
x, y, z = 1, 2, 3
t1 = (x, y, z)
id1 = id(t1)
del t1
a, b, c = 4, 5, 6
t2 = (a, b, c)
assert id(t2) == id1
Создаем кортеж, сохраняем его id, доводим его счетчик ссылок до 0, он удаляется, создаем новый такого же размера. Другой объект, другие значения. Получаем такой же id. Пу-пу-пу.
Почему так? Потому что в питоне есть freelist оптимизация: мы не выкидываем участки памяти под контейнеры частых размеров, а просто переиспользуем ту же память под новые контейнеры. Потому аллокация памяти - очень дорогая. Одинаковый участок памяти = одинаковый адрес указателя = одинаковый id.
Итого, правильная формулировка: id выдает уникальные значения для одновременно-живущих объектов.
Обсуждение: Узнали ли вы что-то новое сегодня? Какие еще части питона вы хотели бы разобрать?
| Поддержать | YouTube | GitHub | Чат | | 12 492 |
| 17 | Внутри питона есть ЕЩЕ вирутальные машины
Мы все знаем, что сам питон - одна большая стековая виртуальная машина, которая выполняет опкоды. Их мы можем посмотреть через dis:
>>> import dis
>>> dis.dis('x + y')
0 RESUME 0
1 LOAD_NAME 0 (x)
LOAD_NAME 1 (y)
BINARY_OP 0 (+)
RETURN_VALUE
Можем получить список всех опкодов, можем вызвать их оптимизации и посмотреть на результат с оптимизациями.
Но! Внутри CPython есть и другие виртуальные машины. Сегодня поговорим про ту, которой все мы всегда пользовались, но не знали, что она - виртуальная машина.
pickle
Да, не удивляйтесь. Встроенный протокол сериализации в питоне работает благодаря отдельной стековой виртуальной машине. Давайте посмотрим.
>>> class User:
... def __init__(self, username: str, tags: list[str]) -> None:
... self.username = username
... self.tags = tags
... def __reduce__(self) -> tuple[type['User'], tuple[Any, ...]]:
... return (type(self), (self.username, self.tags))
Создадим обычный класс и запиклим его объект:
>>> import pickle
>>> user = User('sobolevn', tags=['python', 'tg'])
>>> pickle.dumps(user, protocol=0)
b'c__main__\nUser\np0\n(Vsobolevn\np1\n(lp2\nVpython\np3\naVtg\np4\natp5\nRp6\n.'
Обратите внимание, что в разных протоколах значение будет разное:
>>> pickle.dumps(user, protocol=1)
b'c__main__\nUser\nq\x00(X\x08\x00\x00\x00sobolevnq\x01]q\x02(X\x06\x00\x00\x00pythonq\x03X\x02\x00\x00\x00tgq\x04etq\x05Rq\x06.'
Всегда необходимо тестировать, что pickle работает для всех версий от 0 до pickle.HIGHEST_PROTOCOL для ваших объектов, которые поддерживают такой способ сериализации.
Что внутри?
Можно, глядя на значения, подумать, что там просто лежит какой-то бинарный формат сериалиации. Однако, там лежат опкоды виртуальной машины для сериалиации объектов. Их можно задисить:
>>> import pickletools
>>> pickletools.dis(pickle.dumps(user, protocol=1))
0: c GLOBAL '__main__ User'
15: q BINPUT 0
17: ( MARK
18: X BINUNICODE 'sobolevn'
31: q BINPUT 1
33: ] EMPTY_LIST
34: q BINPUT 2
36: ( MARK
37: X BINUNICODE 'python'
48: q BINPUT 3
50: X BINUNICODE 'tg'
57: q BINPUT 4
59: e APPENDS (MARK at 36)
60: t TUPLE (MARK at 17)
61: q BINPUT 5
63: R REDUCE
64: q BINPUT 6
66: . STOP
highest protocol among opcodes = 1
Сравните, как будет отличаться вывод для другого протокола, например пятого.
И окажется, что все "случайные" символы на самом деле просто так же обозначают опкоды. Теперь мы умеем их читать.
Мы можем найти все опкоды и посмотреть их доки:
>>> pickletools.opcodes[25].code
']'
>>> pickletools.opcodes[25].doc
'Push an empty list.'
И мы даже можем оптимизировать байткод pickle для более быстрой сериализации / десериализации.
Прям полностью настоящая ВМ :)
Вот за счет чего мы можем с помощью pickle сериализовать любой Python объект (почти), а с помощью других средств - получается сильно сложнее.
Обсуждение: Знали о такой детали реализации? Знаете ли вы как работает pickle сам по себе? Зачем нужны протоколы и версии? Или сделать отдельный пост про детали работы? Знаете ли вы, что pickle фундаментально небезопасный протокол? И нельзя запускать чужие дампы, только свои доверенные?
Загадка: кстати, какие еще виртуальные машины внутри CPython вы знаете? Я назвал только одну из нескольких. Заходите в комменты за ответами, правильные - покажу завтра. | 8 603 |
| 18 | Подкаст про управление разработкой в новой реальности
https://vkvideo.ru/video-22522055_456247964
Меня пригласили поучаствовать в подкасте, чтобы обсудить разработку с ИИ и управления разработкой с ИИ.
Участники:
- Кирилл Меньшов, старший вице-президент и руководитель блока «Технологии» Сбера
- Дмитрий Иванов, руководитель SourceCraft в Яндексе
- Я, опенсорс разработчик
Поговорили про важные вопросы:
- Сможем ли программировать на русском? Или его тоже потребуется формально верифицировать?
- Как обеспечить должный уровень ИБ, когда софт пишут агенты?
- Как оставить себе "план б", если код все-таки придется смотреть?
- Как расти в новом мире как инженер?
- Откуда брать новых senior разработчиков? И нужны ли они?
- Как починить найм? И почему резюме скорее всего скоро будет не особо нужно
Как вы знаете, я занимаю довольно нейтрально-реалистичную позицию в ИИ вопросах: есть такие-то плюсы и минусы, такие-то риски, такие-то косты, такие-то процессы. В подкасте старался как раз доносить её :)
Полезные ссылки из выпуска:
- Концепция AI-Disrupt PDLC: https://aipdlc.ru/ru
- Язык формальной верификации: https://lean-lang.org
- Tokenmaxxing: https://tokenmaxxing.com
- Прибыльны ли ИИ компании? https://isaiprofitable.com
- Наши скиллы для агентов в DMR
Обсуждение: Что вы думаете? Какие у вас есть страхи / предвкушения от нового ИИ мира разработки? Готовы ли вы программировать на русском языке? Потребуется ли нам смотреть в код?
Буду рад услышать все самые полярные мнения!
erid: 2VfnxvSxct3 Реклама. ПАО "СБЕРБАНК", ИНН 7707083893, 18+ | 7 968 |
| 19 | Наконец-то полезные фичи в питоне
Многие знают, что я почти не добавляю новые фичи в CPython, я стараюсь выпилить существующие и править баге в тех, что у меня не получается убирать. Новые если и добавляю, то без масштабных обсуждений.
Некоторые новые фичи встречают у меня сильный оптимизм: как новый встроенный sampling profiler. Вот тут видео про него кстати с прошедшего PyCon.
Некоторые фичи встречают у меня понимание: как например typing.disjoint_base. Простая штука, решает понятную проблему.
Некоторые фичи встречают у меня лютое подгорание: как например lazy imports. Вот доклад с пайкона и про них, кстати.
Я думаю, что мое понимание хорошей фичи очень сильно расходится с таким пониманием у других питонистов, мое понимание "хорошего питона" можно найти в моем wemake-python-styleguide.
Зная такую вводную, я решил сделать "большую" новую фичу. На один символ в грамматике.
Иммутабельному питону - быть!
У нас была довольно большая проблема: создавать мутабельные словари и множества - можно довольно легко. {1: 2} и {1, 2, 3}
Чтобы создать frozendict и frozenset нам уже нужен вызов функции: frozendict({1: 2}) и frozenset({1, ,2, 3}). Почему так делать не очень?
1. Потому что писать долго, мало людей будут заморачиваться. Зачем, когда проще создать мутабельную структуру?
2. Потому что frozendict и frozenset тупо медленнее. frozendict пока вообще имеет 0 оптимизаций для работы и просто в тупую копирует всю память из dict, который мы отправляем. Получая буквально O(n * 2) по памяти и времени работы. Делает лишний CALL. А frozendict({1, 2, 3}) немного оптимизирован через INTRINSIC_BUILD_FROZENSET опкод, который генерируется только для set в качестве входного аргумента
3. Неудобно писать comprehensions. Они получается сильно менее читаемые, чем их мутабельные версии
Мое предложение (пока только в формате обсуждения): https://discuss.python.org/t/frozenset-and-frozendict-comprehensions/101584/9
Мой PR с добавлением данной фичи в CPython: https://github.com/python/cpython/pull/152820 (он нужен для написания ПЕПа)
Как оно выглядит?
>>> ${1: 2}
frozendict({1: 2})
>>> ${1, 2, 3}
frozenset({1, 2, 3})
>>> ${x: x for x in range(3)}
frozendict({0: 0, 1: 1, 2: 2})
>>> ${x for x in range(2)}
frozenset({0, 1})
Что важно? Оно уже умеет все то, что умеют привычные нам конструкции без $:
- ${} - пустой frozendict, как {} - пустой dict
- ${1, *other} - распаковка внутри frozenset
- ${**d for d in list_of_dicts} - распаковка внутри frozendict comprehension + PEP-798
- ${x async for a in async_iterable if x >0} - async frozenset comprehension с условием
Почему $?
- Потому что $ - is the real deal 😎💸
- Потому что $ не имеет смысла сейчас: но будет значить "иммутабельность"
- Потому что $ может легко в дальнейшем использовать для других иммутабельных штуках: $(x for x in range(1)) для нативного tuple comprehension, для PEP-805 с __freeze__ и тд
И другие новости моих опенсорс проектов одной строкой
- Новый релиз django-modern-rest с новыми DX фичами
- Добавляем Token auth в следующий релиз DMR
- msgspec готов к релизу новой версии с поддержкой frozendict
- Улучшаем поддержку match/case в wemake-python-stylguide
- Предлагаю улучшенное C-API для создания frozendict
- Выпустил релиз punq с поддежкой типизации
Если вы хотите поддержать мою работу в опенсорсе:
- https://boosty.to/sobolevn
- https://github.com/sponsors/wemake-services
Обсуждение: Что вы думаете, нужен ли такой синтаксис? Удобнее ли будет пользоваться иммутабельными структурами после добавления такого синтаксиса? | 9 437 |
| 20 | Пользуясь случаем: у нас 10 июля митап в Нижнем Новгороде.
https://pytho-nn.timepad.ru/event/4050146/
В программе 4 крутейших юбилейных доклада от гостей города и (даже!) нижегородца:
- Артем Пашков, Нижний Новгород, Сообщество "Опенсорсеры", Как сообщество Опенсорсеры помогает open source проектам и разработчикам?
Отвечу на главный вопрос: нужно ли лично вам занимать опенсорсом? И как начать?
Расскажу про проблемы, знакомые многим: недостаток внимания к своему проекту, где искать контрибьюторов, куда самому законтрибьютить, а также как получить полезный фидбек.
- Илья Солин, Уфа, ТБанк, https://t.me/tapeline_tg, Алгебраические эффекты: понять, полюбить и никогда не тащить в прод
Разберём концепцию теоретически (почему это классно), попробуем реализовать её на Python и поймём, стоило ли оно того.
- Георгий Бородин, Москва, Как я перестал бояться и полюбил бойлерплейт
Благие намерения далеко не всегда приводят к хорошему, но если не опускать лапки – наверняка получится сделать систему мечты. Цена этого – вопрос, о котором и хочется рассказать (собираюсь рассказать об одном очень грязном способе якобы оптимизации деливери, который заставил меня ползать по флеймграфам и проклинать себя же и об одном, который позволил мне перестать ждать фронтовых задач).
- Евгений Блинов, The Mutating Company, Из чего состоит фреймворк мутационного тестирования?
В процессе создания своего фреймворка МТ мне потребовалось создать некоторое количество промежуточных библиотек. Подробнее о них расскажу в докладе.
Приходите, приезжайте :) | 8 465 |
