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

Résolu
Lecodeurhtmlcss Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention   - 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 ?


A voir également:

2 réponses

rustugu
 
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   Statut Membre Dernière intervention   1
 
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 23538 Date d'inscription   Statut Contributeur Dernière intervention   1 582 > Lecodeurhtmlcss Messages postés 76 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   1 > yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention  
 
Donc il faudrait changer
pos
dans le reste du code aussi ?
0
Lecodeurhtmlcss Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1 > yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention  
 
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 23538 Date d'inscription   Statut Contributeur Dernière intervention   1 582 > Lecodeurhtmlcss Messages postés 76 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   168
 
étantonné ?
0
Lecodeurhtmlcss Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
 
étant donné... ;-)
0