Sept. C'est le nombre de fois où le même message rouge est apparu sur mon écran avant que je comprenne enfin ce qui clochait dans mon petit script de budget. Sept échecs d'affilée pour une histoire de virgule, alors que je me croyais tranquillement en train d'apprendre le code depuis quelques mois. Ce soir-là, ce n'était pas un bug compliqué, juste Python qui refusait de traiter un morceau de texte comme un chiffre — et moi, python débutante convaincue d'avoir enfin dompté la conversion de type, complètement prise au dépourvu.
Avant d'en arriver là, j'avais déjà commis une erreur plus bête encore : vouloir construire tout de suite un gestionnaire de budget complet, avec plusieurs écrans et des calculs en cascade, alors que je ne savais même pas transformer un prix tapé au clavier en un nombre utilisable. Le projet s'est effondré au bout de quelques soirées, pas à cause d'un seul bug, mais parce que j'avais empilé trop de choses que je ne maîtrisais pas encore. J'ai fini par tout ranger dans un coin et repartir avec un script minuscule, une seule ligne de saisie et rien d'autre.
Le texte qui refuse obstinément de devenir un nombre
Le problème commence toujours au même endroit : la fonction input(). Je m'étais mis en tête que si je tapais 10 au clavier, Python comprendrait tout seul qu'il s'agissait du nombre dix. Grosse erreur de débutante. Tout ce qui sort de input(), sans exception, est du texte — ce qu'on appelle une chaîne de caractères — et une chaîne, on ne peut pas l'additionner comme un chiffre, même si à l'écran ça y ressemble à s'y méprendre.
Quand j'ai voulu ajouter mon entrée à un autre montant, le terminal m'a renvoyé une TypeError, cette erreur qui dit en substance : je ne sais pas comment additionner ça. Un peu comme vouloir mélanger de la farine et des clous dans un même saladier — chacun a sa place, mais pas ensemble. C'est là qu'est apparue la fonction int(), censée servir de pont entre les deux mondes. Sur le papier ça paraît simple : on entoure le texte de parenthèses et hop, un entier sort de l'autre côté. La réalité du soir raconte souvent une autre histoire.
Pourquoi une simple virgule a fait planter tout mon budget ?
Après plusieurs semaines de pratique, je me sentais presque sûre de moi. J'ai relancé mon script, tapé le montant de mon premier ticket de caisse, et là, plantage : ValueError: invalid literal for int() with base 10. La raison : j'avais écrit "12,50" avec une virgule, et int(), dans sa version la plus simple, ne veut voir que des chiffres purs, sans virgule, sans point, sans lettre glissée entre deux.
Le pire, c'est que ça s'arrête net. Une seule faute de frappe et tout le script s'écroule, comme si on avait cassé le moteur d'une voiture juste parce que la portière était mal fermée. J'ai fini par comprendre qu'il fallait anticiper ces erreurs plutôt que les subir, ce qui demande un vrai changement d'état d'esprit quand on débute.
Vérifier avant de foncer : ma première roue de secours
Ma première astuce a été d'utiliser .isdigit(), une petite méthode qu'on colle après la variable de texte pour lui demander : est-ce que ça ressemble vraiment à un nombre ? Si la réponse est oui, on convertit tranquillement. Sinon, on affiche un message plus poli plutôt que de laisser le script s'effondrer sous les yeux de l'utilisateur. Ce petit test conditionnel a changé mes soirées à lui tout seul.
C'est à peu près à cette période que j'ai commencé à m'intéresser à la logique plus large de mes scripts, notamment quand je cherchais à créer un menu interactif en python avec une boucle while sans bloquer. Ça m'a aidée à structurer la saisie de l'utilisateur pour que tout ne se fige pas à la première erreur — la même logique de prudence, appliquée à une autre échelle.
Le filet try-except : une gestion des erreurs confortable, mais pas magique
On m'a ensuite conseillé les blocs try et except. L'idée est belle : on demande à Python de tenter la conversion, et s'il tombe sur une ValueError, de faire autre chose plutôt que de tout arrêter en pleine exécution. Ça rassure, un peu comme un filet sous un trapèze. J'appuyais sur Entrée après chaque modification avec ce petit pincement au ventre, en espérant que le filet allait tenir.
Mais à force de m'en servir partout, j'ai remarqué que try-except devenait un marteau-pilon pour écraser une mouche. Empilé sans discernement, il alourdit le code et cache des erreurs qu'on aurait plutôt intérêt à voir tout de suite. C'est une facilité qui, sur la durée, rend le débogage plus flou qu'il ne devrait l'être.
Utiliser try-except pour absolument tout, y compris une simple conversion en entier, reste une habitude de débutante. On m'a expliqué, après quelques échanges sur des forums où je me sentais un peu bête, qu'il valait mieux vérifier le contenu du texte avant même de tenter la conversion. Le mot "regex" m'a longtemps fait peur, comme une formule de magie noire, avant que je comprenne que c'est juste une façon de dire à Python : je ne veux que des chiffres, rien d'autre.
Ce que quatre semaines de pratique ont changé
Vers la quatrième semaine, je continuais simplement à relire mon code de la veille avant d'ajouter quoi que ce soit dessus, une habitude prise sans trop y penser. Un soir, j'ai remarqué que je comprenais chaque ligne sans avoir besoin d'ouvrir un onglet d'aide à côté — pas de grand moment solennel, juste un détail qui ne m'avait pas sauté aux yeux avant.
Aujourd'hui, avant de convertir quoi que ce soit, je nettoie mes données : j'enlève les espaces, je remplace les virgules par des points si je veux un nombre à décimales. C'est un peu comme éplucher ses légumes avant de les mettre dans la marmite — si on laisse les bouts terreux, la soupe est ratée, même avec le meilleur bouillon du monde.
Une voisine, qui s'est mise à l'apiculture sur son balcon cet été, m'avait conseillé d'utiliser un site tout fait pour faire mes calculs plutôt que d'écrire du code moi-même. J'ai essayé deux minutes avant d'abandonner l'idée : ce n'était pas franchement le but du jeu pour moi.
Pour ceux qui, comme moi, ont parfois du mal avec les calculs de base, j'avais raconté ailleurs comment apprendre les opérateurs mathématiques en python pour progresser enfin. Comprendre comment Python traite une division ou une multiplication aide à deviner pourquoi une conversion échoue parfois sans prévenir.
La leçon que je garde de cette histoire de virgule, c'est qu'il vaut mieux vérifier ce qu'on a entre les mains avant de forcer une conversion, plutôt que d'espérer que ça passe et réparer les dégâts après coup. Une chaîne comme "10" reste une image tant qu'on ne l'a pas transformée en valeur, et cette distinction change presque tout dans la façon d'écrire un script, même minuscule.
Je referme l'ordinateur avec le sentiment d'avoir dompté un petit bout de la machine, même si demain une autre erreur m'attend sûrement au tournant. Peut-être que je m'attaquerai enfin aux regex pour de bon, ou peut-être que je les regarderai encore de loin comme un chat regarde un aspirateur. Demain, je veux essayer d'ajouter une gestion de date à mon budget, et je me demande déjà si afficher la date et l'heure en python sans trop galérer sera aussi tordu que ça en a l'air.