[Python] Variables a assimiler

Résolu

Bonjour,

Je souhaite assimiler la valeur d'une variable déjà définie dans mon script à une variable entrée par l'utilisateur. Ce n'est pas vraiment clair, donc :

a=3
b=input("") #ici, l'utilisateur entre la lettre "a".

Je voudrais assimiler à "b" la valeur de ma variable "a" et non pas la lettre "a".
Donc la variable "b" serait égale à 3...
J'ai cherché partout, j'ai rien trouvé.

Je vous remercie de vos futur réponses =)

4 réponses

  1. Salut

    La fonction globals() renvoie un dictionnaire qui exprime l'espace de noms global.
    Ce dictionnaire a pour valeur les chaînes de caractères utilisées comme identifiant au niveau global dans le code.
    Il a des valeurs qui sont les objets correspondant aux identifiants.

    a = 3  
    e = 10  
    vv = 'ululu'  
    
    print 'a==%s  id(a)==%d   type(a)==%s' % (a,id(a),type(a))  
    print 'e==%s  id(e)==%d   type(e)==%s' % (e,id(e),type(e))  
    print 'vv==%s  id(vv)==%d   type(vv)==%s' % (vv,id(vv),type(vv))  
    print  
    
    
    while True:  
        x = raw_input('Entrer une chaîne (aucun caractère, pour arrêter) : ')  
        print 'x==%s  id(x)==%d   type(x)==%s' % (x,id(x),type(x))  
        if x in globals():  
            b = globals()[x]  
            print 'b==%s  id(b)==%d   type(b)==%s\n' % (b,id(b),type(b))  
        else:  
            if not x:  break  
            print "Aucun identifiant '%s' n'est recensé dans ce code\n" % x


    une exécution du code ci-dessus:

    a==3  id(a)==10021744   type(a)==<type 'int'>  
    e==10  id(e)==10021660   type(e)==<type 'int'>  
    vv==ululu  id(vv)==18603840   type(vv)==<type 'str'>  
    
    Entrer une chaîne (aucun caractère, pour arrêter) : a  
    x==a  id(x)==10702288   type(x)==<type 'str'>  
    b==3  id(b)==10021744   type(b)==<type 'int'>  
    
    Entrer une chaîne (aucun caractère, pour arrêter) : vv  
    x==vv  id(x)==18566992   type(x)==<type 'str'>  
    b==ululu  id(b)==18603840   type(b)==<type 'str'>  
    
    Entrer une chaîne (aucun caractère, pour arrêter) : GGG  
    x==GGG  id(x)==18566968   type(x)==<type 'str'>  
    Aucun identifiant 'GGG' n'est recensé dans ce code  
    
    Entrer une chaîne (aucun caractère, pour arrêter) : a  
    x==a  id(x)==10702288   type(x)==<type 'str'>  
    b==3  id(b)==10021744   type(b)==<type 'int'>  
    
    Entrer une chaîne (aucun caractère, pour arrêter) : e  
    x==e  id(x)==10700752   type(x)==<type 'str'>  
    b==10  id(b)==10021660   type(b)==<type 'int'>  
    
    Entrer une chaîne (aucun caractère, pour arrêter) : vv  
    x==vv  id(x)==18566968   type(x)==<type 'str'>  
    b==ululu  id(b)==18603840   type(b)==<type 'str'>  
    
    Entrer une chaîne (aucun caractère, pour arrêter) :   
    x==  id(x)==10699552   type(x)==<type 'str'>


    Au sein d'un bloc (fonction, ou classe), la fonction locals() renvoie un dictionnaire qui exprime l'espace de noms local à ce bloc.

    Attention, car locals() dans une fonction référence les identifiants libres = ceux utilisés dans la fonction mais définis à l'extérieur de la fonction,
    mais locals() ne référence pas les identifiants libres au sein des méthodes d'une classe (qui sont à peu près des fonctions mais pas tout à fait).

    Cf pages essentielles à lire:

    https://docs.python.org/3/reference/executionmodel.html#naming-and-binding

    https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces
    1. En VBS, il y a Exec et Eval, en Python, je sais pas. Ce genre de truc n'est pas souvent possible, mais tu.doit pouvoir te débrouiller avec un tableau de variables.
      1. Salut

        En Python, on ne se débrouille pas, on a ce qu'il faut à disposition: les fonctions locals() et globals() sont toutes prêtes à fournir les dictionnaires adéquats à ce genre de problèmes.
        Encore faut il avoir compris un peu les espaces de noms et connaître l'existence de la table des symboles ( https://docs.python.org/3/library/symtable.html ), les pythonistes me semblent loin d'être tous dans ce cas hélas
    2. Modérateur
      Utilise la fonction exec
      Cette fonction est évidemment DANGEREUSE.
      Exemple:
      johand@osiris: ~/src/CCM/python $ cat exec_test.py 
      # -*- coding: utf-8 -*-
      a="Ma valeur"
      
      varname = raw_input("Une chaine: ")[0:1]
      command = varname + " = a"
      print(command)
      exec(command)
      print(varname + " vaut \"" + eval(varname) + "\"")
      
      johand@osiris: ~/src/CCM/python $ python exec_test.py 
      Une chaine: bcde    
      b = a
      b vaut "Ma valeur"</gras>


      Attention en Python 3 , la fonction raw_input est remplacée par input
      1. salut

        Comme tu ajoutes " = a" , la valeur de la chaîne nommée commande se termine toujours par " = a" et donc exec(command) fait toujours prendre à l'objet de nom varname la valeur de l'objet de nom a

        Ce que veut niddhog, c'est justement de pouvoir spécifier qu'il faudrait ajouter " = v" quand il entre la lettre v, ajouter " = juju" quand il entre la chaîne juju, etc.

        D'autre part, je ne comprends pas la motivation de [0:1]
      2. Modérateur
        A toi à adapter bien sûr.
        Le slice est là en exemple.
        Si tu ne prends pas un minimum de sécurité, n'importe quel code peut être exécuté !
      3. Tu n'as pas compris le problème.
        Dit autrement, ton code donne toujours le même résultat, quel que soit ce qui est entré comme chaîne:

        j''ai ajouté une instruction z = "Autre" dans ton code

        a="Ma valeur"  
        z = "Autre"  
        
        varname = raw_input("Une chaine: ")  
        
        command = varname + " = a"  
        print(command)   
        exec(command)  
        print(varname + " vaut \"" + eval(varname) + "\"")

        et voici ce qu'on obtient quand on entre la chaîne 'z' lors d'une exécution:

        Une chaine: z  
        z = a  
        z vaut "Ma valeur"


        niddhog voudrait obtenir "Autre" dans ce cas.
      4. Soit dit en passant, c'est bien gentil de dire "à toi d'adapter" mais tant que tu n'as pas essayé d'adapter toi même, tu ne te rends pas compte que ça ne marche pas et que la réponse n'en est pas une
    3. Merci beaucoup de toutes vos réponses, je ne suis encore qu'en phase d'apprentissage du python, alors je vais un peu étudier les fonctions dont vous m'avez parlés pour parfaire mes connaissances =)

      Encore merci de m'avoir consacré du temps pour me répondre.