Exercices Projets guidés Outil : ecrire dans un fichier
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Outil : ecrire dans un fichier

Claude Code ne fait pas que lire du code : il en ecrit aussi. Quand tu lui dis "cree un fichier utils.py avec une fonction de validation", il ecrit le fichier sur ton disque. C'est la capacite la plus puissante et la plus dangereuse de l'outil.

Dangereuse, parce qu'un LLM qui ecrit des fichiers sans controle peut ecraser ton travail. Imagine qu'il ecrase ton fichier de config en production. C'est pour ca que le vrai Claude Code demande toujours confirmation avant d'ecrire. Et c'est exactement ce qu'on va implementer.

En vrai Python, ecrire un fichier avec creation des dossiers parents :

from pathlib import Path

chemin = Path("src/utils/helpers.py")
chemin.parent.mkdir(parents=True, exist_ok=True)
chemin.write_text("def aide(): pass", encoding="utf-8")

On va travailler avec le systeme de fichiers simule. Ecris une fonction ecrire_fichier_simule(chemin, contenu, systeme_fichiers, confirmation=False) qui ecrit du contenu dans un fichier du systeme simule.

Regles :

Si confirmation est False, la fonction ne doit PAS ecrire. Elle renvoie un dictionnaire qui decrit ce qui serait fait, pour que l'utilisateur puisse confirmer.
Si confirmation est True, elle ecrit effectivement (modifie le dictionnaire systeme_fichiers).
Si le fichier existe deja, le dictionnaire de preview doit indiquer que c'est un ecrasement.
Si les dossiers parents n'existent pas, ils sont crees automatiquement.

Format de retour en mode preview (confirmation=False) :

{"succes": True, "action": "preview", "chemin": "src/app.py",
"nouveau": True, "taille": 42, "message": "Nouveau fichier : src/app.py (42 octets)"}

{"succes": True, "action": "preview", "chemin": "src/app.py",
"nouveau": False, "taille": 42, "message": "Ecrasement : src/app.py (42 octets)"}

Format de retour en mode ecriture (confirmation=True) :

{"succes": True, "action": "ecrit", "chemin": "src/app.py", "taille": 42}

Exemple :

fs = {"src": {"app.py": "ancien code"}}

ecrire_fichier_simule("src/app.py", "nouveau code", fs)
renvoie {"succes": True, "action": "preview", "chemin": "src/app.py",
"nouveau": False, "taille": 12, "message": "Ecrasement : src/app.py (12 octets)"}

ecrire_fichier_simule("src/app.py", "nouveau code", fs, confirmation=True)
renvoie {"succes": True, "action": "ecrit", "chemin": "src/app.py", "taille": 12}
# et fs["src"]["app.py"] vaut maintenant "nouveau code"

ecrire_fichier_simule("lib/helpers.py", "code", fs, confirmation=True)
# cree fs["lib"] = {"helpers.py": "code"}

Tests (4/5)

Preview d'un nouveau fichier
fs = {"src": {}}
r = ecrire_fichier_simule("src/nouveau.py", "print('hello')", fs)
assert r["action"] == "preview", "Sans confirmation, l'action doit etre 'preview'"
assert r["nouveau"] == True, "Le fichier n'existe pas, nouveau doit etre True"
assert r["taille"] == len("print('hello')".encode("utf-8"))
assert "src/nouveau.py" not in fs.get("src", {}), "Le fichier ne doit PAS etre ecrit en mode preview"
Preview d'un ecrasement
fs = {"src": {"app.py": "ancien"}}
r = ecrire_fichier_simule("src/app.py", "nouveau", fs)
assert r["nouveau"] == False, "Le fichier existe deja, nouveau doit etre False"
assert "Ecrasement" in r["message"], "Le message doit mentionner l'ecrasement"
assert fs["src"]["app.py"] == "ancien", "Le fichier ne doit PAS etre modifie en mode preview"
Ecriture avec confirmation
fs = {"src": {"app.py": "ancien"}}
r = ecrire_fichier_simule("src/app.py", "nouveau", fs, confirmation=True)
assert r["action"] == "ecrit"
assert fs["src"]["app.py"] == "nouveau", "Le fichier doit etre modifie apres confirmation"
Creation des dossiers parents
fs = {}
r = ecrire_fichier_simule("lib/utils/helpers.py", "code", fs, confirmation=True)
assert r["succes"] == True
assert "lib" in fs, "Le dossier lib doit etre cree"
assert "utils" in fs["lib"], "Le dossier utils doit etre cree dans lib"
assert fs["lib"]["utils"]["helpers.py"] == "code"

+ 0 tests cachés

Indices (3 disponibles)

solution.py