Modules stdlib

Modules natifs livrés avec Catnip, chargés via import('name'). Implémentés en Rust comme plugins .so, sans dépendance Python runtime.

À ne pas confondre avec les modules Python chargés via -m (CLI) ou import('numpy') (selon la policy). Les stdlib Catnip sont compilées dans le runtime ; les modules Python passent par le loader externe. Voir Module loading pour la distinction.

Modules disponibles

Module Description
http Client HTTP et serveur léger : verbes, JSON, streaming, multipart, cookies
io Lecture / écriture fichiers (open, print, write, read)
sys Métadonnées runtime (platform, version, cpu_count, argv, exit)

Usage

import('http')

response = http.get("https://example.com")
print(response.status, response.body)

import('name') charge le module et le bind dans le scope courant sous le nom name. Variantes :

# Renomme
h = import('http')
h.get("https://example.com")

# Sélectif (extrait des symboles dans le scope)
import('http', 'get', 'post')
get("https://example.com")

Arguments nommés

Les fonctions de module acceptent les arguments nommés que leur équivalent Python accepte : sep, end et flush pour les quatre fonctions de sortie (io.print, io.eprint, io.write, io.writeln), les huit paramètres du open de Python pour io.open, code pour sys.exit. Le même appel donne le même résultat quel que soit le backend qui sert le module.

io = import('io')
io.print("a", "b", sep=", ", end="!\n")   # ⇒ a, b!

Un nom qu'une fonction ne connaît pas est une erreur, jamais une valeur ignorée :

TypeError: print() got an unexpected keyword argument 'nope'

Une méthode se lit comme une valeur, et l'appeler ensuite revient au même :

io = import('io')

f = io.open("README.md")
lire = f.read
lire()

La méthode garde le fichier ouvert tant qu'elle vit, même si plus rien d'autre ne le référence. Les méthodes de fichier ne prennent aucun argument nommé, comme en Python.

Un paramètre se donne par position ou par nom, indifféremment : io.open(p, 'r', -1, 'utf-8') et io.open(p, encoding='utf-8') prennent le même chemin, un neuvième argument ou un nom donné deux fois sont refusés dans les termes de Python.

Les limites tiennent à ce que le moteur pur n'a ni objets Python ni codecs :

  • io.print(..., file=...) attend un objet fichier Python, et il est refusé plutôt que redirigé ailleurs en silence ;
  • io.open ne sert encoding qu'en UTF-8 (quelle qu'en soit l'orthographe) et les autres options qu'à leur valeur par défaut — c'est alors la valeur qui est refusée, en la nommant, jamais le paramètre : un nom que la spécification publie ne doit pas répondre qu'il n'existe pas ;
  • io.open ne connaît que les modes 'r', 'w' et 'a' : les modes binaires et de mise à jour ('rb', 'r+') sont servis par le backend Python et refusés par le natif.

Deux implémentations, une seule documentation. Elle décrit maintenant ce qu'elles font toutes les deux.

Convention

Chaque module stdlib expose au minimum :

  • PROTOCOL = "rust" : permet de distinguer les modules natifs des modules Python
  • VERSION : version semver du module
import('http')
print(http.PROTOCOL)  # → "rust"
print(http.VERSION)  # → "0.2.0"

Le PROTOCOL est un signal stable : si un jour Catnip migre certains modules vers du WASM ou du WASI, la valeur changera et le code applicatif peut s'y adapter. Pour l'instant elle est constante.

Étendre

Pour écrire un nouveau module stdlib, voir catnip_libs/README.md (guide contributeur). Le manifeste spec.toml reste la source de vérité pour les signatures exportées ; les pages dans docs/libs/ documentent l'usage et les patterns.