Pyrefly ваш Python-код может работать быстрее, даже не запускаясь
Знакомая ситуация? Вы добавляете аннотации типов в свой Python-проект, запускаете MyPy и… ждете. На больших кодовых базах проверка типов может превратиться в заметную паузу в рабочем процессе. А ведь хочется, чтобы IDE летала, подсказки появлялись мгновенно, а ошибки подсвечивались еще до сохранения файла. Кажется, в Facebook столкнулись с той же проблемой и решили ее радикально — переписав тайп-чекер на Rust.
Давайте посмотрим на Pyrefly — проект, который обещает молниеносную проверку типов и умные IDE-фичи для Python.
Что такое Pyrefly и зачем он нужен?
Если коротко, Pyrefly — это одновременно и статический анализатор типов, и языковой сервер (Language Server) для Python.
- Как анализатор типов, он проверяет ваш код на соответствие аннотациям типов, помогая отлавливать ошибки на ранней стадии.
- Как языковой сервер, он интегрируется с вашей IDE (например, через расширение для VSCode) и обеспечивает такие фичи, как автодополнение, переход к определению, семантическая подсветка и многое другое.
Основное отличие от конкурентов вроде MyPy или Pyright — скорость. Разработчики сделали ставку на Rust, известный своей производительностью, чтобы обрабатывать даже очень большие проекты с минимальной задержкой. Это не просто "еще один" тайп-чекер, а попытка создать инструмент, который не тормозит, а ускоряет разработку.
Ключевые возможности: чем Pyrefly цепляет?
Давайте разберем, что делает этот проект особенно интересным на практике.
1. Умный вывод типов там, где это нужно
Pyrefly не заставляет вас аннотировать абсолютно все. Он достаточно умен, чтобы самостоятельно выводить типы переменных и возвращаемых значений функций. Параметры функций, правда, все еще требуют аннотаций, но это и к лучшему — это контракт вашей функции.
Например, если вы напишете:
def is_positive(x):
result = x > 0
return result
Pyrefly поймет, что result имеет тип bool и функция возвращает bool, даже без явных указаний. Это сокращает количество "шума" в коде, оставляя аннотации там, где они действительно важны.
2. Понимание потока выполнения (Flow Types)
Это одна из самых крутых фич. Pyrefly анализирует не просто статические типы, но и поток выполнения вашего кода, чтобы уточнять их.
Классический пример:
from typing import Union
def process_data(data: Union[str, None]):
if data is not None:
# Здесь Pyrefly точно знает, что data - это str
print(data.upper())
Внутри блока if Pyrefly "сужает" тип переменной data с Union[str, None] до просто str. Благодаря этому он не будет ругаться на вызов метода .upper() и сможет дать по нему корректные подсказки. Это делает код чище, избавляя от лишних assert или cast.
3. Инкрементальность и параллелизм
Pyrefly спроектирован для работы с большими проектами. Он умеет перепроверять только изменившиеся модули (инкрементальность на уровне модулей) и эффективно распараллеливать вычисления. В результате, после первого полного анализа последующие проверки занимают гораздо меньше времени. Это именно то, чего не хватает многим инструментам при работе с монорепозиториями или сложными зависимостями.
Как это работает под капотом?
Не углубляясь в дебри, стоит отметить пару интересных архитектурных решений. Команда Pyrefly вдохновлялась Pyre, Pyright и MyPy, но выбрала свой путь.
Процесс анализа разбит на три основных этапа:
- Анализ экспортов: Сначала Pyrefly решает все импорты, включая
import *, чтобы понять, какие имена каждый модуль предоставляет наружу. - Создание "привязок" (bindings): Затем для каждого модуля код преобразуется во внутреннее представление — набор привязок, которые описывают определения, использования и области видимости переменных.
- Решение привязок: На последнем шаге система "решает" эти привязки, вычисляя типы. Если она сталкивается с рекурсией, то использует временные переменные типов (
Type::Var), которые разрешаются позже.
Интересно, что в отличие от некоторых других языковых серверов (вроде rust-analyzer), Pyrefly не стремится к мелкозернистой инкрементальности (когда пересчитывается только одна измененная функция). Вместо этого он делает ставку на грубую силу и скорость Rust: зачем усложнять логику, если можно просто очень быстро пересчитать весь модуль целиком?
Как попробовать?
Начать использовать Pyrefly довольно просто.
- Поиграть в песочнице: Если вы хотите просто "пощупать" инструмент, не устанавливая ничего, на официальном сайте есть веб-песочница.
- Установить как CLI-утилиту: Для интеграции в CI/CD или локальных проверок достаточно одной команды:
pip install pyrefly - Интегрировать с VSCode: Самый удобный способ — установить официальное расширение из Marketplace.
Выводы: кому стоит присмотреться?
Pyrefly — это свежий взгляд на статическую типизацию в Python. Проект все еще находится в активной разработке, но уже сейчас выглядит многообещающе.
Кому особенно подойдет Pyrefly:
- Разработчикам на больших проектах: Если вы чувствуете, что текущие инструменты проверки типов начинают тормозить, скорость Pyrefly может стать решающим фактором.
- Ценителям отзывчивого IDE: Быстрый языковой сервер — залог комфортной работы. Мгновенное автодополнение и подсветка ошибок экономят массу времени и нервов.
- Энтузиастам Rust и Python: Это отличный пример того, как производительность Rust может усилить экосистему Python.
Конечно, это не "убийца" MyPy или Pyright, а скорее сильный альтернативный игрок со своей философией. Если скорость и отзывчивость для вас в приоритете, обязательно дайте Pyrefly шанс. Он может приятно удивить.
