PEP 827: Vercel предлагает программируемые типы для Python в духе TypeScript
Компания Vercel, известная своим фреймворком Next.js и облачной платформой для развёртывания, опубликовала результаты годового исследования, направленного на улучшение системы типов Python. Итогом стал PEP 827 (Python Enhancement Proposal) под названием «Type Manipulation» — предложение, которое дол

Компания Vercel, известная своим фреймворком Next.js и облачной платформой для развёртывания, опубликовала результаты годового исследования, направленного на улучшение системы типов Python. Итогом стал PEP 827 (Python Enhancement Proposal) под названием «Type Manipulation» — предложение, которое должно сделать статическую типизацию в Python более гибкой и мощной, приблизив её по выразительности к TypeScript, но с учётом особенностей рантайма Python. Если PEP будет принят, разработчики получат возможность манипулировать типами на уровне кода, создавая новые типы из существующих без необходимости писать плагины для тайпчекеров.
Что предлагает PEP 827 от Vercel
Суть PEP 827 — ввести в Python стандартные строительные блоки на уровне типов, которые позволят интроспектировать существующие типы и создавать новые. Это не попытка скопировать TypeScript, а скорее адаптация идей программируемых типов под семантику Python. Например, разработчики смогут реализовать такие утилиты, как Pick и Omit, которые хорошо знакомы пользователям TypeScript. В TypeScript они выглядят как специальный синтаксис, а в Python, согласно PEP 827, будут реализованы через обычный императивный код, но на уровне типов.
Авторы подчёркивают, что Python — динамический язык с мощной метапрограммированием: классы, методы и целые API могут генерироваться на лету. Однако статическая типизация часто не поспевает за такой гибкостью, требуя плагинов для тайпчекеров или шаблонного кода. PEP 827 призван решить эту проблему, предоставив стандартный набор средств для работы с типами, понятный как тайпчекерам, так и инструментам времени выполнения, например, Pydantic.
Как программируемые типы изменят Python?
Программируемые типы позволят разработчикам писать функции, которые принимают тип и возвращают новый тип. Например, можно создать функцию Omit, исключающую определённые поля из структуры данных. Это открывает возможности для более безопасного и гибкого кода: библиотеки смогут автоматически генерировать типы на основе конфигураций, а фреймворки — проверять корректность данных на этапе компиляции. В отличие от TypeScript, где такие утилиты встроены в язык, Python сохранит динамическую природу, но получит мощный инструмент для статического анализа.
Предыстория и контекст появления PEP 827
Python постепенно развивает свою систему типов: от необязательных аннотаций в PEP 484 до более сложных конструкций вроде TypedDict и Generic. Однако сообщество давно обсуждает нехватку выразительности. TypeScript, напротив, изначально строился вокруг мощной системы типов, что сделало его популярным в крупных проектах. Vercel, активно использующая Python в своих инструментах (например, в Vercel Python Runtime), заинтересована в улучшении типизации для повышения надёжности кода и удобства разработки.
Идея PEP 827 не нова: ранее были попытки ввести макросы или рефлексию типов, но ни одна не дошла до стадии PEP. Vercel провела масштабное исследование, чтобы предложить решение, которое будет принято сообществом. Поддержка со стороны создателя FastAPI Себастьяна Рамиреса (Sebastián Ramírez) — важный сигнал, так как FastAPI активно использует аннотации типов и Pydantic. Контекст показывает, что Python-сообщество созрело для более продвинутой системы типов, и PEP 827 может стать следующим шагом.
Почему Vercel заботится о типах Python?
Vercel, как платформа для развёртывания, сталкивается с необходимостью обрабатывать код на разных языках. Python используется в бессерверных функциях и бэкенд-сервисах, где надёжность критична. Улучшение типизации позволяет отлавливать ошибки на ранних стадиях, снижая количество инцидентов в продакшене. Кроме того, Vercel активно продвигает TypeScript в экосистеме JavaScript, и подобный опыт они хотят привнести в Python.
Технические детали: сравнение с TypeScript
В TypeScript утилиты Pick и Omit реализованы через специальный синтаксис: Pick и Omit . В Python, по замыслу PEP 827, они будут выглядеть как вызовы функций: Pick(Type, Keys) и Omit(Type, Keys). При этом реализация Omit в Python будет почти идентична Pick, но с инвертированным условием, тогда как в TypeScript эти утилиты устроены по-разному. Это показывает, что Python-подход более однороден и легче для понимания.
Авторы подчёркивают, что главная цель — не сделать Python похожим на TypeScript, а дать Python программируемое ядро типов, которое соответствует его семантике и остаётся интроспектируемым в рантайме. Это важно для таких фреймворков, как Pydantic, которые полагаются на метаданные типов. Например, Pydantic сможет использовать программируемые типы для автоматической генерации схем валидации, что упростит разработку API.
Какие ещё возможности откроет PEP 827?
Помимо Pick и Omit, PEP 827 может дать возможность создавать условные типы, маппинг типов и композицию типов. Разработчики смогут писать обобщённые функции, которые адаптируются к различным структурам данных без потери типобезопасности. Это особенно полезно для библиотек, работающих с данными, таких как Pandas или SQLAlchemy, где типы могут меняться динамически.
Кого затронет PEP 827 и как?
Предложение затронет в первую очередь разработчиков, использующих статическую типизацию в Python: от авторов библиотек до инженеров, пишущих крупные приложения. Для них упростится создание типобезопасных обобщённых функций и классов. Фреймворки вроде FastAPI, Pydantic и SQLAlchemy смогут предлагать более богатые типы без необходимости писать плагины для mypy или Pyright. В российском сообществе Python это может подстегнуть интерес к типизации, особенно в проектах, где важна надёжность.
Однако есть и обратная сторона: PEP 827 усложнит систему типов, что может отпугнуть новичков. Кроме того, реализация потребует изменений в тайпчекерах (mypy, Pyright, pytype) и, возможно, в самом CPython. Пока это только предложение, и до принятия может пройти год или больше. Тем не менее, если PEP будет принят, это станет значительным шагом вперёд для Python.
Как подготовиться к изменениям?
Разработчикам стоит начать изучать существующие возможности типизации в Python, такие как Generic, TypedDict и Protocol. Понимание этих концепций облегчит переход к программируемым типам. Также полезно следить за обсуждениями на Python Discourse и тестировать прототипы, если Vercel выпустит их.
Что будет дальше с PEP 827?
PEP 827 находится на стадии обсуждения в Python Discourse. Как и все PEP, он может быть принят, отклонён или отправлен на доработку. Vercel намерена активно участвовать в процессе и, возможно, реализовать прототип. Если предложение пройдёт, первые реализации можно ожидать в Python 3.14 или 3.15. В любом случае, это важный шаг к тому, чтобы Python догнал TypeScript по выразительности типов.
Итог
PEP 827 от Vercel — амбициозная попытка реформировать систему типов Python, сделав её программируемой и композиционной. Если предложение будет принято, Python получит инструмент, который позволит писать более безопасный и гибкий код, не жертвуя динамической природой языка. Следить за развитием PEP стоит каждому, кто работает с Python на серьёзном уровне.