[Python] Variables a assimiler

Résolu/Fermé
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 - Modifié par nidhogg-59 le 20/06/2012 à 12:21
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 - 20 juin 2012 à 18:43

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 mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 20/06/2012 à 15:03
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 mardi 19 juin 2012 Statut Membre Dernière intervention 20 juin 2012 1
20 juin 2012 à 14:13
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 mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
20 juin 2012 à 15:30
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 dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
20 juin 2012 à 14:56
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 mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 20/06/2012 à 15:37
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 dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
20 juin 2012 à 15:19
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 mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 20/06/2012 à 15:35
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 mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
20 juin 2012 à 15:36
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 mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 27
20 juin 2012 à 18:43
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