Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer en type string le nom d'une variable

    16 juin 2021 à 20:29:26

    Bonjour à tous, :)

    Ma question du jour était de savoir comment je pouvais récupérer en chaîne de caractère le nom d'une de mes variables.

    Pour exemple:

    def display_name_var(var):
        ...
        return name_var
    
    bonjour = 'salut !'
    
    name_var = display_name_var(bonjour)
    print(name_var)
    
    # Pour un output de:
    bonjour

    Auriez-vous une idée de comment réaliser ceci ?

    Merci d'avance pour votre aide ;)

    • Partager sur Facebook
    • Partager sur Twitter
      16 juin 2021 à 20:36:22

      Bonjour.

      def get_name(v):
      
          for lv in locals():
              if eval(lv) is v:
                  return lv

      Ce n'est pas très élégant, et avoir besoin d'une telle fonction ça ne sent pas très bon.

      • Partager sur Facebook
      • Partager sur Twitter
        16 juin 2021 à 20:38:29

        ha super, merci beaucoup :D

        J'ai besoin de ça pour débugger mon jeu et afficher quel instance gère l'objet avec lequel je suis en collision sur le moment, ça me permet de mieux le retrouver par la suite dans mon amas de class si j'ai besoin de le modifier par exemple.

        Merci encore ^^

        • Partager sur Facebook
        • Partager sur Twitter
          16 juin 2021 à 20:38:55

          Liyon42 a écrit:

          Auriez-vous une idée de comment réaliser ceci ?

          On peut faire çà en jouant avec le module inspect et il y a des exemples sur Internet

          • Partager sur Facebook
          • Partager sur Twitter
            16 juin 2021 à 20:39:37

            ha tiens, merci pour l'autre astuce je verrais ça !

            Comment passe ton un sujet en résolu ? haha

            EDIT

            La fonction me renvoie 'var', j'ai essayé avec différentes variables

            -
            Edité par Liyon42 16 juin 2021 à 20:44:02

            • Partager sur Facebook
            • Partager sur Twitter
              16 juin 2021 à 20:54:45

              digammaF a écrit:

              Bonjour.

              def get_name(v):
              
                  for lv in locals():
                      if eval(lv) is v:
                          return lv

              Ce n'est pas très élégant, et avoir besoin d'une telle fonction ça ne sent pas très bon.

              Je ne suis pas sûr que ça marche (tu peux avoir des alias et de l'interning).

              Liyon42 a écrit:

              J'ai besoin de ça pour débugger mon jeu et afficher quel instance gère l'objet avec lequel je suis en collision sur le moment, ça me permet de mieux le retrouver par la suite dans mon amas de class si j'ai besoin de le modifier par exemple.


              Tu sembles typiquement dans le cas d'application des chaînes formatées en mode debug (ne marche que depuis Python 3.8), je l'explique ici et si tu préfères la doc officielle, c'est .
              • Partager sur Facebook
              • Partager sur Twitter
                16 juin 2021 à 20:59:08

                A ouais c'est super intéressant !

                Malheureusement je suis en 3.6.8... rhaaa :(

                Mais très bon cours par contre

                • Partager sur Facebook
                • Partager sur Twitter
                  17 juin 2021 à 8:37:13

                  Liyon42 a écrit:

                  J'ai besoin de ça pour débugger mon jeu

                  Non t'as pas besoin de ça !!! Tu utilises les outils qui existent comme pdb par exemple, ou aussi les outils existants sur des IDE tels que PyCharm ou VS Code par exemple qui ont leur propre debugger.

                  • 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)

                    17 juin 2021 à 8:49:00

                    Merci pour le lien mais cela ne fait pas ce que je souhaite, je veux vraiment pouvoir afficher le nom de la variable, il n'a pas l'air de le proposer…

                    Dans le coin supérieur gauche de mon écran j'ai affiché ses informations:

                    Or quand je rentre en collision avec une image (mesh, objets...) le text No collision object doit se remplacer par le nom de la variable gérant l'instance de l'objet touché.

                    Je sais déjà tout faire mais pas récupérer le nom de la variable c'est tout ce que je demande.

                    -
                    Edité par Liyon42 17 juin 2021 à 8:49:53

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juin 2021 à 8:53:37

                      Il y a pas un soucis de logique ? Quand tu rentres en collision, le texte No collision object s'affiche ?

                      Non je ne comprend pas le besoin, et d'ailleurs je ne comprend pas pourquoi récupérer le nom de la variable plutôt que sa valeur...

                      • 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)

                        17 juin 2021 à 9:04:58

                        Voilà dans mon script ce qui initialise un coffre avec ces coordonnées sur la map entre autre:

                        Quand je suis en collision avec lui je veux qu'à la place de No collision object, cela affiche le nom de la variable, en l'occurrence: chest1.

                        Ceci me permettra de retrouver quelle instance du coffre je pointe et ainsi ne pas me perdre, imagine si je possède 20 coffres sur la map actuel et que je doit savoir en tâtonnant lequel je pointe entre le premier et le 20ème…

                        et pourquoi ne pas récupérer sa valeur:

                        tout simplement parce que c'est une fonction, pas une simple variable associé à un type string

                        -
                        Edité par Liyon42 17 juin 2021 à 9:06:21

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 juin 2021 à 9:38:52

                          Ça semble le problème de conception à plein nez, car quand je vois self.chest1, je me dis qu'il doit y en avoir un paquet derrière (self.chest2, self.chest3, etc...) et là je dis, utilisation d'une liste pour créer ses instances dynamiquement avec une boucle.

                          Liyon42 a écrit:

                          Ceci me permettra de retrouver quelle instance du coffre je pointe et ainsi ne pas me perdre, imagine si je possède 20 coffres sur la map actuel et que je doit savoir en tâtonnant lequel je pointe entre le premier et le 20ème…

                          Plutôt que de chercher self.chest1, pourquoi tu cherches pas self.chest.id == 1 ?

                          Tu aurais l'ID de chacun de tes objets et en déduire l'erreur facilement.

                          En tout cas à mon sens, ce que tu veux n'est pas qu'une mauvaise pratique, mais aussi une mauvaise conception. Je n'ai jamais eu à utiliser cela en 15 ans de Python.

                          Un simple attribut à ajouter et on construit dynamiquement, puis on retrouve l'ID de l'objet facilement,

                          class Chest:
                          
                              def __init__(self, id):
                                  self.id = id
                          
                          chests = []
                          for i in range(20):
                              chest = Chest(i+1)
                              chests.append(chest)
                          
                          for chest in chests:
                              print("ID de chest: {} pour l'objet chest {}".format(chest.id, id(chest)))
                          
                          # ID de chest: 1 pour l'objet chest 140144129830864
                          # ID de chest: 2 pour l'objet chest 140144129830672
                          # ID de chest: 3 pour l'objet chest 140144129830528
                          # ID de chest: 4 pour l'objet chest 140144129830384
                          # ID de chest: 5 pour l'objet chest 140144129830240
                          # ID de chest: 6 pour l'objet chest 140144129830144
                          # ID de chest: 7 pour l'objet chest 140144129830048
                          # ID de chest: 8 pour l'objet chest 140144129829952
                          # ID de chest: 9 pour l'objet chest 140144129829856
                          # ID de chest: 10 pour l'objet chest 140144129829760
                          # ID de chest: 11 pour l'objet chest 140144129829664
                          # ID de chest: 12 pour l'objet chest 140144129829568
                          # ID de chest: 13 pour l'objet chest 140144129829472
                          # ID de chest: 14 pour l'objet chest 140144129829376
                          # ID de chest: 15 pour l'objet chest 140144129829280
                          # ID de chest: 16 pour l'objet chest 140144129828608
                          # ID de chest: 17 pour l'objet chest 140144129828512
                          # ID de chest: 18 pour l'objet chest 140144129828416
                          # ID de chest: 19 pour l'objet chest 140144129828320
                          # ID de chest: 20 pour l'objet chest 140144129828224
                          



                          -
                          Edité par fred1599 17 juin 2021 à 9:47:27

                          • 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)

                            17 juin 2021 à 9:59:07

                            Ton idée semble fonctionnel, je vais tester ça.

                            Effectivement j'avais pensé à attribué un id à chaque instances mais je ne savais pas si cela était la meilleure solution…

                            ##

                            Après essai, tout fonctionne correctement, merci du coup de pouce :)

                            Mais je ne vois pas de bouton pour passer le sujet en résolu, pourrais t-on me guider sur son emplacement ?

                            -
                            Edité par Liyon42 17 juin 2021 à 10:07:45

                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 juin 2021 à 10:31:29

                              Si tu glisses le curseur de ta souris en haut à droite de ton premier ou dernier (je sais plus) tu devrais voir s'afficher le bouton il me semble.

                              -
                              Edité par fred1599 17 juin 2021 à 10:31:56

                              • 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)

                                17 juin 2021 à 10:48:42

                                Je ne vois rien de tel...

                                Pareil pour le dernier message...

                                -
                                Edité par Liyon42 17 juin 2021 à 10:49:09

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 juin 2021 à 11:10:29

                                  C'est en haut à droite du titre normalement

                                  -
                                  Edité par Nephthys 17 juin 2021 à 11:11:10

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 juin 2021 à 19:10:24

                                    à défaut d'id, tu peux lui rajouter un attribut name dans lequel tu mettras le nom de ta variable :-°
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 juin 2021 à 19:21:26

                                      umfred a écrit:

                                      à défaut d'id, tu peux lui rajouter un attribut name dans lequel tu mettras le nom de ta variable :-°


                                      Tout à fait, on peut tout, mais surtout éviter la pratique présentée par le PO au départ de sa discussion. Les idées sur une solution pour détecter un objet sont nombreuses.

                                      • 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)

                                        17 juin 2021 à 20:27:27

                                        Je n'ai rien de tout ça, je ne comprend pas...

                                        Et merci bien pour l'id ça fonctionne vraiment niquel, j'ai compris mon erreur de base, que je prenais le problème dans le mauvais sens

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Récupérer en type string le nom d'une variable

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