[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
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
A voir également:
- [Python] Variables a assimiler
- Citizen code python avis - Accueil - Outils
- Trouver la position d'un élément dans une liste python ✓ - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Geometry dash python ✓ - Forum Python
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
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.
une exécution du code ci-dessus:
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
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
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
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.
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
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
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
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
20 juin 2012 à 14:56
Utilise la fonction exec
Cette fonction est évidemment DANGEREUSE.
Exemple:
Attention en Python 3 , la fonction raw_input est remplacée par input
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
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
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]
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]
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
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é !
Le slice est là en exemple.
Si tu ne prends pas un minimum de sécurité, n'importe quel code peut être exécuté !
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
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
et voici ce qu'on obtient quand on entre la chaîne 'z' lors d'une exécution:
niddhog voudrait obtenir "Autre" dans ce cas.
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.
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
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
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
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.
Encore merci de m'avoir consacré du temps pour me répondre.