Python : changer la valeurs de variables à partir d'une liste de variables

Résolu/Fermé
Lecodeurhtmlcss Messages postés 76 Date d'inscription lundi 20 avril 2020 Statut Membre Dernière intervention 24 août 2022 - Modifié le 25 juil. 2021 à 16:13
yg_be Messages postés 23323 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 novembre 2024 - 27 juil. 2021 à 12:05
Bonjour et merci de votre attention,
Je crée un moteur 3D en python, qui a besoin de commandes avec le clavier, beaucoup de commandes... Comme je suis un flemmard et que je ne veux pas écrire une liste long comme le bras de lignes pour assigner chaque touche à une changement de variables, je me suis dit que j'allais faire une liste spécialisée de format :
[["a",variable à changer, valeur du changement],["espace",variable à changer, valeur du changement]...]


donc ça donnerait
def UserTouche(Touche):

    for i in [["o",Rhb,0.3],["k",Rgd,-0.3],["l",Rhb,-0.3],["m",Rgd,0.3],["z",pos,0.3],["q",pos,-0.3],["s",pos,-0.3],["d",pos,0.3]]: #Juste un écchantillon !
        for j in Touches:  #(Touches=liste des touches appuyées à ce moment)
            if j in i:
                #if type(i[1])=='list':
                #    Calculs pour le changement de position j'imagine
                #else :
                i[1]=i[1]+i[2]

(c'est plus court !)

Mais ça ne fonctionne pas bien sûr, car on change i[1] au lieu de la variable en question...
Y-aurait-il une méthode pour automatiser l'assignation de variables (si ce n'est transformer toutes mes variables en une liste géante...) , ou suis-je condamné à écrire toute les lignes (c'est pas la mort non plus ;))

Merci beaucoup pour vos réponses !










NB : j'ai entendu parler de dictionnaire, mais ça ne donnerait pas la même chose par hasard ?


2 réponses

Bonjour,

Mouais, tu t'embarques dans de mauvaises pratiques, bref, ce qu tu veux faire est d'accéder à une variable en ayant son nom sous forme de string.

>>> var, value = 'pos', 0.3
>>> globals()[var] = value
>>> pos
0.3


Mais on ne doit pas faire ce genre de chose crados, utilise par exemple un dictionnaire, qui répond parfaitement à ce que tu souhaites réaliser ;-)
1
Lecodeurhtmlcss Messages postés 76 Date d'inscription lundi 20 avril 2020 Statut Membre Dernière intervention 24 août 2022 1
Modifié le 25 juil. 2021 à 21:54
Alors la moitié du chemin est fait... mais je ne change que la variable du dictionnaire, pas la variable globale ! Il faudrait remplacer dans tout mon code cette variable par son équivalent de page dictionnaire ?

Fait avec le dictionnaire
DicoTouches = {"o":[Rhb,0.3],"k":[Rgd,-0.3],"l":[Rhb,-0.3],"m":[Rgd,0.3],"z":[pos,0.3],"q":[pos,-0.3],"s":[pos,-0.3],"d":[pos,0.3]}

Et le code
def UserTouche(TouchePressees):
    
    print("Touches pressées :", TouchePressees)
    for i in DicoTouches.keys():
        for j in TouchePressees:     
            if j == i:
                if type((DicoTouches.get(j))[0])=='list':
                    print("vous vous déplacez")
                else :
                    print((DicoTouches.get(j))[0])
                    (DicoTouches.get(j))[0]=(DicoTouches.get(j))[0]+(DicoTouches.get(j))[1] #On ne change que l'entrée du dico ! d'ailleurs "o" et "l" ne sont pas liés !
                    print((DicoTouches[i])[0], " a changé")
                       #Cette dernière ligne ne donne que le nombre...


Merci de votre aide ! (en fait la question devient "Changer la valeur d'une variable via un dictionnaire"...)
0
yg_be Messages postés 23323 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 novembre 2024 1 549 > Lecodeurhtmlcss Messages postés 76 Date d'inscription lundi 20 avril 2020 Statut Membre Dernière intervention 24 août 2022
25 juil. 2021 à 22:58
tu as transformé ta liste d'actions en dictionnaire, c'est bien.
il faut maintenant créer le dictionnaire suggéré par rustugu.
valeurs={"Rhb" : 0, "Rgd" : 0 }


je pense qu'il faut peupler ainsi ton dictionnaire d'actions:
DicoTouches = {"o":["Rhb",0.3],"k":["Rgd",-0.3],"l":["Rhb",-0.3],"m":["Rgd",0.3],"z":["pos",0.3],"q":["pos",-0.3],"s":["pos",-0.3],"d":[pos,0.3]}

au lieu de ton épuisante construction for/for/if, je pense préférable:
for touche in TouchePressees:
      action=DicoTouches.get(touche)
      if  not (action is None):
          variable=action[0]
          mouvement=action[1]
          valeurs[variable]=valeurs[variable]+mouvement


chaque fois, au lieu d'utiliser la variable
pos
, tu utiliseras
valeurs["pos"]
.
0
Lecodeurhtmlcss Messages postés 76 Date d'inscription lundi 20 avril 2020 Statut Membre Dernière intervention 24 août 2022 1 > yg_be Messages postés 23323 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 novembre 2024
26 juil. 2021 à 15:31
Donc il faudrait changer
pos
dans le reste du code aussi ?
0
Lecodeurhtmlcss Messages postés 76 Date d'inscription lundi 20 avril 2020 Statut Membre Dernière intervention 24 août 2022 1 > yg_be Messages postés 23323 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 novembre 2024
Modifié le 26 juil. 2021 à 15:38
Donc il faudrait remplacer
pos
,
Rhb
et les autres variables par valeurs["lavariableenquestion"] dans tout le reste de mon code ?
Si oui, étantonné qu'il serait plus simple de juste faire une liste de ifs, y-a-til une procédure pour faire plein de ifs à la suite plus rapide ?
0
yg_be Messages postés 23323 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 novembre 2024 1 549 > Lecodeurhtmlcss Messages postés 76 Date d'inscription lundi 20 avril 2020 Statut Membre Dernière intervention 24 août 2022
26 juil. 2021 à 21:28
sans que tu ne montres le reste du code, il est difficile de bien de conseiller.
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
26 juil. 2021 à 16:46
étantonné ?
0
Lecodeurhtmlcss Messages postés 76 Date d'inscription lundi 20 avril 2020 Statut Membre Dernière intervention 24 août 2022 1
Modifié le 27 juil. 2021 à 10:53
étant donné... ;-)
0