127 votes

Comment imprimer le nom d'une variable en python ?

Supposons que j'aie une variable nommée choice Comment puis-je accéder au nom de la variable ? Quelque chose d'équivalent à

In [53]: namestr(choice)
Out[53]: 'choice'

pour l'élaboration d'un dictionnaire. Il y a une bonne façon de faire et je ne l'ai pas trouvée.

EDIT :

La raison en est la suivante. J'effectue des analyses de données dans lesquelles j'appelle le programme avec plusieurs paramètres que j'aimerais modifier, ou non, au moment de l'exécution. Je lis les paramètres que j'ai utilisés lors de la dernière exécution à partir d'un fichier .config qui se présente comme suit

filename
no_sig_resonance.dat

mass_peak
700

choice
1,2,3

Lorsqu'une valeur est demandée, la valeur utilisée précédemment est affichée et une chaîne vide utilise la valeur utilisée précédemment.

Ma question se pose parce que lorsqu'il s'agit d'écrire le dictionnaire dans lequel ces valeurs ont été scannées. Si un paramètre est nécessaire, je lance get_param qui accède au fichier et trouve le paramètre.

Je pense que je vais éviter le problème en lisant le . config une fois et de produire un dictionnaire à partir de ce fichier. J'ai évité cela à l'origine pour... des raisons dont je ne me souviens plus. Une situation idéale pour mettre à jour mon code !

4voto

Nikhil Chelliah Points 3463

Avec l'évaluation dynamique, les variables se transforment essentiellement en valeurs chaque fois que vous les regardez (pour paraphraser). Cela dit, Python dispose d'une fonction intégrée espaces nominatifs . Par exemple, locals() renvoie un dictionnaire associant les noms des variables d'une fonction à leurs valeurs, et globals() fait de même pour un module. Ainsi, la fonction

for name, value in globals().items():
    if value is unknown_variable:
        ... do something with name

Notez que vous n'avez pas besoin d'importer quoi que ce soit pour pouvoir accéder aux fonctions locals() et globals().

De plus, s'il existe plusieurs alias pour une valeur, l'itération dans un espace de noms ne trouve que le premier.

4voto

myroslav Points 1645

Un tel système vous conviendrait-il ?

>>> def namestr(**kwargs):
...     for k,v in kwargs.items():
...       print "%s = %s" % (k, repr(v))
...
>>> namestr(a=1, b=2)
a = 1
b = 2

Et dans votre exemple :

>>> choice = {'key': 24; 'data': None}
>>> namestr(choice=choice)
choice = {'data': None, 'key': 24}
>>> printvars(**globals())
__builtins__ = <module '__builtin__' (built-in)>
__name__ = '__main__'
__doc__ = None
namestr = <function namestr at 0xb7d8ec34>
choice = {'data': None, 'key': 24}

3voto

James Brady Points 11646

En ce qui concerne la question révisée de la lecture des paramètres de configuration, je vous recommande vivement d'économiser du temps et des efforts et d'utiliser la fonction ConfigParser ou (mon outil préféré) ConfigObj .

Ils peuvent faire tout ce dont vous avez besoin, ils sont faciles à utiliser et quelqu'un d'autre s'est déjà préoccupé de savoir comment les faire fonctionner correctement !

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