Lundi
1 (14:00:29) olivier.larcheveque:
2 On reprends avec la présentation de Davin sur la programmation Python https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/ProgrammationPython
3 (14:00:32) semainetech@reunion.auf.org: willy a changé le sujet en : ☞ Le salon de la Semaine Tech ☜ Atelier "Programmation python" https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/ProgrammationPython
4 (14:00:46) davin.baragiotta: ---------- DÉBUT : Atelier : Programmation Python ----------------
5 (14:00:51) davin.baragiotta: INTRODUCTION
6 (14:00:55) davin.baragiotta: Bonjour à tous!
7 (14:01:00) davin.baragiotta:
8 La documentation complète de Python se trouve ici :
9 http://www.python.org/doc/
10 (14:01:07) davin.baragiotta:
11 Vous y trouverez notamment un tutoriel (que j'aurais aimé suivre mais c'est trop long) :
12 http://docs.python.org/tutorial/
13 (14:01:16) davin.baragiotta:
14 ... et aussi la documentation de la librarie (bibliothèque) standard venant avec le langage (on y reviendra) :
15 http://docs.python.org/library/
16 (14:01:20) davin.baragiotta: Aujourd'hui, on va programmer en Python.
17 (14:01:21) davin.baragiotta: :D
18 (14:01:27) davin.baragiotta: Dans cet atelier :
19 * on va coder dans l'interpréteur et explorer les bases du langage
20 * on va écrire un script qu'on fera exécuter par l'interpréteur
21 * on va explorer du vrai code et modifier celui-ci pour créer un bot jabber!!!!
22 (14:01:39) davin.baragiotta: ENVIRONNEMENT
23 (14:01:50) davin.baragiotta: Vous devriez avoir un éditeur texte sous la main, configuré comme demandé dans la page wiki.
24 (14:01:57) davin.baragiotta: Vous devriez avoir installé l'interpréteur ipython.
25 (14:02:05) davin.baragiotta:
26 Vous devriez avoir téléchargé l'archive code.tar.gz :
27 https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/ProgrammationPython?action=AttachFile&do=view&target=code.tar.gz
28 (14:02:13) davin.baragiotta: Ouvrez un terminal et déplacez vous dans le répertoire où vous avez extrait l'archive :
29 cd code/
30 (14:02:21) davin.baragiotta: C'est parti!
31 (14:02:36) davin.baragiotta: INTERPRÉTEUR
32 (14:03:00) davin.baragiotta: L'interpréteur python par défaut se lance avec la commande:
33 python
34 (14:03:06) davin.baragiotta: il vient avec le langage....
35 (14:03:14) davin.baragiotta: mais nous on va travailler avec ipython qui se lance avec la commande.... :
36 ipython
37 (14:03:21) davin.baragiotta: ipython permet une introspection plus aisée (on y reviendra)
38 (14:03:28) davin.baragiotta: lancez dans votre terminal ipython :
39 ipython
40 (14:03:50) davin.baragiotta: Quand on code en Python, on utilise l'interpréteur pour explorer interactivement le code.
41 (14:03:57) davin.baragiotta: Mais l'édition directement dans l'interpréteur peut être pénible.
42 (14:04:04) davin.baragiotta: C'est pourquoi nous mettons le "code qui marche" et éditons le code plus complexe dans un script.
43 (14:04:14) davin.baragiotta: C'est ce que nous ferons après. Explorons d'abord dans l'interpréteur.
44 (14:04:19) davin.baragiotta: PYTHON : QUELQUES BASES
45 (14:04:28) davin.baragiotta: Toute programmation repose sur des conventions syntaxiques... En Python, on a de la chance, la syntaxe est très simple et intuitive.
46 (14:04:37) davin.baragiotta: Les commentaires se font avec # :
47 # ceci est un commentaire
48 (14:04:44) davin.baragiotta: Les variables se déclarent sans $ devant ou autre fioriture.
49 (14:04:52) davin.baragiotta: Les instructions ne se terminent pas avec des ;
50 (14:05:00) davin.baragiotta: Les blocs de code ne sont pas structurés avec des { } mais par l'indentation.
51 (14:05:09) davin.baragiotta:
52 Les conventions pour le style de code en Python sont définies dans la PEP 8 (genre de norme) :
53 http://www.python.org/dev/peps/pep-0008/
54 (14:05:24) davin.baragiotta: PYTHON : QUELQUES BASES : LES TYPES
55 (14:05:34) davin.baragiotta: Voici les principaux types de base fournis avec le langage :
56 n = None # NoneType : type spécial voulant dire... rien
57 b = True # bool : booléen... True ou False n'oubliez pas les majuscules
58
59 i = 15 # int : entier
60 f = 15.5 # float : décimal
61
62 s = "chaine" # str : chaine de caractère, instancié avec "" ou ''
63 u = u"chaîne" # unicode : chaîne de caractère unicode, instancié avec u"" ou u''
64
65 l = [] # list : liste d'objets
66 t = () # tuple : liste immuable d'objets
67 d = {} # dict : dictionnaire de données
68 (14:06:10) davin.baragiotta: PYTHON : QUELQUES BASES : OBJETS ET NAMESPACES
69 (14:06:20) davin.baragiotta: En Python, tout est un "objet". Concrètement, ça veut dire que chaque "chose" qu'on manipule a:
70 * un nom
71 * des attributs (variables) accessibles "derrière"
72 * des méthodes (fonctions) accessibles "derrière"
73 (14:06:34) davin.baragiotta: Les attributs et méthodes ont des noms aussi.
74 (14:06:41) davin.baragiotta: Mais ils se trouvent dans l' "espace de nom" de l'objet.
75 (14:06:48) davin.baragiotta: Ils sont accessibles en utilisant un point pour séparer les noms :
76 objet.attribut
77 objet.methode()
78 (14:06:58) davin.baragiotta: On peut chaîner les noms avec les points :
79 objet.attribut.methode_attribut()
80 (14:07:07) davin.baragiotta: Assez la théorie. Codons.
81 (14:07:08) davin.baragiotta: :D
82 (14:07:15) davin.baragiotta: INTROSPECTION
83 (14:07:22) davin.baragiotta: Dans votre interpréteur déclarez une chaîne de caractères unicode :
84 prenom = u"Davin"
85 (14:07:42) davin.baragiotta: L'idée de l'introspection est de : voir en interrogeant l'objet ce qu'on peut faire avec
86 (14:07:51) davin.baragiotta: ipython nous offre une façon simple de regarder ça
87 (14:07:58) davin.baragiotta: après le nom de votre variable... tapez '.' puis 'tab'
88 prenom. [+ tab]
89 (14:08:10) davin.baragiotta: vous voyez tous les noms (attributs et méthodes) accessibles sur cet objet unicode
90 (14:08:17) davin.baragiotta: ('enter' pour voir plus, 'q' pour sortir de la liste)
91 (14:08:29) davin.baragiotta: tous les noms qui commencent avec __* sont des noms systèmes.
92 (14:08:38) davin.baragiotta: Le nom seul n'est parfois pas suffisant pour savoir quoi faire avec...
93 (14:08:46) davin.baragiotta: on va interroger l'interpréteur pour qu'il nous donne de l'info sur le nom
94 (14:08:59) davin.baragiotta: derrière n'importe quel nom, on peut mettre '?' et taper 'enter'
95 prenom.upper?
96 (14:09:12) davin.baragiotta: ooooouuah! la partie docstring est carrément la documentation de la méthode!
97 (14:09:14) davin.baragiotta: :D
98 (14:09:52) davin.baragiotta: si c'est la méthode qu'on veut
99 (14:09:52) davin.baragiotta: on l'exécute :
100 prenom.upper()
101 (14:10:10) davin.baragiotta: note : l'objet prenom n'en est pas modifié...
102 (14:10:14) davin.baragiotta: tapez :
103 prenom
104 (14:10:31) davin.baragiotta: Les fonctions built-in Python suivantes servent aussi à l'introspection :
105 type(objet) # retourne le type de l'objet
106 dir(objet) # retourne les noms derrière l'objet
107 help(objet) # retourne l'aide
108 callable(objet) # dit si un objet est appelable, exécutable...
109 isinstance(objet, Type) # teste le classe (ou type) d'un objet
110 ...
111 (14:10:46) davin.baragiotta: exemple :
112 type(prenom)
113 (14:11:19) davin.baragiotta: l'objet prenom est bien de type unicode car on l'a instancié avec u"" (un u devant)
114 (14:11:23) davin.baragiotta: Des questions?
115 (14:11:47) olivier.larcheveque: non pas de questions
116 (14:12:01) davin.baragiotta: ok cool
117 (14:12:30) davin.baragiotta: on peut jouer un peu dans l'interpréteur avant de regarder un script
118 (14:12:49) davin.baragiotta: nom = u"Baragiotta"
119 (14:12:53) davin.baragiotta: l = []
120 (14:12:59) davin.baragiotta: l. + tab
121 (14:13:15) davin.baragiotta: on utiliserait quoi pour ajouter notre nom et prenom à la liste vide?
122 (14:13:37) davin.baragiotta: l.append?
123 (14:13:45) davin.baragiotta: l.append(prenom)
124 (14:13:50) davin.baragiotta: l.append(nom)
125 (14:13:55) davin.baragiotta: tapez :
126 l
127 (14:14:18) davin.baragiotta: si vous voulez itérer : for
128 (14:14:33) davin.baragiotta: for item in liste :
129 print item.upper()
130 (14:14:37) davin.baragiotta: ach
131 (14:14:42) davin.baragiotta:
132 for item in liste :
133 print item.upper()
134 (14:15:11) davin.baragiotta: Questions?
135 (14:15:14) olivier.larcheveque: REMARQUE de JC sur l'encodage : attention au piège de la saisie Unicode dans iPython : prenom = u"Céline" ne marchera pas, ça vous donnera la chaîne Unicode u'C\xc3\xa9line', qui est incorrecte (c'est de l'UTF-8), au lieu de u'C\xe9line', qui est ce qu'on attendait ; pour obtenir le résultat correct en direct dans iPython il faut taper ceci : prenom = unicode("Céline", 'utf-8')
136 (14:15:44) olivier.larcheveque: autrement pas de questions
137 (14:16:04) davin.baragiotta: oui, pour les questions d'encodage, python est mieux... mais en codant ce qu'on a fait dans un script et en l'exécutant... on devrait pas avoir à passer par unicode()
138 (14:16:06) davin.baragiotta: okay
139 (14:16:17) davin.baragiotta: SCRIPTS
140 (14:16:19) olivier.larcheveque: les apprenants te font remarquer une erreur ;)
141 (14:16:23) davin.baragiotta: ah?
142 (14:16:36) olivier.larcheveque: c'est correct! ;)
143 (14:16:37) davin.baragiotta: mais vous mentez, c'est mal...
144 (14:16:40) davin.baragiotta: l = []
145 (14:16:41) davin.baragiotta: ;)
146 (14:16:48) davin.baragiotta:
147
148 (09:12:53) davin.baragiotta: l = []
149 (14:16:50) davin.baragiotta: :D
150 (14:17:24) davin.baragiotta: SCRIPTS
151 (14:17:28) davin.baragiotta: Comme on le disait, c'est pas top coder dans l'interpréteur. Alors on va faire un script.
152 (14:17:33) davin.baragiotta: il s'agit d'inclure du code dans un fichier et demander à l'interpréteur d'exécuter le code
153 (14:17:41) davin.baragiotta: ouvrez dans un éditeur le fichier script.py :
154 code/script.py
155 (14:17:49) davin.baragiotta: la première ligne s'appelle shebang
156 (14:17:55) davin.baragiotta: c'est pour dire au système que ce qui suit est du python
157 (14:18:03) davin.baragiotta: ligne 2 : dit que c'est encodé en UTF-8 : ça nous permet d'écrire avec caractères accentués (notamment texte et commentaires)
158 (14:18:13) davin.baragiotta: ligne 7 : un peu obscure, cette ligne se lit comme ça :
159 si le nom de ce script est __main__ (ce qui est son nom par défaut quand lancé dans un interpréteur) alors exécute ce qui suit
160 (14:18:25) davin.baragiotta: c'est là qu'on met les instructions du script pour les cas où on le lance avec un interpréteur
161 (14:18:47) davin.baragiotta: lançons le script avec ipython :
162 run script
163 ou
164 run script.py
165 (14:18:58) davin.baragiotta: (avec l'interpréteur normal ce serait juste : python script.py )
166 (14:19:33) davin.baragiotta: Voilà pour la partie théorique... il resterait beaucoup à dire
167 (14:19:39) davin.baragiotta: mais je vous laisse explorer par vous même
168 (14:19:45) davin.baragiotta: les if... par exemple...
169 (14:20:03) davin.baragiotta: on peut regarder rapidement la syntaxe de la fonction
170 (14:20:10) davin.baragiotta: ligne 4 de script.py
171 (14:20:33) davin.baragiotta: en fait ce qui est remarquable ici = pas d'accolades, pas de ;
172 (14:20:44) davin.baragiotta: une indentation de 4 esapces (pas de tabs dans vos scripts svp ;) )
173 (14:21:07) davin.baragiotta: on peut faire plein de trucs avec les types de bases... mais c'est facile à explorer
174 (14:21:18) davin.baragiotta: C'est la semaine tech, jouons maintenant! ;)
175 (14:21:25) davin.baragiotta: Regardons du code plus intense
176 (14:21:26) davin.baragiotta: ;)
177 (14:21:33) davin.baragiotta: MODULES : BOT JABBER
178 (14:21:44) davin.baragiotta: l'idée générale = créer un robot qui puisse être dans un salon jabber et interagir avec les users connectés
179 (14:21:56) davin.baragiotta: ah, des questions?
180 (14:23:09) davin.baragiotta: ouvrez et éditez le fichier bot/conf.py.edit et sauvegardez le dans :
181 bot/conf.py
182 (14:23:10) davin.baragiotta:
183 assurez-vous que :
184 CHATROOM = "test@reunion.auf.org"
185 (14:23:10) davin.baragiotta: si vous n'avez pas de username et de password pour votre bot :
186 (14:23:10) davin.baragiotta:
187 https://register.jabber.org/
188 (14:24:10) davin.baragiotta: tout le monde a créé un conf.py dans le répertoire bot?
189 (14:24:50) davin.baragiotta: vous pouvez vous rendre dans le salon test
190 (14:25:32) olivier.larcheveque: QUESTION: quel est l'intérêt de mettre un if __name__=='__main__' et de mettre son code au lieu de l'inclure une fois sans mettre cette ligne ?
191 REPONSE : on peut utiliser le fichier comme un module dans avoir à lancer le script
192 (14:25:40) olivier.larcheveque: ça permet d'importer des parties du script sans obligatoirement en exécuter le contenu
193 (14:26:25) davin.baragiotta: ok je vais lancer mon bot
194 (14:26:51) olivier.larcheveque: REMARQUE : davin.baragiotta n'a pas explicité comment on se rend dans le salon après avoir modifié la config
195 (14:27:04) davin.baragiotta: ok mon bot s'appelle barabotta et est présent dans le salon test
196 (14:27:09) davin.baragiotta: pour lancer votre bot :
197 (14:27:16) davin.baragiotta:
198 run bot/bot.py
199 (14:28:04) davin.baragiotta: donc maintenant, vous (comme user) devriez être dans le salon test (de la même façon que vous avez fait pour vous rendre ici) ;)
200 (14:28:07) davin.baragiotta: et votre bot aussi
201 (14:28:29) davin.baragiotta: cool, y'a plein de bot
202 (14:29:00) davin.baragiotta: ok je vais montrer des commandes du bot et on regardera le code qui l'exécute avant que vous le modifiez
203 (14:29:01) davin.baragiotta: :D
204 (14:31:29) davin.baragiotta: on a regardé quelques commandes du bot
205 (14:31:33) davin.baragiotta: regardons les sources
206 (14:31:50) davin.baragiotta: ouvrez dans un éditeur le fichier
207 bot/bot.py
208 (14:32:38) davin.baragiotta: en haut du fichier, on connait maintenant : shebang et encoding
209 (14:32:39) davin.baragiotta: cool
210 (14:32:45) davin.baragiotta: lignes 4 à 8
211 (14:32:50) davin.baragiotta: mesdames et messieurs...
212 (14:32:57) davin.baragiotta: c'est toute la puissance de Python devant vous
213 (14:33:07) davin.baragiotta: les import !!!!
214 (14:33:17) davin.baragiotta: le but du jeu, quand on code... c'est de ne pas réinventer la roue
215 (14:33:34) davin.baragiotta: pour ce faire, on importe le code qui règle déjà nos problèmes...
216 (14:33:41) davin.baragiotta: ligne 4
217 (14:33:51) davin.baragiotta: from datetime import datetime
218 (14:34:19) davin.baragiotta: ça veut dire que : du module (standard) datetime on veut importer le nom datetime
219 (14:34:40) davin.baragiotta: en gros : datetime.datetime
220 (14:34:56) davin.baragiotta: vous voulez en savoir plus sur ce module?
221 (14:35:07) davin.baragiotta:
222 voir la doc officielle :
223 http://docs.python.org/library/
224 (14:35:16) davin.baragiotta: cherchez datetime
225 (14:35:21) davin.baragiotta:
226 http://docs.python.org/library/datetime.html
227 (14:35:23) davin.baragiotta: lisez ;)
228 (14:35:44) davin.baragiotta: sinon, importez le module dans interpréteur et introspectez!!! :
229 import datetime
230 (14:35:51) davin.baragiotta: continuons
231 (14:36:08) davin.baragiotta: import re = import du module d'expressions régulière
232 (14:36:24) davin.baragiotta: en fait... tous les messages échangés nous arrivent comme des lignes de texte....
233 (14:36:47) davin.baragiotta: on veut pouvoir chercher des mots dans les lignes pour trouver les commandes données au bot!
234 (14:36:59) davin.baragiotta: re = regex = regular expression
235 (14:37:09) davin.baragiotta:
236 http://docs.python.org/library/re.html
237 (14:37:17) davin.baragiotta: un petit monde en soit au niveau de la syntaxe
238 (14:37:20) davin.baragiotta: on continue
239 (14:37:39) davin.baragiotta: après mes imports de la librairie standard
240 (14:37:59) davin.baragiotta: j'importe les modules particuliers installés dans mon système...
241 (14:38:22) davin.baragiotta: jabberbot est accessible car vous l'avez installé via un paquet Debian avant l'atelier
242 (14:38:33) davin.baragiotta: il est accessible par son nom de module python
243 (14:39:03) davin.baragiotta: y'a 2 façons d'importer :
244 from...
245 import
246 (14:39:25) davin.baragiotta: import re , par exemple, charge tout le module re
247 (14:39:53) davin.baragiotta: ils sont accessible dans le code en préfixant les objets du module par le nom du module
248 (14:39:58) davin.baragiotta: ex.: ligne 38
249 (14:40:08) davin.baragiotta: j'utilise compile de re en faisant re.compile
250 (14:40:13) davin.baragiotta: from :
251 (14:40:32) davin.baragiotta: charge seulement des noms spécifiques... accessibles directement
252 (14:40:52) davin.baragiotta: ex.: MUCJabberBot ligne 10
253 (14:40:55) davin.baragiotta: chargé à la ligne 8
254 (14:41:09) davin.baragiotta: ligne 8 : muc vient d'où?
255 (14:41:16) davin.baragiotta: il vient de *mon* module bot
256 (14:41:28) davin.baragiotta: le répertoire bot est lui même un module
257 (14:41:53) davin.baragiotta: on l'a pas installé sur notre système... mais il est accessible dans le contexte
258 (14:42:08) davin.baragiotta: pour importer des éléments d'un autre script
259 (14:42:16) davin.baragiotta: créez un module
260 (14:42:18) davin.baragiotta: comment ?
261 (14:42:31) davin.baragiotta: en mettant un fichier __init__.py dans un répertoire
262 (14:42:43) davin.baragiotta: grace à bot/__init__.py
263 (14:43:01) davin.baragiotta: on peut importer du contenu de ce répertoire
264 (14:43:06) davin.baragiotta: preuve
265 (14:43:20) davin.baragiotta: ligne 8 importe du fichier bot/muc.py
266 (14:43:25) davin.baragiotta: Des questions sur l'import?
267 (14:43:32) davin.baragiotta: après on personnalise votre bot
268 (14:43:50) davin.baragiotta: Questions?
269 (14:44:15) olivier.larcheveque: Non pas de questions
270 (14:44:40) olivier.larcheveque: (quelques petits soucis avec les versions de jabberbot)
271 (14:45:23) davin.baragiotta: ok puor ceux qui ont un bot qui marche, ont va le personnaliser
272 (14:45:58) davin.baragiotta: copiez la ligne 38 et collez dessous en ligne 39
273 (14:46:17) davin.baragiotta: modifiez le mot dans le "bière" dans le regex
274 (14:46:43) davin.baragiotta: exemple :
275
276 self.re_biere = re.compile(u'.*(?P<biere>bi[eè]re).*')
277 self.re_biere = re.compile(u'.*(?P<hourra>hourra).*')
278 (14:46:53) willy: QUESTION: que signifie exactement @botcmd ?
279 (14:46:58) davin.baragiotta: avec ça, un surveille le mot hourra dans les chaine
280 (14:47:07) davin.baragiotta: botcmd est un décorateur
281 (14:47:15) davin.baragiotta: une fonction qui s'exécute avant une fonction
282 (14:47:30) davin.baragiotta: mais globalement, ici, ça veut dire que la fonction qui suit
283 (14:47:34) davin.baragiotta: est une "commande du bot"
284 (14:47:48) davin.baragiotta: donc en tapant ce mot : la fonction codée s'exécute
285 (14:48:00) davin.baragiotta: il y a 2 approches pour l'interaction du bot :
286 (14:48:17) davin.baragiotta: une commande
287 ou
288 il cherche un mot par regex
289 (14:48:29) davin.baragiotta: ici on va personnaliser en mettant un mot dans regex
290 (14:48:47) davin.baragiotta: je continue mon exemple perso avec hourra (mettez ce que vous voulez pour vous)
291 (14:49:00) davin.baragiotta: donc on a ligne 39 cloné et modifié la ligne 38
292 (14:49:31) davin.baragiotta: ligne 50 et 51 : copier et coller dessous
293 (14:50:05) davin.baragiotta: ah zut... il faut modifier le nom d'attribut en ligne 39 aussi :
294 (14:50:14) davin.baragiotta: 38 et 39 :
295
296 self.re_biere = re.compile(u'.*(?P<biere>bi[eè]re).*')
297 self.re_hourra = re.compile(u'.*(?P<hourra>hourra).*')
298 (14:50:31) davin.baragiotta: 50 et 51 :
299 if self.re_biere.match(message):
300 self.biere(mess)
301 if self.re_hourra.match(message):
302 self.hourra(mess)
303
304 (14:50:57) davin.baragiotta: avec ça on vient de dire si le message match le pattern (regex) écrit dans self.re_hourra
305 (14:51:14) davin.baragiotta: alors on exécute la méthode (fonction) hourra...
306 (14:51:15) davin.baragiotta: mais elle n'existe pas encore : créons là
307 (14:51:35) davin.baragiotta: copipez-collez def biere au grand complet, jusqu'au return
308 (14:51:48) davin.baragiotta: et modifier tout pour personnaliser
309 (14:52:21) davin.baragiotta: en fait, faut juste modifier le nom de la méthode (derrière le def) et éditer la réponse
310 (14:52:22) davin.baragiotta: ex.:
311 (14:52:38) davin.baragiotta:
312
313 def biere(self, mess):
314 """Aux messages relatifs à la bière, choisit une de ses réponses prédéfinies"""
315 username = self.get_sender_username(mess)
316 if username != self.username and username != self.nickname:
317 response = 'St-Ambroise!'
318 self.send_simple_reply(mess, response)
319
320 def hourra(self, mess):
321 """Aux messages relatifs à la bière, choisit une de ses réponses prédéfinies"""
322 username = self.get_sender_username(mess)
323 if username != self.username and username != self.nickname:
324 response = 'Non... pas hourra.'
325 self.send_simple_reply(mess, response)
326 (14:52:57) davin.baragiotta: pour tester le nouveau comportement du bot :
327 (14:53:11) davin.baragiotta: fermer dans votre terminal le bot en core :
328 Ctrl + C
329 (14:53:13) davin.baragiotta: *en cours
330 (14:53:27) davin.baragiotta: et attendre qu'il sorte du salon test (peut être un peu long)
331 (14:53:42) davin.baragiotta: puis après relancer le bot :
332 run bot/bot.py
333 (14:55:29) davin.baragiotta: bon j'attends toujours la déconnexion de mon bot barabotta... :(
334 (14:56:34) olivier.larcheveque: (Il reste 5min si les gens ont des questions)
335 (14:56:36) progfou: reviens avec une autre "resource" pour ne pas perdre de temps...
336 (14:56:38) davin.baragiotta: vous pouvez personnaliser, évidemment, en modifiant seulement les lignes de réponse pour les méthodes biere et sieste
337 (14:58:43) davin.baragiotta: ok
338 (14:58:50) davin.baragiotta: vous pouvez essayez mon hourra ;)
339 (14:58:54) davin.baragiotta: questions?
340 MR 20110829T13:57:54Z 000 <davin.baragiotta> fermez les bots
341 MR 20110829T13:57:58Z 000 <davin.baragiotta> avec ctrl + c
342 MR 20110829T13:58:03Z 000 <davin.baragiotta> si boucle sans fin
343 MR 20110829T13:58:05Z 000 <davin.baragiotta> ;)
344 MR 20110829T13:58:44Z 000 <olivier.larcheveque> -----------------------FIN : ATELIER : programmation Python -----------------------
345 MI 20110829T14:00:17Z 002 willy has set the topic to: ☞ Le salon de la Semaine Tech ☜
346 Atelier "Django"
347 https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/Django
348 MR 20110829T14:03:21Z 000 <davin.baragiotta> petit interlude entre ateliers
349 MR 20110829T14:03:34Z 000 <davin.baragiotta> on a eu dans test... là où vivent encore nos bots
350 MR 20110829T14:03:37Z 000 <davin.baragiotta> un boucle sans fin
351 MR 20110829T14:04:12Z 000 <davin.baragiotta> ça arrive quand un bot réagit à un mot... et retourne ce même
352 MR 20110829T14:04:23Z 000 <davin.baragiotta> on peut éviter en vérifiant qu'on ne se répond pas à soit
353 MR 20110829T14:04:24Z 000 <davin.baragiotta> mais
354 MR 20110829T14:04:54Z 000 <davin.baragiotta> si un bot réagit à hourra et répondant hourra... et qu'un autre bot fait pareil : réagit à hourra en disant hourra
355 MR 20110829T14:05:14Z 000 <davin.baragiotta> même si chaque bot s'ignore soit même... ben...
356 MR 20110829T14:05:31Z 000 <davin.baragiotta> il répond à l'autre qui lui répond qui fait répodnre l'autre qui...
357 MR 20110829T14:05:36Z 000 <davin.baragiotta> un boucle *entre* les bot
358 MR 20110829T14:05:57Z 000 <davin.baragiotta> en gros... c'est en testant qu'on blinde son code ;)
359 MR 20110829T14:06:01Z 000 <davin.baragiotta> fin de l'interlude
360 MR 20110829T14:06:45Z 001 <davin.baragiotta> progfou faisant remarquer :
361 (10:06:13) progfou: et en fait même, plus généralement, qu'un bot ne devrait pas traiter des messages sans préfixe déterminé (son nom, un '!', ...)
362 MR 20110829T14:06:57Z 000 <davin.baragiotta> c'est une solution... mais ça enlève son côté humain ;)
363 MR 20110829T14:07:13Z 000 <progfou> ouaip, ça en fait un bot ;-)
364 MR 20110829T14:07:18Z 000 <davin.baragiotta> :D
365 MR 20110829T14:08:17Z 000 <progfou> Olivier, si tu es prêt n'attendons pas, ce n'est pas bon de s'éloigner des horaires (certaines personnes peuvent avoir prévu autre chose après, à l'heure pile, et d'autres auront envie de dormir, suivez mon regard...)
366 MR 20110829T14:08:54Z 000 <olivier.larcheveque> ok on y va
Jeudi
1 (13:10:26) davin.baragiotta: ---------- DÉBUT : Atelier : Programmation Python ----------------
2 (13:10:35) davin.baragiotta:
3 ### REMARQUE : cet atelier présente le même contenu que l'atelier de lundi dernier
4 ### Si vous avez participé lundi et souhaitez aller plus loin,
5 ### un exercice vous a été fourni par courriel sur : discussion-technique@auf.org
6 ### Sujet : [Semaine tech] Atelier : Programmation Python : EXERCICE
7 ###
8 ### Les liens vers les solutionnaires seront donnés ici, sous la forme :
9 ### EXERCICE : solution ...
10 (13:11:57) davin.baragiotta: INTRODUCTION
11 (13:12:02) davin.baragiotta: Bonjour à tous!
12 (13:12:08) davin.baragiotta:
13 La documentation complète de Python se trouve ici :
14 http://www.python.org/doc/
15 (13:12:17) davin.baragiotta:
16 Vous y trouverez notamment un tutoriel (que j'aurais aimé suivre mais c'est trop long) :
17 http://docs.python.org/tutorial/
18 (13:12:27) davin.baragiotta:
19 ... et aussi la documentation de la librarie (bibliothèque) standard venant avec le langage (on y reviendra) :
20 http://docs.python.org/library/
21 (13:12:38) davin.baragiotta: Aujourd'hui, on va programmer en Python.
22 (13:12:40) davin.baragiotta: :D
23 (13:12:47) davin.baragiotta: Dans cet atelier :
24 * on va coder dans l'interpréteur et explorer les bases du langage
25 * on va écrire un script qu'on fera exécuter par l'interpréteur
26 * on va explorer du vrai code et modifier celui-ci pour créer un bot jabber!!!!
27 (13:13:00) davin.baragiotta: ENVIRONNEMENT
28 (13:13:06) davin.baragiotta: Vous devriez avoir un éditeur texte sous la main, configuré comme demandé dans la page wiki.
29 (13:13:12) davin.baragiotta: Vous devriez avoir installé l'interpréteur ipython.
30 (13:13:22) davin.baragiotta:
31 Vous devriez avoir téléchargé l'archive code.tar.gz :
32 https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/ProgrammationPython?action=AttachFile&do=view&target=code.tar.gz
33 (13:13:28) davin.baragiotta: Ouvrez un terminal et déplacez vous dans le répertoire où vous avez extrait l'archive :
34 cd code/
35 (13:13:35) davin.baragiotta: C'est parti!
36 (13:13:41) davin.baragiotta: INTERPRÉTEUR
37 (13:13:49) davin.baragiotta: L'interpréteur python par défaut se lance avec la commande:
38 python
39 (13:13:56) davin.baragiotta: il vient avec le langage....
40 (13:14:01) davin.baragiotta: mais nous on va travailler avec ipython qui se lance avec la commande.... :
41 ipython
42 (13:14:06) davin.baragiotta: ipython permet une introspection plus aisée (on y reviendra)
43 (13:14:12) davin.baragiotta: lancez dans votre terminal ipython :
44 ipython
45 (13:14:18) davin.baragiotta: Quand on code en Python, on utilise l'interpréteur pour explorer interactivement le code.
46 (13:14:24) davin.baragiotta: Mais l'édition directement dans l'interpréteur peut être pénible.
47 (13:14:31) davin.baragiotta: C'est pourquoi nous mettons le "code qui marche" et éditons le code plus complexe dans un script.
48 (13:14:38) davin.baragiotta: C'est ce que nous ferons après. Explorons d'abord dans l'interpréteur.
49 (13:14:44) davin.baragiotta: PYTHON : QUELQUES BASES
50 (13:14:49) davin.baragiotta: Toute programmation repose sur des conventions syntaxiques... En Python, on a de la chance, la syntaxe est très simple et intuitive.
51 (13:14:56) davin.baragiotta: Les commentaires se font avec # :
52 # ceci est un commentaire
53 (13:15:01) davin.baragiotta: Les variables se déclarent sans $ devant ou autre fioriture.
54 (13:15:06) davin.baragiotta: Les instructions ne se terminent pas avec des ;
55 (13:15:11) davin.baragiotta: Les blocs de code ne sont pas structurés avec des { } mais par l'indentation.
56 (13:15:18) davin.baragiotta:
57 Les conventions pour le style de code en Python sont définies dans la PEP 8 (genre de norme) :
58 http://www.python.org/dev/peps/pep-0008/
59 (13:15:25) davin.baragiotta: PYTHON : QUELQUES BASES : LES TYPES
60 (13:15:33) davin.baragiotta: Voici les principaux types de base fournis avec le langage :
61 n = None # NoneType : type spécial voulant dire... rien
62 b = True # bool : booléen... True ou False n'oubliez pas les majuscules
63
64 i = 15 # int : entier
65 f = 15.5 # float : décimal
66
67 s = "chaine" # str : chaine de caractère, instancié avec "" ou ''
68 u = u"chaîne" # unicode : chaîne de caractère unicode, instancié avec u"" ou u''
69
70 l = [] # list : liste d'objets
71 t = () # tuple : liste immuable d'objets
72 d = {} # dict : dictionnaire de données
73 (13:16:02) davin.baragiotta: PYTHON : QUELQUES BASES : OBJETS ET NAMESPACES
74 (13:16:08) davin.baragiotta: En Python, tout est un "objet". Concrètement, ça veut dire que chaque "chose" qu'on manipule a:
75 * un nom
76 * des attributs (variables) accessibles "derrière"
77 * des méthodes (fonctions) accessibles "derrière"
78 (13:16:20) davin.baragiotta: Les attributs et méthodes ont des noms aussi.
79 (13:16:26) davin.baragiotta: Mais ils se trouvent dans l' "espace de nom" de l'objet.
80 (13:16:31) davin.baragiotta: Ils sont accessibles en utilisant un point pour séparer les noms :
81 objet.attribut
82 objet.methode()
83 (13:16:40) davin.baragiotta: On peut chaîner les noms avec les points :
84 objet.attribut.methode_attribut()
85 (13:16:47) davin.baragiotta: Assez la théorie. Codons.
86 (13:16:49) davin.baragiotta: :D
87 (13:16:56) davin.baragiotta: INTROSPECTION
88 (13:17:02) davin.baragiotta: Dans votre interpréteur déclarez une chaîne de caractères unicode :
89 prenom = u"Davin"
90 (13:17:13) davin.baragiotta: L'idée de l'introspection est de : interroger l'objet pour voir ce qu'on peut faire avec
91 (13:17:21) davin.baragiotta: ipython nous offre une façon simple de regarder ça
92 (13:17:28) davin.baragiotta: après le nom de votre variable... tapez '.' puis 'tab'
93 prenom. [+ tab]
94 (13:17:39) davin.baragiotta: vous voyez tous les noms (attributs et méthodes) accessibles sur cet objet unicode
95 (13:17:50) davin.baragiotta: ('enter' pour en voir plus, 'q' pour sortir de la liste)
96 (13:17:55) davin.baragiotta: tous les noms qui commencent avec __* sont des noms systèmes.
97 (13:18:02) davin.baragiotta: Le nom seul n'est parfois pas suffisant pour savoir quoi faire avec...
98 (13:18:10) davin.baragiotta: on va interroger l'interpréteur pour qu'il nous donne de l'info sur le nom
99 (13:18:16) davin.baragiotta: derrière n'importe quel nom, on peut mettre '?' et taper 'enter'
100 prenom.upper?
101 (13:18:23) davin.baragiotta: ooooouuah! la partie docstring est carrément la documentation de la méthode!
102 (13:18:25) davin.baragiotta: :D
103 (13:18:34) davin.baragiotta: si on a trouvé la méthode qu'on voulait, on peut la tester :
104 prenom.upper()
105 (13:18:42) davin.baragiotta: note : l'objet prenom n'en est pas modifié... pour preuve, tapez :
106 prenom
107 (13:18:53) davin.baragiotta: Les fonctions built-in Python suivantes servent aussi à l'introspection :
108 type(objet) # retourne le type de l'objet
109 dir(objet) # retourne les noms derrière l'objet
110 help(objet) # retourne l'aide
111 callable(objet) # dit si un objet est appelable, exécutable...
112 isinstance(objet, Type) # teste le classe (ou type) d'un objet
113 ...
114 (13:19:07) davin.baragiotta: Des questions?
115 (13:19:27) olivier.larcheveque: Non tu peux continuer
116 (13:19:38) davin.baragiotta: okay!
117 (13:19:42) davin.baragiotta: PYTHON : QUELQUES BASES : APPELER UNE MÉTHODE
118 (13:19:55) davin.baragiotta: Jouons un peu dans l'interpréteur avant de regarder un script
119 nom = u"Baragiotta" # on créer une autre variable unicode
120 l = [] # on crée une liste vide
121 l. + tab # on introspecte la liste vide...
122 (13:20:05) davin.baragiotta: on utiliserait quoi pour ajouter notre nom et prenom à la liste vide?
123 (13:20:16) davin.baragiotta: l.append?
124 (13:20:31) davin.baragiotta:
125 l.append(prenom)
126 l.append(nom)
127 (13:20:38) davin.baragiotta: tapez :
128 l
129 (13:20:51) davin.baragiotta: Questions?
130 (13:21:03) olivier.larcheveque: toujours pas c'est bon
131 (13:21:05) davin.baragiotta: PYTHON : QUELQUES BASES : ITÉRATION
132 (13:21:11) davin.baragiotta: Si vous voulez itérer, une structure de langage fort simple : for
133 (13:21:31) davin.baragiotta: Exemple :
134 for item in l:
135 print item.upper()
136 (13:21:42) davin.baragiotta: remarquez l'indentation de 4 espaces : pas de { } autour des instructions.
137 (13:21:50) davin.baragiotta: pas de tabs dans vos scripts svp, on indente avec esapces : voir PEP 8 ;)
138 (13:22:07) davin.baragiotta: Des questions?
139 (13:22:12) olivier.larcheveque:
140 QUESTION: PKOI mettre u"string", a quoi sert le 'u'
141 (13:22:28) davin.baragiotta: il existe 3 types de chaines de caractères en Python
142 (13:22:34) davin.baragiotta: string, unicode et raw
143 (13:22:50) davin.baragiotta: elles se déclarent différemment avec :
144 ''
145 u''
146 r''
147 respectivement
148 (13:23:06) davin.baragiotta: u'' = chaîne unicode, permet donc les caractères accentués
149 (13:23:12) davin.baragiotta: sinon, '' = ascii
150 (13:23:17) davin.baragiotta: on continue?
151 (13:23:24) olivier.larcheveque: oui
152 (13:23:28) davin.baragiotta: SCRIPTS
153 (13:23:33) davin.baragiotta: Comme on le disait, c'est pas top coder dans l'interpréteur. Alors on va faire un script.
154 (13:23:41) davin.baragiotta: il s'agit d'inclure du code dans un fichier et demander à l'interpréteur d'exécuter le code
155 (13:23:47) davin.baragiotta: ouvrez dans un éditeur le fichier script.py :
156 code/script.py
157 (13:23:58) davin.baragiotta: la première ligne s'appelle shebang
158 (13:24:02) davin.baragiotta: c'est pour dire au système que ce qui suit est du python
159 (13:24:08) davin.baragiotta: ligne 2 : dit que c'est encodé en UTF-8 : ça nous permet d'écrire avec caractères accentués (notamment texte et commentaires)
160 (13:24:21) davin.baragiotta: ligne 7 : un peu obscure, cette ligne se lit comme ça :
161 si le nom de ce script est __main__ (ce qui est son nom par défaut quand lancé dans un interpréteur) alors exécute ce qui suit
162 (13:24:38) davin.baragiotta: c'est là qu'on met les instructions du script pour les cas où on le lance avec un interpréteur
163 (13:24:45) davin.baragiotta: lançons le script avec ipython :
164 run script
165 ou
166 run script.py
167 (13:24:56) davin.baragiotta: avec l'interpréteur normal ce serait juste :
168 python script.py
169 (13:25:04) davin.baragiotta: Questions?
170 (13:25:14) olivier.larcheveque: non
171 (13:25:15) davin.baragiotta: PYTHON : QUELQUES BASES : FONCTIONS
172 (13:25:23) progfou: si tu me permets un détour (rapide) sur les accents
173 (13:25:23) davin.baragiotta: Les fonctions sont du code qui reçoivent des paramètres.... et retournent un résultat
174 (13:25:31) davin.baragiotta: progfou : je t'en prie
175 (13:25:54) progfou: juste pour dire que la différence entre '' (str) et u'' (unicode) n'est pas le fait de pouvoir gérer les accents
176 (13:26:20) progfou: la différence est que '' (str) va gérer des octets, alors que u'' (unicode) va gérer des caractères
177 (13:26:25) progfou: un exemple pour finir :
178 (13:27:16) progfou: si vous faites 'andré'.upper(), ça va vous donner n'importe quoi, car l'octet 'é' ne sera pas considéré comme le caractère 'é' mais comme une suite de 2 octets UTF-8
179 (13:27:30) progfou: tandis que u'andré'.upper() donnera bien u'ANDRÉ'
180 (13:27:30) progfou: fini
181 (13:27:43) davin.baragiotta: merci progfou pour ces précisions
182 (13:27:50) davin.baragiotta: nous continuons avec les fonctions
183 (13:27:57) davin.baragiotta: Une fonction est définie ici à la ligne 4 de script.py
184 * def : pour déclarer une fonction ou une méthode (une méthode étant une fonction déclaré dans une classe)
185 * les instructions de la fonction sont indentées : une indentation de 4 espaces
186 * en fait ce qui est remarquable ici = pas d'accolades, pas de ;
187 (13:28:18) davin.baragiotta: Voilà pour la partie théorique... il resterait beaucoup à dire
188 (13:28:23) davin.baragiotta: mais les fonctionnalités Python sont faciles à explorer
189 (13:28:30) davin.baragiotta: je vous laisse donc explorer par vous même :
190 * avec la doc officielle
191 * interactivement dans ipython
192 (13:28:40) davin.baragiotta: C'est la semaine tech, jouons maintenant! ;)
193 (13:28:48) davin.baragiotta:
194 ### EXERCICE : solution pour le script intermédiaire :
195 http://paste.pocoo.org/show/467931/
196 (13:29:19) davin.baragiotta: okay!
197 (13:29:20) davin.baragiotta: MODULES : BOT JABBER : DEMO
198 (13:29:27) davin.baragiotta: l'idée générale = créer un robot qui puisse être dans un salon jabber et interagir avec les users connectés
199 (13:29:35) davin.baragiotta: ouvrez et éditez le fichier bot/conf.py.edit et sauvegardez le dans :
200 bot/conf.py
201 (13:29:51) davin.baragiotta:
202 assurez-vous que :
203 CHATROOM = "test@reunion.auf.org"
204 (13:29:58) davin.baragiotta:
205 si vous n'avez pas de username et de password pour votre bot :
206 https://register.jabber.org/
207 (13:30:09) davin.baragiotta: tout le monde a créé un conf.py dans le répertoire bot?
208 (13:30:46) davin.baragiotta: connectez vous (votre user normal humain, ex.: davin.baragiotta) au salon test de reunion.auf.org
209 (comme vous avez fait pour vous connecter à ce salon-ci ;) )
210 (13:30:58) davin.baragiotta: je vais lancer mon bot qui se nomme 'barabotta', il va rejoindre le salon test
211 (13:31:28) davin.baragiotta: je vous recommande de lancer votre bot avec l'interpréteur python normal :
212 cd code/
213 python bot/bot.py
214 (13:31:34) davin.baragiotta: sinon avec ipython, c'est :
215 run bot/bot.py
216 (13:31:40) davin.baragiotta: je vais montrer des commandes du bot et on regardera le code qui l'exécute avant que vous le modifiez
217 (13:33:39) davin.baragiotta: on a regardé quelques commandes du bot
218 (13:33:45) davin.baragiotta: regardons les sources
219 (13:33:52) davin.baragiotta: MODULES : BOT JABBER : SOURCES
220 (13:33:59) davin.baragiotta: ouvrez dans un éditeur le fichier
221 bot/bot.py
222 (13:34:07) davin.baragiotta: en haut du fichier, on connait maintenant : shebang et encoding
223 (13:34:12) davin.baragiotta: lignes 4 à 8
224 (13:34:16) davin.baragiotta: mesdames et messieurs...
225 (13:34:21) davin.baragiotta: c'est toute la puissance de Python devant vous
226 (13:34:25) davin.baragiotta: les import !!!!
227 (13:34:30) davin.baragiotta: :D
228 (13:34:35) davin.baragiotta: PYTHON : QUELQUES BASES : IMPORTS
229 (13:34:45) davin.baragiotta: le but du jeu, quand on code... c'est de ne pas réinventer la roue
230 (13:34:51) davin.baragiotta: pour ce faire, on importe le code qui règle déjà nos problèmes...
231 (13:35:05) davin.baragiotta: ligne 4
232 from datetime import datetime
233 (13:35:10) davin.baragiotta: ça se lit comme suit :
234 du module (standard) datetime on veut importer le nom datetime
235 (13:35:15) davin.baragiotta: en gros, rend accessible dans le code : datetime.datetime
236 (13:35:23) davin.baragiotta:
237 vous voulez en savoir plus sur ce module?
238 voir la doc officielle :
239 http://docs.python.org/library/
240 (13:35:33) davin.baragiotta:
241 cherchez datetime :
242 http://docs.python.org/library/datetime.html
243 (13:35:39) davin.baragiotta: lisez ;)
244 (13:35:46) davin.baragiotta: sinon, importez le module dans interpréteur et introspectez!!! :
245 import datetime
246 datetime. [+ tab]
247 datetime.datetime? [+ tab]
248 (13:36:04) davin.baragiotta: continuons
249 (13:36:12) davin.baragiotta: import re = import du module d'expressions régulières
250 (13:36:18) davin.baragiotta: en fait... tous les messages échangés via jabber nous arrivent comme des lignes de texte....
251 (13:36:24) davin.baragiotta: on veut pouvoir chercher des mots dans les lignes pour trouver les commandes données au bot!
252 (13:36:33) davin.baragiotta:
253
254 re = regex = regular expression
255 http://docs.python.org/library/re.html
256 (13:36:41) davin.baragiotta: (regex = un petit monde en soit au niveau de la syntaxe)
257 (13:36:51) davin.baragiotta: on continue
258 (13:36:57) davin.baragiotta: après mes imports de la librairie standard
259 (13:37:01) davin.baragiotta: j'importe les modules particuliers installés sur mon système...
260 (13:37:16) davin.baragiotta: jabberbot est accessible car vous l'avez installé via un paquet Debian avant l'atelier
261 (13:37:17) davin.baragiotta: il est accessible par son nom de module python
262 (13:37:21) davin.baragiotta: il y a 2 façons d'importer :
263 from ...
264 import ...
265 (13:37:37) davin.baragiotta: PYTHON : QUELQUES BASES : IMPORTS : IMPORT
266 (13:37:57) davin.baragiotta: import re , par exemple, charge tout le module re
267 (13:38:06) davin.baragiotta: les objets du modules sont accessibles dans le code en les préfixant par le nom du module
268 (13:38:12) davin.baragiotta: ex.: ligne 38 j'utilise compile de re en codant :
269 re.compile
270 (13:38:28) davin.baragiotta: PYTHON : QUELQUES BASES : IMPORTS : FROM
271 (13:38:33) davin.baragiotta: from charge seulement des noms spécifiques... accessibles directement, sans préfixer
272 (13:38:42) davin.baragiotta: ex.: ligne 10 j'utilise MUCJabberBot de muc en codant :
273 MUCJabberBot
274 (n'est pas préfixée par muc : muc.MUCJabberBot)
275 (13:38:55) davin.baragiotta: PYTHON : QUELQUES BASES : MODULES
276 (13:39:00) davin.baragiotta: ligne 8 : j'importe MUCJabberBot de muc... mais on n'a pas installé muc sur notre système...
277 (13:39:07) davin.baragiotta: ... mais il est accessible dans le contexte (puisqu'on l'importe) : muc vient d'où?
278 (13:39:15) davin.baragiotta: il vient de *notre* module bot
279 (13:39:21) davin.baragiotta: c'est que le répertoire bot est en soi un module python
280 (13:39:31) davin.baragiotta: comment créer un module?
281 (13:39:39) davin.baragiotta: tout simplement en ajoutant un fichier (vide) nommé __init__.py dans un répertoire
282 (13:39:49) davin.baragiotta: grâce à bot/__init__.py, on peut importer du contenu d'un fichier .py (de ce répertoire) dans un autre fichier .py
283 (13:39:56) davin.baragiotta: preuve :
284 bot.py import à la ligne 8 MUCJabberBot en provenant de
285 muc.py
286 (13:40:09) davin.baragiotta: Des questions?
287 (13:40:41) olivier.larcheveque:
288 QUESTION: quel lien pour tester notre compte de jabber? (J'ai su oublié mon mot de passe)
289 (13:40:57) davin.baragiotta:
290 https://register.jabber.org/
291 (13:41:04) davin.baragiotta: je crois on peut modifier mdp ;)
292 (13:41:12) davin.baragiotta: pas sûr
293 (13:41:17) olivier.larcheveque:
294 ok pas d'autres questions autrement
295 (13:41:25) davin.baragiotta: Codons, codons, codons
296 (13:41:27) davin.baragiotta: MODULES : BOT JABBER : PERSONNALISER SON BOT PAR UNE SIMPLE MODIF
297 (13:41:34) davin.baragiotta: Pour ceux qui ont un bot qui marche, on va le personnaliser
298 (13:41:41) davin.baragiotta: il y a 2 approches pour l'interaction du bot :
299 * une commande
300 * une recherche de mot-clé par regex
301 (13:41:48) davin.baragiotta: on va commencer par personnaliser en mettant un mot dans regex
302 (13:41:56) davin.baragiotta: copiez la ligne 38 et collez la dessous, en ligne 39
303 (13:42:04) davin.baragiotta: modifiez la ligne 39 :
304 * le nom de l'attribut de self : ex.: par self.re_hourra
305 * la chaîne de caractère dans le regex : ex.: par u'.*(?P<hourra>hourra).*'
306 (13:42:17) davin.baragiotta: exemple :
307 self.re_biere = re.compile(u'.*(?P<biere>bi[eè]re).*')
308 self.re_hourra = re.compile(u'.*(?P<hourra>hourra).*')
309 (13:42:25) davin.baragiotta: avec ça, on le patron regex pour trouver le mot hourra dans une chaine de caractères
310 (13:42:44) davin.baragiotta: ensuite
311 (13:42:47) davin.baragiotta: ligne 50 et 51 : copiez et collez dessous
312 (13:42:52) davin.baragiotta: modifiez les lignes 52 et 53 :
313 * en remplaçant 'biere' par 'hourra'
314 (13:42:59) davin.baragiotta: exemple :
315 if self.re_biere.match(message):
316 self.biere(mess)
317 if self.re_hourra.match(message):
318 self.hourra(mess)
319 (13:43:09) davin.baragiotta: avec ça on vient de dire :
320 si le message matche le pattern (regex) écrit dans self.re_hourra
321 alors on exécute la méthode (fonction) hourra sur self (le bot lui-même)...
322 (13:43:21) davin.baragiotta: mais on n'a pas encore déclaré la méthode self.hourra() : créons la
323 (13:43:32) davin.baragiotta: copiez def biere au grand complet (lignes 84 à 89)...
324 ... et collez le code dessous
325 (13:43:42) davin.baragiotta: on modifie :
326 * le nom de la méthode définie
327 * la réponse retournée par cette méthode du bot
328 (13:43:51) davin.baragiotta: exemple :
329 def biere(self, mess):
330 """Aux messages relatifs à la bière, choisit une de ses réponses prédéfinies"""
331 username = self.get_sender_username(mess)
332 if username != self.username and username != self.nickname:
333 response = 'St-Ambroise!'
334 self.send_simple_reply(mess, response)
335
336 def hourra(self, mess):
337 """Aux messages relatifs à la bière, choisit une de ses réponses prédéfinies"""
338 username = self.get_sender_username(mess)
339 if username != self.username and username != self.nickname:
340 response = 'Non... je ne suis pas de bonne humeur.'
341 self.send_simple_reply(mess, response)
342 (13:44:07) davin.baragiotta: on vient de rendre sensible notre bot au mot 'hourra' où qu'il soit dans un message...
343 ... afin qu'il réponde :
344 'Non... je ne suis pas de bonne humeur.'
345 (13:44:22) davin.baragiotta: Pour tester le nouveau comportement du bot :
346 * fermer dans votre terminal le bot en cours : Ctrl + C
347 * si il traine dans le salon trop longtemps encore, dans le salon : /kick monbot
348 * relancer le bot :
349 python bot/bot.py
350 (13:46:16) davin.baragiotta: on est dans le salon test à tester nos bots modifiés
351 (13:47:20) davin.baragiotta: ok on continue
352 (13:47:30) davin.baragiotta: MODULES : BOT JABBER : PIMPER SON BOT PAR L'AJOUT DE COMMANDE
353 (13:47:39) davin.baragiotta:
354 ### EXERCICE : solution pour la commande finale du bot :
355 http://paste.pocoo.org/show/467932/
356 (13:48:09) davin.baragiotta: L'autre approche pour l'interaction est la commande.
357 (13:48:15) davin.baragiotta: Les commandes sont des méthodes "décorées" par le décorateur : @botcmd
358 (13:48:23) davin.baragiotta: Un décorateur est une fonction qui s'exécute avant une fonction.
359 (13:48:30) davin.baragiotta: Pour utiliser une commande, tapez simplement son nom dans le salon, suivi des paramètres qu'elle accepte.
360 (13:48:44) davin.baragiotta: Exemple, comme vu dans la démo avec :
361 redmine #123
362 (13:48:52) davin.baragiotta: Pour que seul votre bot réponde, vous pouvez préfixer le tout de son nom :
363 barabotta redmine #123
364 (13:49:00) davin.baragiotta: Pour créer votre propre commande...
365 * copiez la commande sieste : lignes 61 à 64... n'oubliez pas le décorateur
366 * collez le code dessous
367 * modifiez le nom de la commande
368 * modifiez le contenu de la réponse : variable 'reply'
369 (13:49:17) davin.baragiotta: Tester la commande dans le salon
370 * fermer dans votre terminal le bot en cours : Ctrl + C
371 * si il traine dans le salon trop longtemps encore, dans le salon : /kick monbot
372 * relancer le bot :
373 python bot/bot.py
374 (13:49:35) davin.baragiotta: Des questions?
375 (13:49:47) olivier.larcheveque:
376 non
377 (13:50:41) davin.baragiotta: ok, j'ai terminé
378 (13:50:57) davin.baragiotta: on pourrait parler des boucles sans fin de lundi
379 (13:51:11) davin.baragiotta: barabotta est encore "armé" pour faire une boucle sans fin ;)
380 (13:51:37) davin.baragiotta: mais il manque un peu d'activité dans le salon test : c'est plein d'humains et peu de bot ;)
381 (14:00:14) davin.baragiotta: maitenant, c'est plein de vie
382 (14:00:16) davin.baragiotta: :D
383 (14:00:32) davin.baragiotta: ---------- FIN : Atelier : Programmation Python ----------------