Une question qui semble revenir assez régulièrement dans ces forums est "comment exécuter du code au run-time?"
Voici une façon de créer des fonctions au run-time. Voici un exemple de code:
Et à l'exécution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 def _color(text, color): print '<font color="%s">%s</font>' % (color, text) colors = { 'red' : '#ff0000', 'green': '#00ff00', 'blue' : '#0000ff', } for color, code in colors.iteritems(): locals()[color] = lambda text: _color(text, code) red("RED") blue("BLUE") green("GREEN")
Donc, voyons le fonctionnement. La fonction _color() prend deux argument, un texte et un code de couleur. Donc, pour écrire en rouge, on ferait:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $ python colors.py <font color="#ff0000">RED</font> <font color="#0000ff">BLUE</font> <font color="#00ff00">GREEN</font>
Par contre, ça risque de devenir rapidement long à écrire. Ce qu'on voudrait c'est avoir une fonction red() qui écrit en rouge. On pourrait certainement la créer, et faire de même avec green() et blue(). Le problème est que si on décide de faire une modification, par exemple ajouter un paramètre class à FONT, il faudra changer 3 fonctions. C'est pas super intéressant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 _color('Hello', '#ff0000')
Donc ce que nous allons faire, c'est générer programmatiquement les fonctions red(), green() et blue() en se servant de _color(). Donc, si on change _color(), les trois autres fonctions vont être mises à jour également.
La première chose à faire est d'écrire notre fonction _color(). Je ne m'y attarde pas, je crois que c'est assez simple. Ensuite, dans un dictionnaire, on fait un mapping entre le nom de notre fonction spécialisé et son code de couleur. Encore là, je crois que c'est assez simple, donc je passe.
On arrive maintenant à la partie "magique" du code. La fonction locals() retourne un dict qui contient les différents identificateurs locaux. Si on faisait un print à ce point-ci, on verrait que _color et colors sont dans les clés. Il est possible de modifier ce qui se trouve dans locals(), donc on a la ligne:
Ce qui arrive, on ajoute dans locals() un mapping entre le nom de la couleur et une fonction d'un argument (le texte) qui appelle _color() avec le texte donné en paramètre et le code de couleur pris de colors.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 locals()[color] = lambda text: _color(text, code)
Une fois que c'est fait, on peut utiliser red(), green() et blue() comme si on les avait définit avec def.
Partager