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 !

148voto

Constantin Points 12185

Si vous insistez, voici une horrible solution basée sur l'inspection.

import inspect, re

def varname(p):
  for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
    m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)', line)
    if m:
      return m.group(1)

if __name__ == '__main__':
  spam = 42
  print varname(spam)

J'espère qu'il vous incitera à réévaluer le problème que vous rencontrez et à chercher une autre approche.

107voto

J.F. Sebastian Points 102961

Pour répondre à votre question initiale :

def namestr(obj, namespace):
    return [name for name in namespace if namespace[name] is obj]

Exemple :

>>> a = 'some var'
>>> namestr(a, globals())
['a']

En tant que @rbright l'a déjà souligné quoi que vous fassiez, il y a probablement de meilleures façons de le faire.

17voto

recursive Points 34729

Si vous essayez de le faire, c'est que vous ne faites pas ce qu'il faut. Envisagez d'utiliser un dict au lieu de cela.

def show_val(vals, name):
    print "Name:", name, "val:", vals[name]

vals = {'a': 1, 'b': 2}
show_val(vals, 'b')

Sortie :

Name: b val: 2

10voto

Ryan Bright Points 2593

Plutôt que de demander des détails sur une solution spécifique, je vous recommande de décrire le problème auquel vous êtes confronté ; je pense que vous obtiendrez de meilleures réponses. Je dis cela parce qu'il y a certainement une meilleure façon de faire ce que vous essayez de faire. L'accès aux noms de variables de cette manière n'est généralement pas nécessaire pour résoudre des problèmes, quel que soit le langage utilisé.

Cela dit, tous les noms de variables sont déjà contenus dans des dictionnaires accessibles par le biais des fonctions intégrées locaux et globaux . Utilisez celui qui convient à la lunette que vous inspectez.

L'une des rares raisons courantes d'inspecter ces dictionnaires est de faciliter l'interpolation de chaînes de caractères :

>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe

Ce genre de choses tend à être un peu plus lisible que les autres solutions, même si cela nécessite d'inspecter les variables par leur nom.

9voto

Georg Schölly Points 63123

Vous ne pouvez pas, car il n'y a pas de variables en Python, mais seulement des noms.

Par exemple :

> a = [1,2,3]
> b = a
> a is b
True

Laquelle de ces deux variables est maintenant la bonne ? Il n'y a pas de différence entre a et b .

Il y a eu une question similaire avant.

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