Partage
  • Partager sur Facebook
  • Partager sur Twitter

Forcer le type d'une variable

    15 novembre 2014 à 21:09:46

    Bonsoir,

    Je cherche à forcer le type d'une variable instanciée par la fonction input. Mon programme fonctionne exclusivement avec des entiers ainsi je voulais forcer le type entier de ma variable à l'aide de int(input()). Lorsque je rentre ensuite un entier cela fonctionne et transforme le string en un entier. Cependant, lorsque je rentre un nombre à virgule du type 52.3, un message d'erreur s'affiche : "ValueError: invalid literal for int() with base 10: '52.3'". Je ne vois pas à quoi cela est du. En effet, je suis presque sûr d'avoir déjà eu recours à cette méthode et qu'elle marchait. Mais il n'y a rien à faire, j'ai essayé de tout effacer et de réécrire le code, j'ai bien vérifié les parenthèses.... tout me semble correct. Quelqu'un pourrait m'expliqur ce qu'il se passe s'il vous-plaît ? Je trouve cela d'autant plus étrange que j'arrive à forcer le passage en un entier en procédant par deux étapes : "int(float(input())) mais cette méthode ne me plaît guère ....

    Merci d'avance, 

    Bonne fin de soirée

    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2014 à 21:19:17

      Si Je dis pas de bêtises 
      Quand tu récuperes une valeur avec un input la valeur d'arrivée est un string.
      Donc si tu essayes de convertir un nombre a virgule en entier il va pas comprendre car si il voit un caractere autre qu'un chiffre en l'occurence un point il va dire que c'est pas possible

      Par contre ton int(float(input())) fonctionne parce qu'il sait convertir un float en int.
      J'espere que j'ai été clair ^^' 

      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2014 à 21:41:38

        Merci beaucoup pour cette réponse aussi rapide ! :)

        Oui c'est bien cela on récupère un string avec un input !

        Ha d'accord je n'avais pas pensé que le "." puisse être interprété comme un autre caractère ^^. C'est dommage parce que du coup si l'utilisateur du programme ne se plie pas aux règles ça peut rapidement entraîner de sérieuses complications ...

        Du coups, je vais devoir forcer deux fois de suite le type....

        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2014 à 21:51:10

          Je suis très très loin d'être un expert dans le domaine, je sais pas comment fonctionne les fonctions de conversion mais c'est ce qui me semble le plus logique.
          A confirmer ^^

          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2014 à 22:40:04

            Ben, tu demandes un entier, or "52.3" n'est pas un entier, il n'y a donc que deux réponses possibles :

            - la mauvaise : retourner une valeur fausse (par exemple, php renvoie 52, ou 0 si la chaîne contient "bonjour", ou 52 si la chaîne contient "52bonjour"...)

            - la bonne, c'est de balancer une exception, puisque renvoyer une valeur fausse est somme toute une façon de programmer assez pourrie...

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 novembre 2014 à 22:44:11

              Au pire tu peux coder une petite fonction qui te permet de "forcer" le type de l'entrée de l'utilisateur. J'aurai vu un truc du genre:

              def prompt(msg, condition=lambda x: True, cursor='> ', err=None):
              	print(msg)
              	while True:
              		inpt = input(cursor)
              		try:
              	            if condition(inpt):
                                      return inpt
              		except: pass
              		print(err)

              -
              Edité par Anonyme 16 novembre 2014 à 11:15:36

              • Partager sur Facebook
              • Partager sur Twitter
                15 novembre 2014 à 22:50:27

                Salut,

                Il suffit d'utiliser la méthode isdigit() des chaînes pour savoir s'il n'y a que des chiffres:

                a = "54.5"
                b = "42"
                
                a.isdigit()  #renvoie False
                b.isdigit()  #renvoie True

                Il y a toute une batterie de méthodes comme celle-ci pour les chaînes

                • Partager sur Facebook
                • Partager sur Twitter
                Précepte: Le mieux est l'ennemi du bien
                  16 novembre 2014 à 11:08:36

                  Merci à tous pour vos réponses !

                  Vu que mon programme sert simplement à effectuer une application mathématique, je pense que je vais simplement retourner un message d'erreur si jamais l'utilisateur rentre n'importe quoi ^^

                  Mais merci beaucoup, c'est toujours intéressant de découvrir plusieurs techniques, surtout lorsque l'on débute en Python :) 

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Forcer le type d'une variable

                  × 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