Il est déjà bien tard ce soir dans ma cuisine à Clermont, et je fixe mon écran avec une frustration qui commence à piquer les yeux. Ma tasse de verveine est oubliée sur le coin de la table, le reflet bleuté du terminal sur ma tasse de verveine oubliée qui est devenue totalement froide pendant que je cherchais la solution. J'essayais simplement de coder un petit script pour calculer mon budget courses, un truc tout bête pour additionner mes tickets de caisse, mais la machine a décidé de me tenir tête pour une histoire de virgule.
Depuis le printemps dernier, environ 5-6 mois que je me suis lancée dans cette aventure Python, j'ai appris que les ordinateurs sont d'une logique implacable, mais aussi d'une bêtise crasse si on ne leur parle pas exactement comme ils le veulent. Ce soir, le coupable, c'est le type de donnée. Moi, je vois un prix sur un ticket, Python, lui, voit une suite de gribouillis sans aucun sens mathématique. C'est là que j'ai compris que convertir du texte en nombre, ce n'est pas juste une formalité, c'est tout un art de la diplomatie numérique.
Le choc des mondes : quand le texte refuse de devenir un nombre
Tout a commencé un mardi soir en mai, quand j'ai voulu utiliser la fonction input(). Je pensais naïvement que si je tapais 10 au clavier, Python comprendrait que c'était le nombre dix. Grave erreur de débutante. Pour Python, tout ce qui sort de input() est un "string", une chaîne de caractères. C'est comme si j'écrivais le mot "DIX" sur une étiquette : on ne peut pas faire d'additions avec des étiquettes, il faut le vrai objet mathématique derrière.
Quand j'ai essayé d'additionner mon entrée avec un autre chiffre, le terminal m'a insultée avec une TypeError. C'est un peu comme essayer de mélanger de la farine et des clous dans un gâteau ; ça ne prend pas. J'ai alors découvert la fonction int(), qui est censée faire le pont entre ces deux mondes. Sur le papier, c'est simple : on met le texte entre parenthèses, et hop, ça devient un entier. Mais la réalité de ma cuisine est souvent plus complexe que les exemples des tutoriels.
La fameuse ValueError qui casse tout
Après un mois de pratique, je me sentais plus confiante. J'ai lancé mon script de budget, j'ai tapé le montant de mon premier ticket... et paf. ValueError: invalid literal for int() with base 10. Pourquoi ? Parce que j'avais tapé "12,50" avec une virgule. La fonction int(), dans sa version standard (celle de Python 3.12 que j'utilise), s'attend à trouver des chiffres purs, en base 10, sans fioritures. Elle ne comprend ni les virgules, ni les points, ni les lettres.
C'est là que le bât blesse. Si l'utilisateur (en l'occurrence, moi après une journée de boulot harassante) fait une faute de frappe, le programme s'arrête net. C'est d'une violence ! On a l'impression d'avoir cassé le moteur de la voiture juste parce qu'on a mal fermé la portière. J'ai compris qu'il fallait que je sois plus maligne que la machine et que je prévoie ces erreurs avant qu'elles ne surviennent.
Ma première roue de secours : isdigit()
Ma première astuce a été d'utiliser .isdigit(). C'est une petite méthode qu'on colle après sa variable de texte pour demander à Python : "Dis-moi, est-ce que ce truc ressemble vraiment à un nombre ?". Si c'est vrai, alors on convertit. Sinon, on affiche un petit message poli au lieu de laisser le script exploser. C'était un grand pas en avant pour mes nerfs.
C'est d'ailleurs à cette période que j'ai commencé à m'intéresser à la logique globale. Si vous voulez voir comment j'ai intégré ça dans des structures plus larges, j'en parlais un peu quand je cherchais à créer un menu interactif en python avec une boucle while sans bloquer, ce qui m'avait pas mal aidée à structurer mes entrées d'utilisateurs sans que tout ne freeze à la première erreur.
L'approche try-except : le filet de sécurité (et ses limites)
Ensuite, on m'a conseillé d'utiliser les blocs try et except. Le concept est génial : on dit à Python de "tenter" la conversion, et si jamais il y a une ValueError, de faire autre chose au lieu de mourir. C'est très confortable. On se sent protégé, comme avec un filet de sécurité sous un trapèze. J'avais cette petite accélération du rythme cardiaque quand on appuie sur Entrée après avoir modifié une ligne de code critique, espérant que le filet allait tenir.
Mais voilà, à force de pratiquer, j'ai remarqué que le try-except était un peu comme utiliser un marteau-pilon pour écraser une mouche. Si on l'utilise partout, le code devient lourd et on finit par masquer des erreurs qu'on aimerait bien voir. C'est une solution de facilité qui, sur le long terme, peut rendre le débogage un peu flou. C'est là que ma vision de débutante a commencé à changer, surtout vers la fin août dernier.
Pourquoi j'ai arrêté de ne jurer que par le try-except
C'est mon moment de vérité de l'été : utiliser systématiquement try-except pour convertir des entiers est une erreur de débutant. On m'a expliqué (après quelques posts sur des forums où je me sentais un peu bête) qu'il valait mieux privilégier la validation par des méthodes plus précises, comme les expressions régulières (regex), pour garder un code propre et performant. Au début, le mot "regex" m'a fait peur, ça ressemble à un sortilège de magie noire. Mais en fait, c'est juste une façon de définir un motif précis : "Je ne veux que des chiffres, et rien d'autre".
En vérifiant le contenu du texte *avant* de tenter la conversion, on garde le contrôle. C'est beaucoup plus satisfaisant de dire "Je sais que ce n'est pas un nombre, donc je ne vais même pas essayer de le convertir" plutôt que de dire "Vas-y, tente le coup, et on verra bien si ça explose". C'est une nuance subtile, mais qui change tout dans la tête.
Apprendre à parler "Chiffres" couramment
Aujourd'hui, quand je code mes petits outils de calcul, je fais bien attention. Je nettoie mes données d'abord (enlever les espaces, remplacer les virgules par des points si je veux passer en flottant, etc.). C'est un peu comme préparer ses légumes avant de les mettre dans la marmite : si on ne coupe pas les bouts terreux, la soupe sera ratée, peu importe la qualité du bouillon.
D'ailleurs, pour ceux qui comme moi galèrent parfois avec les calculs de base, j'avais écrit un petit journal sur comment apprendre les opérateurs mathématiques en python pour progresser enfin. Ça paraît bête, mais savoir exactement comment Python traite une division ou une multiplication aide énormément à comprendre pourquoi une conversion de type échoue parfois de manière inattendue.
Le dernier mot de la soirée, alors que mes yeux commencent vraiment à piquer : la conversion de type, c'est la base de la communication entre nous et la machine. C'est ingrat, c'est souvent là que les premiers bugs arrivent, mais une fois qu'on a compris que "10" est une image et 10 est une valeur, on a fait la moitié du chemin. Je ferme mon ordinateur portable avec le sentiment d'avoir enfin dompté une petite part de la machine, même si je sais que demain, une autre erreur m'attendra au tournant. Peut-être que je devrais enfin m'attaquer à ces fameuses regex pour de bon, plutôt que de les regarder de loin comme un chat observe un aspirateur.
Allez, au dodo. Demain, j'essaierai d'ajouter une gestion de date à mon budget, mais je sens que afficher la date et l'heure en python sans trop galérer sera une autre paire de manches. On verra ça après le café.