HeadlinesBriefing favicon HeadlinesBriefing.com

Exécuter des analyseurs JSON Rust dans Python avec PyO3

Hacker News •
×

Chaque fois que vous validez des données avec Pydantic v2, la bibliothèque de validation de données que la plupart des applications Python utilisent, une extension Rust fait le travail. Son cœur, pydantic-core, est construit avec PyO3, la même chaîne d'outils que cet article utilise pour exposer un petit analyseur JSON Rust comme package Python.

Intégrer du code Rust dans Python prend quatre étapes : écrire un module Rust normal, l'annoter avec des macros PyO3, laisser maturin le compiler et l'installer, et importer le résultat. #[pyfunction] et #[pymodule] ajoutent la colle, les conversions de types et le comptage de références. Maturin compile ensuite la crate en bibliothèque partagée et la dépose dans votre environnement virtuel.

L'analyseur produit un enum Rust simple : Null, Boolean(bool), Number(f64), String(String), Array(Vec<Json Value>) ou Object(Hash Map<String, Json Value>). Un macro d'attribut Rust réécrit la fonction sur laquelle il se trouve, comme un décorateur Python. Dans notre cohorte Python vers Rust, les étudiants passent six semaines à écrire un analyseur JSON from scratch en Rust, un tokeniseur fait main et un analyseur récursif descendant sans serde, puis l'exposent à Python via PyO3. La version de Josh a battu le module C json de CPython sur des fixtures réelles ; celle de Jochen tournait jusqu'à 3.5x plus vite que la version Python.

L'implémentation de référence publique est la version propre à partir de laquelle les étudiants commencent. parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> retourne la valeur ou lève une exception Python. Sur les builds Python traditionnels, cet accès est associé à la détention du GIL. PyO3 vous le donne et vous le transmettez partout où vous touchez un objet Python.

Entités clés : Personnes : Josh, Jochen