À la fin d’une section précédente, je vous ai menti. J’ai écrit que le code suivant permettait de réparer Reeborg:
class RobotRéparé(RobotUsage):
def tourne_a_droite(self):
for _ in range(3):
self.tourne_a_gauche()
Ce n’est pas vrai. Reeborg n’est pas réparé: il a encore besoin de faire trois virages à gauche et ne peut pas virer directement vers sa droite. Pour véritablement le réparer, nous allons avoir besoin d’examiner le code secret qui permet à Reeborg de fonctionner. Ceci va prend un peu de temps, mais ça va valoir la peine. En cours de route, on va en apprendre davantage sur Python ... et nous apprendrons des rudiments de code Javascript!
Exécutez le programme suivant:
reeborg = RobotUsage()
print(dir(reeborg))
dir est une fonction Python qui permet d’obtenir une liste des attributs d’un objet ainsi que de ses méthodes. Le résultat de l’exécution du programme du programme peut sembler intimidant; voici ce que j’observe dans le journal de Reeborg lorsque j’exécute ce programme:
['__bases__', '__class__', '__delattr__', '__dict__' ...
On ne sais pas à ce moment-ci si ces noms représentes des méthodes ou des attributs. __bases__, comme plusieurs autres noms, débute et termine avec deux caractères de soulignement: il s’agit d’une convention en Python pour dénoter des commandes internes à Python qui sont principalement réservées pour des programmeurs avancés. Pour mieux voir ce qui se passe, nous allons imprimer un seul nom d’attribut par ligne, en omettant ceux qui commencent avec deux caractères de soulignement. Pour ce faire, nous allons utiliser la méthode starts with des chaînes (startswith pouvant être traduit par commence avec) comme ceci:
reeborg = RobotUsage()
for attr in dir(reeborg):
if not attr.startswith("__"):
print(attr)
Assurez-vous d’exécuter ce code et de comparer avec le résultat que je vois:
au_but
avance
body
construit_un_mur
couleur_de_trace
depose
est_face_au_nord
modèle
mur_a_droite
mur_devant
objet_ici
prend
rien_a_droite
rien_devant
style_de_trace
tourne_a_gauche
transporte
On retrouve le nom de plusieurs méthodes qu’on a vu auparavant ... mais il y a un mot anglais, body, signifiant “corps”, qui est définitivement nouveau. Exécutons donc le programme suivant pour voir si reeborg.body a d’autres attributs:
reeborg = RobotUsage()
for attr in dir(reeborg.body):
print(attr)
Note
Les programmeurs Python utilisent souvent une convention où les noms de variables qui débutent avec un simple caractère de soulignement, comme _prev_x, indiquent que ces variables sont “privées” et ne devraient normalement pas être changées par un autre programmeur.
Vous devriez voir quelque chose qui ressemble à ceci, sans les commentaires que j’ai rajoutés et qui donnent un guide de traduction française:
_is_leaky # "a une fuite"
_prev_orientation # prev == previous,
# signifiant précédent
_prev_x
_prev_y
objects # objets
orientation
x
y
Vous avez déjà vu des rétroactions du genre Reeborg est à la bonne coordonnée x et la même chose pour y; ceci suggère que x et y font probablement référence à la position de Reeborg. En tant que programmeur, vous devriez avoir le réflexe d’écrire immédiatement un programme pour vérifier
Faites ceci!
Avec le monde Vide, exécutez le programme suivant:
pas_de_surlignement() # voir note
sauteur = RobotUsage()
sauteur.body.x = 8
sauteur.body.y = 10
Note
J’ai inclus une fonction pour annuler le surlignement des lignes de code pendant l’exécution,
autrement le résultat souhaité ne serait pas observé. J’expliquerai par la suite pourquoi le résultat obtenu est différent si on n’annule pas le surlignement des lignes de code.
Le résultat que vous devriez voir est simplement un robot créé aux coordonnées x=1, y=1 ... ce qui n’est probablement pas ce à quoi vous vous attendiez ....
Faites ceci!
Ajoutez l’instruction suivante:
sauteur.tourne_a_gauche()
à la fin de votre programme, et exécutez-le à nouveau.
Lorsqu’un programme est exécuté dans le monde de Reeborg, il est enregistré secrètement en coulisses, puis le résultat est démontré comme une animation dans un film. Ceci se fait en deux étapes:
Les instructions
sauteur.body.x = 8
sauteur.body.y = 10
ne sont pas des instructions identifiées comme étant des instructions qui doivent faire en sorte qu’il y ait un enregistrement de l’état du monde. Par contre, l’instruction sauteur.tourne_a_gauche est reconnue et fait en sorte que l’état du monde soit enregistré.
Note
L’effet du surlignement de code
Avant que votre programme ne soit exécuté, si le surlignement de code est activé, votre programme est modifié pour faire en sorte que chaque ligne qui apparait dans l’éditeur soit accompagnée par une autre ligne de code qui note le numéro de la ligne de code à exécuter et fait un enregistrement de l’état du monde.
Ce qu’on aimerait savoir est comment faire en sorte qu’on enregistre l’état du monde lorsqu’on utilise une instruction non-reconnue par Reeborg comme étant une instruction qui change l’état du monde. Pour ce faire, nous allons devoir examiner le code Javascript utilisé par le Monde de Reeborg.
Puisque nous allons examiner du code Javascript, et que vous lisez ce tutoriel presque certainement parce que vous êtes un débutant en programmation et que Python est votre tout premier langage, vous vous demandez peut-être si vous avez fait erreur en choisissant Python plutôt que Javascript...
Ne vous inquiétez pas, vous aviez fait le bon choix.
Vous avez déjà appris qu’il existe des bibliothèques qui peuvent être utilisées dans vos programmes. Pour ceux qui font des calculs numériques, les bibliothèques qu’ils utilisent sont souvent écrites dans le langage Fortran. En fait, plusieurs programmeurs Python utilisent de telles bibliothèques.
Pour le web, le langage de choix est habituellement Javascript. Puisque le Monde de Reeborg vit sur le web, il n’est pas étonnant qu’une grande partie de son code soit écrit en Javascript.
La prochaine section débutera avec une brève comparaison entre Python et Javascript, ce qui devrait être assez pour vous permettre de déchiffrer et comprendre le code Javascript que vous verrez.