Python, syntaxe et lecture rapide
Par Sébastien Pierre, jeudi 29 juin 2006 à 13:34 :: General :: #27 :: rss
Je ne sais pas si vous êtes capables d'écrire un code qui marche du premier coup, ou bien de trouver rapidement les causes d'erreurs dans votre code ou celui d'un autre. Il y a quelques jours, Nigel de XPrima m'a montré un des tests qu'il a fait passer à certains candidats au poste de développeur Python. Au delà du test lui-même, il est vraiment intéressant (et surprenant !) de la mener à bien soi-même, afin de voir à quel point il est facile de se faire "prendre au piège"... une bonne occasion de remarquer quand la syntaxe peut nous induire en erreur...
Alors voilà pour commencer le code source d'un "hello world" plutôt mal écrit :
""" very buggy hello world program ... please fix anything you see that looks "wrong" ""
//initialization str = None var = None
def setvar(val):
""" Sets the global variable "var" to the value in 'val' """
if val:
print "setting variable 'var' to '$val'" // we want to print the value of 'val'
else:
print "un-setting variable 'var'"
var = val return
if name == 'main':
try:
setvar(" hello world! ") // use this function to set the 'var' variable
var.strip() // we want the leading and trailing spaces removed
print str(var)
except:
print "something went wrong"
Je vous laisse lire le code, et lancer votre interpréteur Python favori pour voir de quoi il en retourne. Pour ma part, je vais en venir au point qui m'intéresse : la possibilité de se faire "prendre au piège" par la syntaxe...
- Une indentation peu contrastée (1 espace pour signaler une indentation) est quelque chose de difficile à voir, même en regardant en détail. Dans un langage comme Python, où les blocs sont définis par indentation, il est donc mieux de bien marquer les différents niveaux d'indentation, ou idéalement, d'utiliser des tabulations (qui peuvent être affichées dans la plupart des éditeurs).
- Un portée de variable non explicite, lorsque le nom de la variable ne permet pas de savoir si elle est globale ou locale. On aura tendance à écrire une variable globale en MAJUSCULE, et les variables locales en minuscules. Ruby évite ce problème en imposant un préfixe (@, $, etc) à chaque variable en fonction de son origine / de sa portée. Python ne propose rien de particulier, si ce n'est des conventions de nommage et l'utilisation obligatoire de
selfdevant les attributs d'instance, ce qui permet de les désambiguer des variables locales.
- L'utilisation de littéraux pour des valeurs-clés, comme c'est le cas pour le
"main"qui devrait être"_ _main_ _". Ici, il est facile de faire un erreur en tapant le littéral, qui devrait plutôt être une variable (comme "main" plutôt que la chaîne "main")
On pourra également noter un point qui peut être important :
- Python ne fait pas la différence entre déclaration et assignation, ce qui signifie que si l'on fait
pouet=1puispuoet=2, nous aurons deux variables, et nous ne remarquerons pas la faute de frappe. Ceci peut être néanmoins trouvé aisément à l'aide de programmes tels que Pychecker.
bref... voilà un petit exemple bien intéressant qui nous montre qu'il est très facile de "se faire mordre" en lisant du code. La syntaxe et la sémantique peuvent clairement aider à repérer ce genre de problèmes au plus tôt. Peut-être faudrait-il concevoir les langages en essayant d'écrire le code le plus "foireux" possible ? Je pense en tout cas que ca ne pourrait pas faire de mal 
Commentaires
1. Le vendredi 30 juin 2006 à 15:30, par zoe
2. Le vendredi 20 octobre 2006 à 03:08, par Damien
Ajouter un commentaire