[Python] Variables a assimiler

Résolu
nidhogg-59 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   -  
nidhogg-59 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   -

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

heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
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
2
antoine1023 Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   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.
0
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
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
0
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
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
0
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
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]
0
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
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é !
0
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
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.
0
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
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
0
nidhogg-59 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   28
 
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.
0