Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Apprentissage] "Input" renvoi un str

Comment auto-typer correctement?

Sujet résolu
    30 octobre 2011 à 15:45:11

    Bonjour,

    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);
    
    • Partager sur Facebook
    • Partager sur Twitter
    Y s'taient cachés les steaks hachés.
      30 octobre 2011 à 15:58:02

      puisque input() te renvoie des str sous py3 ... tapes dir(str) dans une console.
      genre:
      >>> dir(str)
      ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
      '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
      '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
      '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
      '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__',
      '__subclasshook__', 'capitalize', 'center', 'count', 'encode', 'endswith',
      'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha',
      'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable',
      'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans',
      'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit',
      'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
      'translate', 'upper', 'zfill']
      >>>
      >>>
      >>> print(str.isdecimal.__doc__)
      S.isdecimal() -> bool
      
      Return True if there are only decimal characters in S,
      False otherwise.
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        30 octobre 2011 à 16:12:29

        Citation : Estecka


        Y a-t-il un moyen simple d'auto-typer la variable après l'avoir rentrer dans input()?




        Ta question n'est pas claire.



        Ce que je peux te dire c'est que la version 2.7 de input fait ce que tu croyais que faisait input :


        >>> a=input()
        [3,5]
        >>> a
        [3, 5]
        >>> type(a)
        <type 'list'>
        >>>
        



        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.
        • Partager sur Facebook
        • Partager sur Twitter
          30 octobre 2011 à 16:36:01

          Assez frustrant de voire que python 2.7 se débrouille mieux que 3.2. ._.

          Pour ce qui est de int(), float(), list(), str()... J'y avais penser mais si je m'y prend avec:
          try:
              variable=type_à_vérifier(variable);
          except:
              print("message d'erreur spécifique");
          


          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.
          • Partager sur Facebook
          • Partager sur Twitter
          Y s'taient cachés les steaks hachés.
          Anonyme
            30 octobre 2011 à 16:40:43

            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 ?

            • Partager sur Facebook
            • Partager sur Twitter
              30 octobre 2011 à 16:54:11

              Citation : PsycoPy

              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?
              • Partager sur Facebook
              • Partager sur Twitter
              Y s'taient cachés les steaks hachés.
              Anonyme
                30 octobre 2011 à 17:04:17

                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:\\")
                
                • Partager sur Facebook
                • Partager sur Twitter
                  30 octobre 2011 à 17:21:32

                  Citation : Estecka


                  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 ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 octobre 2011 à 17:43:20

                    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.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Y s'taient cachés les steaks hachés.
                      30 octobre 2011 à 18:44:36

                      tu a oublié les messages d'erreur pour les dicts, les boléens, etc ... on ne sait jamais.

                      Et surtout les entiers négatifs !!!


                      sinon, genre "si c'est pas un entier positif alors erreur" ça marche aussi bien et c'est bien plus clair ... dans le contexte du jeu ....
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Python c'est bon, mangez-en. 

                        30 octobre 2011 à 18:54:10

                        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.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Y s'taient cachés les steaks hachés.
                        Anonyme
                          30 octobre 2011 à 19:06:35

                          Le plus simple, performant et sûr pour récupérer un int reste le try: except:.

                          # repeat = 5
                          while repeat:
                              try:
                                  n = int(input("Entrez un nombre : "))
                                  break
                              except ValueError:
                                  print("Veuillez entrer un entier !")
                                  repeat -= 1
                          


                          Le cours doit déjà en parler...

                          eval évalue (interprète) une chaîne de caractères comme une instruction Python. Ça peut avoir son utilité, mais uniquement dans de très rares cas.

                          Pour savoir ce que fait une fonction, tu peux soit regarder la doc officiel, soit taper dans un shell Python la commande help(...).
                          • Partager sur Facebook
                          • Partager sur Twitter
                            31 octobre 2011 à 18:58:58

                            Là on reviens à ce que j'avais fait à la base, mais que j'ai voulu améliorer. :/

                            Je commence à penser que j'ai voulu faire trop par rapport à mon niveau.
                            Si c'est le cas n'hésitez pas à le dire, je pourrait me passer de ça.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Y s'taient cachés les steaks hachés.
                            Anonyme
                              31 octobre 2011 à 19:15:02

                              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...
                              • Partager sur Facebook
                              • Partager sur Twitter

                              [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.
                              • Editeur
                              • Markdown