Bien le bonjour. Une fois n'est pas coutume, je viens de trouver le moyen d'être chiant, d'une part en étant plus productif que mes collègues, d'autre part en produisant de l'inutilité.

Vlà-t'y pas que pas plus tard qu'hier, sur le canal où nous nous retrouvons pour le moment (#sdz-unix sur irc.epiknet.org), ArtMoonik a une super idée (comme ça lui arrive souvent d'ailleurs), et ne résiste pas au plaisir de nous en faire part :

ArtMoonik: va falloir qu'on floode de ruby

Si c'est pas génial, ça, madame.

Donc moi, naturellement pas trop favorable à la chose, je prends sur moi, et réfléchis. Et là je me dis : "mais on n'a qu'à faire l'inverse !".

Ce que j'essaye de dire au moyen de mon immarcescible talent de comédien-metteur en scène (si, on peut placer immarcescible dans cette phrase, je vois pas le problème), ce que désormais, tous les jours sauf le dimanche (d'où l'intérêt de commencer un samedi), j'aurai la joie de vous infliger “Le Truc En Python Du Jour”. Ça va être pénible, inutile, je doute tenir la longueur, mais ça me fera une raison pour faire de la pub pour le blog : “Hé, toi qui kiffes le Python, tu savais ça ? Et ça ?”.

Permettez-moi donc d'introduire le premier de cette longue liste de scripts (ou de bouts de) niaiseux : kamoulox.rb.py. C'est une traduction du script kamoulox d'ArtMoonik. Vous devriez pouvoir à peu près tout lire, mais détaillons un petit peu.

Le début me semble à peu près compréhensible, on note la traduction de empty? des chaînes par une comparaison avec la chaîne vide, celle du mystérieux caractère 35 par un '#' (parce que oui ce sont les mêmes), un "strippage" quasi inutile (mais j'aime bien) sur clef et contenu, la traduction une nouvelle fois du empty? sur le hash par un truc un peu plus riche sémantiquement parlant (ne niez pas §§), et l'utilisation d'une fonction nommée (définie de façon interne) pour sub, là où Ruby utilise un bloc (encore une fois si on avait de vraies lambdas en Python...). De plus, plutôt que de rajouter une méthode à list (ce qui aurait été compliqué vu que c'est pas possible par défaut), on utilise choice du module random. On note également que ce que sub transmet à la fonction qu'il invoque, c'est un objet match, pas une chaîne.

La fonction sub permet donc d'appeler une fonction (ici, on peut aussi lui transmettre une chaîne de remplacement à la place) en lui passant le résultat d'une capture à l'aide d'une regex. Ici, la regex [(\w)_\|]* qu'elle est belle sert à capter tous les mots, plus les _ et les |.

Voilà voilà, ce script est un peu plus compliqué que ce qui suivra (normalement), étant donné que je montrerai par la suite plus "d'astuces" Pythonniques que de vrais programmes, mais on ne sait jamais.