Comment se protéger de la faille input()
Vous vous souvenez peut-être quand, plus en haut, il a été dit que le fait qu’il n’y est qu’une fonction pour les strings en python 3 n’est pas un problème. Le code qui va suivre est fonctionnel aussi bien en Python 3 qu’en Python 2.
Voilà comment faire un cast d’un string pour en faire un entier le tout avec une gestion des erreurs :
If x.isdigit() :x=int(x)
Pour ceux qui ne connaissaient pas la méthode isdigit, je vais vous expliquer son fonctionnement.
Pour commencer : le bon réflexe. On tape:
>>> help(x.isdigit) Help on built-in function isdigit: isdigit(...) method of builtins.str instance S.isdigit() -> bool Return True if all characters in S are digits and there is at least one character in S, False otherwise.
On apprend alors que c’est une méthode d’une instance de la classe str (builtins.str) (l’instance étant notre variable x). On nous dit ensuite qu’une valeur booléenne (True ou False) sera retournée : True si tous les caractères de la chaine de caractère sont des nombres et sinon False.
Si jamais vous avez besoin de la fonction input de Python 2, souvenez de ce que nous avons vu plus haut et utilisez plutôt cette fonction :
def IntInput(prompt="" ) : answer=raw_input(prompt) if answer.isdigit(): answer= int(answer) else: raise ValueError ( "l'utilisateur n'a pas ecrit que des chiffres" ) return answer
ou alors encore :
def IntInput(prompt="" ) : answer=raw_input(prompt) try: answer=int(answer) except ValueError: answer= None return answer