Генерируем Rust код из Python и становимся крабами Проект "острый краб": https://github.com/kushaldas/spicycrab Вы же знаете, что вы узнаете про все важные штуки в питоне первыми? На ближайшем Language Summit в июле Кушал Дас - core-разработчик CPython - представит свой новый проект. Но зачем ждать июля, когда код открыт? Давайте смотреть и пробовать! В чем главная идея? - Пишем на типизированном Python - Получаем на выходе Rust код, который работает в десятки или сотни раз быстрее - Можем использовать в Python крейты Rust и Python пакеты, что? 🙀 (проект еще не просто в альфе, а в пре-альфе, но мы тут просто любим странное, ставь 🕊, если просто заходишь сюда почитать про непонятное и удивительное) Начнем с простого: print('Hello world') Запустим: crabpy transpile ex.py и получим: fn main() { println!("Hello world"); } Прикол! Давайте сделаем сложнее. Возьмем clap (популярная библиотека для парсинга CLI параметров в расте) и сделаем мини CLI с ее помощью ... на питоне. 1. Скачиваем Rust зависимость и генерим из нее Python стабы: cookcrab generate clap -o rust-stubs/ 2. Смотрим, что там внутри правда Python стабы, удивляемся 3. Устанавливаем стабы: pip install -e ./rust-stubs/clap_builder ./rust-stubs/clap 4. Пишем на питоне: from spicycrab_clap import Command, Arg, ArgMatches def main() -> None: matches: ArgMatches = ( Command.new("myapp") .arg(Arg.new("name").required(True)) .get_matches() ) name: str = matches.get_one("name").unwrap().clone() print(f"Hello, {name}!") 5. Транспилим: crabpy transpile ex.py 6. Получаем pub fn main() { let matches: clap_builder::ArgMatches = clap::Command::new("myapp") .arg(clap::Arg::new("name").required(true)) .get_matches(); let name: String = matches.get_one::("name").cloned().unwrap().to_string(); println!("{}", format!("Hello, {}!", name)); } 7. Запускаем: » cargo run -- Nikita Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s Running `/Users/sobolev/Desktop/spicycrab/rusty/target/debug/ex Nikita` Hello, Nikita! Теперь у вас нет уважительных причин, чтобы говорить "я не знаю раст" 🌚️️ Зачем? А если серьезно, то не совсем пока понятно - какую нишу будет занимать данный проект. Сам автор говорит: > Write typed Python and generate working Rust code via spicycrab. This currently includes part of stdlib, async (via tokio), actix-web examples. Slowly more and more Rust crates are available as stub typed Python modules, which we can use like normal Python code while developing and then compiling the generated Rust code as final output. The final goal is to be able to write smaller production code using spicycrab. Кажется, что ниша довольно маленькая. Если вам реально хочется писать Python + Rust код вместе (что вообще-то лютейшая база, например ruff и uv ровно так и написаны), то есть уже готовые проекты: - https://github.com/pyo3/pyo3 - для использования Rust вместе с CPython биндингами - https://github.com/pyo3/maturin - система сборки для такие проектов Есть проекты чуть менее универсальные, например: - https://github.com/RustPython/RustPython - интерпретатор Python на Rust, там тоже можно писать модули на расте для питона своим особым способом use rustpython::vm::pymodule; #[pymodule] mod test_module { #[pyfunction] pub fn add(a: i32, b: i32) -> i32 { a + b } } - https://github.com/youknowone/pyre - новый интерпретатор Python на Rust (от того же автора) но с Free-Threading и JIT из PyPy, в некоторых случаях в 45 раз быстрее CPython, goes brrrr - Поддержка Rust напрямую в CPython: https://t.me/opensource_findings/941 Ждете? :) И еще куча всего другого. Но, будет интересно посмотреть, что выйдет из такого довольно необычного опыта. Обсуждение: Знаете ли вы раст? Хотите ли изучить? Видите ли применения у себя на работе? | Поддержать | YouTube | GitHub | Чат |