160 votes

Comment obtenir la valeur d'une variable à partir de son nom dans une chaîne de caractères ?

Pour simplifier, il s'agit d'une version simplifiée de ce que je veux faire :

def foo(a):
    # I want to print the value of the variable
    # the name of which is contained in a

Je sais comment faire cela en PHP :

function foo($a) {
    echo $$a;
}

global $string = "blah"; // might not need to be global but that's irrelevant
foo("string"); // prints "blah"

Y a-t-il un moyen de le faire ?

242voto

Edward Loper Points 5936

Si c'est une variable globale, alors vous pouvez le faire :

>>> a = 5
>>> globals()['a']
5

Une remarque à propos des différentes solutions "eval" : vous devez être prudent avec eval, surtout si la chaîne que vous évaluez provient d'une source potentiellement non fiable -- sinon, vous pourriez finir par effacer tout le contenu de votre disque ou quelque chose comme ça si on vous donne une chaîne malveillante.

(S'il n'est pas global, vous devrez avoir accès à l'espace de noms dans lequel il est défini. Si vous ne l'avez pas, il n'y a aucun moyen d'y accéder).

88voto

eresonance Points 1047

La réponse d'Edward Loper ne fonctionne que si la variable se trouve dans le module actuel. Pour obtenir une valeur dans un autre module, vous pouvez utiliser getattr :

import other
print getattr(other, "name_of_variable")

https://docs.python.org/3/library/functions.html#getattr

8 votes

Et si vous voulez utiliser cette méthode pour obtenir une valeur dans le même module que celui que vous appelez getattr() utiliser import sys; sys.modules[__name__] pour obtenir une référence au module actuel.

1 votes

Avez-vous une alternative pour python3 ?

0 votes

@GuillermoMosse non, cela devrait être la même chose : docs.python.org/3.8/library/functions.html#getattr

56voto

stark Points 4072

En supposant que vous savez que la chaîne de caractères est sûre à évaluer, alors eval donnera la valeur de la variable dans le contexte actuel.

>>> string = "blah"
>>> string
'blah'
>>> x = "string"
>>> eval(x)
'blah'

23voto

maxm Points 767
>>> x=5
>>> print eval('x')
5

tada !

20 votes

Les failles de sécurité : " tada ! ".

0 votes

@Sapphire_Brick pour être juste, tant que le str qui est évalué est une constante, cela ne devrait pas être un gros problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X