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 :
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) :
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 officielle
def ecrire_fichier_simule(chemin, contenu, systeme_fichiers, confirmation=False):
parties = chemin.strip("/").split("/")
nom_fichier = parties[-1]
dossiers = parties[:-1]
# Verifier si le fichier existe deja
courant = systeme_fichiers
existe = True
for d in dossiers:
if isinstance(courant, dict) and d in courant:
courant = courant[d]
else:
existe = False
break
if existe and isinstance(courant, dict):
existe = nom_fichier in courant
else:
existe = False
taille = len(contenu.encode("utf-8"))
if not confirmation:
if existe:
message = f"Ecrasement : {chemin} ({taille} octets)"
else:
message = f"Nouveau fichier : {chemin} ({taille} octets)"
return {"succes": True, "action": "preview", "chemin": chemin,
"nouveau": not existe, "taille": taille, "message": message}
# Mode ecriture : creer les dossiers parents
courant = systeme_fichiers
for d in dossiers:
if d not in courant:
courant[d] = {}
courant = courant[d]
courant[nom_fichier] = contenu
return {"succes": True, "action": "ecrit", "chemin": chemin, "taille": taille}