Skip to content

Poésie en Python (2)

30 juin 2011

Après avoir livré la poésie en Python (cf. épisode précédent) au jury, celui-ci rend sa décision. Pour apprécier le poème et les pertinentes remarques du jury, il est nécessaire de comprendre le fonctionnement du programme :

The art of poem programming

À la lecture, le texte raconte l’histoire d’un amoureux déçu qui décide de se suicider. Pour voir l’effet du poème, il suffit de le copier-coller dans un fichier (suicide.py dans l’exemple suivant) et d’exécuter le programme :

stephane@foehn:/tmp/poeme$ ls
suicide.py
stephane@foehn:/tmp/poeme$ chmod u+x suicide.py 
stephane@foehn:/tmp/poeme$ ./suicide.py 
stephane@foehn:/tmp/poeme$ ls
stephane@foehn:/tmp/poeme$

Le programme s’est supprimé tout seul ! Le code fait ce que le programme raconte, ce qui était la nouvelle contrainte à respecter.

Comment ce petit miracle s’est réalisé ?

Le programme se compose de trois parties :

  • la définition de _
  • la définition de ute
  • la production de l’effet

La définition de _ :
C’est un n-uplet de chaines de caractères (les vers du poème). Chaque vers est séparé par une virgule, ce qui explique les virgules à chaque fin de ligne alors qu’elles n’ont pas de sens poétique. Le choix du nom de la variable est motivé par sa discrétion, aux antipodes de l’expressivité, pour masquer le code au maximum.

La définition de ute :
Elle est faite en une seule ligne grâce à l’utilisation de deux bouts de code pythoniques. C’est véritablement le coeur du programme :
[v[0] for v in _] est une comprehension list : elle prend un objet itérable, ici _, et pour chaque élément, nommé ici v pour « vers  », prend son premier élément (donc le premier caractère du vers). Ce morceau de code retourne donc

['o', 's', '.', 'r', 'e', 'm', 'o', 'v', 'e', '(', '_', '_', 'f', 'i', 'l', 'e', '_', '_', ')']

Prendre la première lettre de chaque vers pour composer un message en rapport avec le poème est une figure de style (un acrostiche). Ici, le message est le texte du programme, sorte de trait d’union entre le poème et le code.

separateur.join(iterable) est le code typique de concaténation de chaîne de caractères : il ajoute separateur entre chaque élément de l’objet iterable. Dans le poème, on ajoute une chaîne vide entre chaque élément, lui-même constitué uniquement d’une lettre. (En python, il faut éviter d’utiliser l’opérateur + pour concaténer, en particulier dans une boucle pour des raisons de performance.)

ute est donc une chaîne valant os.remove(__file__).

La production de l’effet : jusque ici, on a simplement une chaine qui va falloir rendre active. C’est réalisé à la toute fin du poème, lorsque le narrateur dit qu’il va se suicider. exec(ute) permet de faire le lien entre la personne qui se suicide (donc s’exécute) et le programme qui fait de même. Dans beaucoup de langage, l’évaluation dynamique du code se fait avec la fonction eval(). Cette fonction est aussi disponible en Python mais n’est pas très adapté à cette poésie. On obtient donc le résultat grâce à exec().

__file__ est une variable spéciale remplie automatiquement par l’interpréteur. C’est une chaîne de caractère valant le chemin vers le fichier. L’utilisateur peut donc choisir le nom qu’il veut, le programme fonctionnera.

Le fonctionnement même du programme impose la première lettre (ce qui explique que certains vers commencent par les caractères soulignés, plus ou moins maquillés par d’autres caractères soulignés sur la même ligne, simulant la volonté de donner de l’emphase sur certains termes).

Verdict du jury

Après analyse de l’impartial jury, celui-ci rendit son verdict. L’effort était apprécié mais le résultat ne pouvait être considéré comme une véritable réussite. En effet, pour le jury :

on n’atteignait pas encore les sommets de la poésie parce qu’il y a du texte parasite, genre ça :

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os

C’est vrai, je confesse avoir naïvement espéré que le jury ferme les yeux sur ces détails. Que nenni, le jury, inflexible, à l’oeil de faucon et d’une main de fer dans un gant de titane blindé, ne pouvait être abusé. Oui, le jury est dur mais juste. Mais dur surtout.

Un léger abattement se fit sentir un court instant. Mais allé-je me laisser abattre par la douloureuse sentence du jury (impartial, je le rappelle) ?

Non ! C’est ce que nous verrons dans le troisième et dernier épisode, nommé « Le retour du Python qui contre-attaque » (ou « Poésie en Python (3) », j’hésite encore).

(à suivre…)

From → Python

Laisser un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :