Je suis actuellement en train d'apprendre le python (et dieu sait que je m'amuse :D) sur le tutoriel approprié. Et, pour mieux le faire rentrer, je tente d'améliorer le "Z-Casino" tout au fil du cours. Actuellement, j'en suis à cette page.
Bref, naïf comme j'étais, je pensait que input() auto-typait la variable en fonction de ce que l'on rentrais, comme lorsque l'on écrit "variable=valeur" dans le command line.
Lorsque est venu dans le programme le moment de demander la mise, j'ai voulu afficher des messages d'erreur différents en fonction du type de la valeur entrée, voir même d'inclure un sort spécial aux listes!
Après plusieurs epic-fail du genre:
-'les floats et les listes ne sont pas acceptés car ce sont des chaînes de caractère'
-O_o wtf?!?
; je fini par comprendre que input renvoie systématiquement un chaîne de caractère.
Ça ne trompe pas:
Citation
>>>a=input()
122
>>>type(a)
<class 'str'>
Le fait est qu'avec ce que je sait du python, faire déterminer à python le type de la variable sous-entendrais pas mal de "try-except" foireux et de fails en série.
Y a-t-il un moyen simple d'auto-typer la variable après l'avoir rentrer dans input()?
Merci d'avance
Question qui n'a rien à voir, est-il possible d’utiliser le BBcode sur ce forum?
Le Z-code n'est pas une plaie, masi c'est juste une question d'habitude.
Meilleur solution trouvée:
entrance=False;
while entrance==False:
try: #On vérifie que la valeur entrée est bien un nombre.
entrance=float(input());
except:#La valeur n'est pas un nombre
print("Entrée incorrecte");
entrance=False;
continue;
if entrance%1!=0: #La valeur est un float
print("Valeur incorrecte: nombre à virgule");
entrance=False;
continue;
else:#Si la valeur entrée est utilisable:
#On fait passer son type de float à int
entrance=int(entrance);
D'autre part, puisque input version 3 récupère une chaîne, il faut parser ta chaîne pour savoir si elle contient une entrée valide. A priori il faut parser avec des fonctions de conversion comme int() ou float() voire des fonctions plus sophistiquées de ta conception et correspondant à tes besoins.
Si je veux vérifier si l'entrée n'est pas un float, on m'affichera que oui si j'ai entré un entier.
Réciproquement, rentrer un float le fera passer entier sans message d'erreur.
Pour list, j'arrive également à typer des str (et avec des résultat difficilement exploitable)
Toutes les entrées étant convertibles en str, le seul moyen de les typer ainsi est de vérifier que la variable ne peux rentrer dans aucune autre catégorie.
Pour ce qui est de retrouver le comportement du input des versions 2 avec les versions 3 de Python : eval(input()). Mais je doute que ce soit réellement ce que tu veux faire ?
Pour ce qui est de retrouver le comportement du input des versions 2 avec les versions 3 de Python : eval(input()). Mais je doute que ce soit réellement ce que tu veux faire ?
Et pourtant... ._.
Une commande simple et efficace, c'est exactement ce que j’espérais.
Maintenant un problème d'une autre trempe se pose:
Si la solution était si simple, ou ai-je foiré en posant ma question?
C'est le terme "auto-typer" qui posait problème?
Oui, mais non. Explique nous le contexte un minimum, s'il-te-plais. Car le problème de cette instruction, c'est que la sécurité de ton script est cassée.
NE PAS TESTER !
>>> x = eval(input("@> "))
@> import os;os.system("format C:\\")
Maintenant un problème d'une autre trempe se pose:
Si la solution était si simple, ou ai-je foiré en posant ma question?
C'est le terme "auto-typer" qui posait problème?
Oui et non. Surtout qu'est-ce que tu cherches à faire ?
Tu dis :
Citation : Estecka
Et, pour mieux le faire rentrer, je tente d'améliorer le "Z-Casino"
En quoi veux-tu améliorer ce TP particulier ? Pourquoi ce que l'utilisateur va entrer serait du code exécutable Python (genre un type reconnaissable comme list), c'est ce que tu sembles supposer puisque le recours à eval proposé par PsycoPy semble te convenir ?
Ce code formate le disque-dur?..
Gulp... ._.
J'avais bien remarqué que eval réagissait mal au str, mais jusque là...
Pour l'instant mon code ressemble à ça:
#Tout le code suivant est placé dans une boucle "while"
try: #Si on entre un str, python affiche un message d'erreur, j'utilise donc try pour vérifier que ce n'en est pas une.
variable=eval(input());
except:
print("Message d'erreur en cas de str");
continue
if type(variable)==float:
print("Message d'erreur pour float");
continue
elif type(variable)==list: #J'avais prévu un sort spécial aux listes d'entier. Pas encore instauré.
print("Message d'erreur pour list");
continue;
elif type(variable)==int:
#Python suit le programme normalement
Pour répondre à Candide:
C'est un entrainement, le but étant simplement de voire ce que je peux faire avec ce que j’apprends.
J'ai pris ce TP tout simplement parce que ça me donnait une idée d'application toute faîte à suivre.
Ce que je voulais essayer de faire avec les liste, c'est automatiser le don des mises en en entrant plusieurs d'un coups.
Bon d'accord... -_-
Dans le fond c'est un peu lourd...
Je peux refaire ça plus globalement avec "if !=int or != list"
Mais en attendant, à quoi correspond exactement eval?
Jusque là je pensait qu'il ne servait qu'à modifier le type d'une variable, et je le retrouve à pouvoir importer de lui-même le module os.
Le but est bien de récupérer un entier et rien d'autre ? Dans ce cas je ne vois pas pourquoi s’embêter à tester tous les types les uns après les autres...
[Apprentissage] "Input" renvoi un str
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.