Partage
  • Partager sur Facebook
  • Partager sur Twitter

Transformation d'une variable de type string

Sujet résolu
    1 mars 2025 à 18:52:51

    Bonjour,

    Dans le programme ci-dessous, l'affichage de "variable" et de "caseA1" sont différents (et c'est normal).

    Existe t-il un moyen simple, une fonction "transforme" telle que print(transforme(variable)) donne la même chose que print(caseA1) ?

    caseA1=14
    variable="case"+"A1"
    print(variable)
    print(caseA1)

    Merci pour votre réponse.

    • Partager sur Facebook
    • Partager sur Twitter
      1 mars 2025 à 19:22:11

      Hein ?

      Montrez votre code ça sera plus simple, y compris le message d'erreur si il existe.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        1 mars 2025 à 19:23:20

        on peut le faire avec

        :
        print(globals()[variable])

        mais si vous allez dans cette direction, c'est probablement parce que vous posez très mal le problème de départ. Une solution plus élégante serait d'avoir un dictionnaire spécifique comme cases et des index comme 'A1' pour pouvoir écrire cases['A1'].

        • Partager sur Facebook
        • Partager sur Twitter
          1 mars 2025 à 22:44:52

          C'est la fonction eval qui est la solution la plus directe : elle prend une chaîne de caractères, qui représente  une expression, et l'évalue.

          # on construit une expression dans une chaine
          expression = "2"
          expression += "+3"
          
          # on affiche l'expression et sa valeur
          print("l'expression", expression, "vaut", eval(expression))
              

          Exécution:

          $ python3 exemple_eval.py 
          l'expression 2+3 vaut 5
          



          On ne saurait trop conseiller les bonnes lectures

          https://docs.python.org/fr/3.13/library/functions.html

          Mais comme dit plus haut, c'est une idée qui sent le problème XY :

          • vous voulez peut être faire un truc avec différentes "cases" A1, A2, B3, C4 qui contiennent des valeurs (c'est le problème X)
          • vous pensez vous en tirer avec des variables nommées caseA1, caseB2, etc
          • mais vous ne savez pas comment accéder aux valeurs à partir des coordonnées A1, B2, contenues dans des chaines (c'est un autre problème Y) vous voulez une formule magique pour faire ça.
          OK, il y a une formule magique (eval(chaine)), techniquement ça marche mais c'est pas la bonne approche.

          Une solution correcte du problème X, c'est d'employer un dictionnaire

          # on crée le dictionnaire "case" et on y met des trucs
          
          case = {}
          case["A1"] = 12
          case["B2"] = 34
          case["C44"] = 1789
          
          # et maintenant on y accède à partir d'un nom
          
          nom = "B2"
          print("la case", nom, "contient", case[nom]);
          
          


          Exécution

          Python 3.11.2 (main, Nov 30 2024, 21:22:50) [GCC 12.2.0] on linux
          Type "help", "copyright", "credits" or "license" for more information.
          >>> 
          la case B2 contient 34
          >>> 



          • Partager sur Facebook
          • Partager sur Twitter
            2 mars 2025 à 9:20:58

            Bonjour,

            ou bien comme ceci:

            caseA1=14
            variable="case"+str(caseA1)



            • Partager sur Facebook
            • Partager sur Twitter
              2 mars 2025 à 14:18:28

              michelbillaud a écrit:

              Une solution correcte du problème X, c'est d'employer un dictionnaire

              Les variables caseA1, caseB2, caseC44,... étant déjà des clefs du dictionnaire globals(), le dictionnaire est déjà là (pour peu qu'on sache qu'il existe et comment utiliser un dictionnaire).

              Poser correctement le problème est de considérer caseA1, caseB2, caseC44,... comme éléments d'une collection (de cases). On peut très bien matérialiser cette collection par les variables préfixées par "case..." (un sous ensemble du dictionnaire globals()) ou en lui dédiant un dictionnaire spécifique et dédié (cases).

              Je préfère le dictionnaire dédié pour éviter de me poser des questions sur les doublons/collisions dans le nom des variables. Ce qui pourrait compliquer la mise au point du code (et la simplification de l'écriture).

              • Partager sur Facebook
              • Partager sur Twitter
                2 mars 2025 à 15:30:48

                mps a écrit:

                michelbillaud a écrit:

                Une solution correcte du problème X, c'est d'employer un dictionnaire

                Les variables caseA1, caseB2, caseC44,... étant déjà des clefs du dictionnaire globals(), le dictionnaire est déjà là (pour peu qu'on sache qu'il existe et comment utiliser un dictionnaire).

                Poser correctement le problème est de considérer caseA1, caseB2, caseC44,... comme éléments d'une collection (de cases). On peut très bien matérialiser cette collection par les variables préfixées par "case..." (un sous ensemble du dictionnaire globals()) ou en lui dédiant un dictionnaire spécifique et dédié (cases).

                Je préfère le dictionnaire dédié pour éviter de me poser des questions sur les doublons/collisions dans le nom des variables. Ce qui pourrait compliquer la mise au point du code (et la simplification de l'écriture).


                Le dictionnaire est la solution la plus simple, et la plus propre, et c'est donc à préférer. Même si techniquement c'est possible de faire autrement. Techniquement je peux programmer avec des gants et des lunettes noires, je préfère pas.  Faut éviter les trucs pervers.

                Devoir concaténer un préfixe et le nom de la case à chaque accès, puis aller chercher dans le dictionnaire global  ? Quel intérêt à faire ce détour ?

                -
                Edité par michelbillaud 2 mars 2025 à 20:52:41

                • Partager sur Facebook
                • Partager sur Twitter
                  2 mars 2025 à 16:01:09

                  Bonjour,

                  Je vous remercie de toutes vos réponses.

                  J'avais effectivement utilisé un dictionnaire mais je trouvais ça lourd. La façon proposée d'utiliser le dictionnaire est bien plus élégante que celle que j'avais imaginé et c'est celle que je vais utiliser, même si la solution print(globals()[variable]) est la solution théorique que je cherchais.

                  Merci et bonne journée

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mars 2025 à 22:02:45

                    > j'avais trouvé ça lourd

                    Troyver "lourd" ça le fait souvent quand on patauge à apprend à utiliser un truc qui résoud un problème pour lequel on a déjà une solution en vue fut-elle inefficace ou tarabiscotée, avec les moyens techniques qu'on connaît déjà. Forcément, on apprend des trucs nouveaux, qu'on connaissait pas avant, et ça n'a pas l'air indispensable.

                    Pour en revenir au choix de la structure de données, le truc du globals et les noms de variables  caseb2, un truc qui sera emmerdant, ça sera de faire une boucle sur l'ensemble des cases

                    Alors que

                    case = {}
                    case["a1"] = 12
                    case["b42"] = 34
                    case["c33"] = 54
                    
                    for position, valeur in case.items():
                        print(position, "=>", valeur)
                    
                    

                    ça le fait tout seul

                    Python 3.11.2 (main, Nov 30 2024, 21:22:50) [GCC 12.2.0] on linux
                    Type "help", "copyright", "credits" or "license" for more information.
                    >>> 
                    a1 => 12
                    b42 => 34
                    c33 => 54
                    >>> 



                    -
                    Edité par michelbillaud 3 mars 2025 à 8:45:05

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Transformation d'une variable de type string

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    • Editeur
                    • Markdown