¿Cómo se puede imprimir un nombre de variable en Python? [duplicar]

Resuelto physicsmichael asked hace 15 años • 8 respuestas

Digamos que tengo una variable cuyo nombre choicees igual a 2. ¿Cómo accedería al nombre de la variable? Algo equivalente a

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

para utilizarlo en la creación de un diccionario. Hay una buena manera de hacer esto y simplemente me estoy perdiendo.

EDITAR:

La razón para hacer esto es la siguiente. Estoy ejecutando algunas cosas de análisis de datos en las que llamo al programa con múltiples parámetros que me gustaría modificar, o no modificar, en tiempo de ejecución. Leí los parámetros que utilicé en la última ejecución desde un archivo .config formateado como

filename
no_sig_resonance.dat

mass_peak
700

choice
1,2,3

Cuando se le solicitan valores, se muestra el utilizado anteriormente y una entrada de cadena vacía utilizará el valor utilizado anteriormente.

Mi pregunta surge porque cuando se trata de escribir el diccionario en el que se han escaneado estos valores. Si se necesita un parámetro, lo ejecuto get_paramy accede al archivo y encuentra el parámetro.

Creo que evitaré el problema por completo leyendo el archivo . configarchivo una vez y producir un diccionario a partir de eso. Evité eso originalmente por... razones que ya no recuerdo. ¡Situación perfecta para actualizar mi código!

physicsmichael avatar Feb 27 '09 05:02 physicsmichael
Aceptado

Si insistes, aquí tienes una horrible solución basada en inspección.

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)

Espero que te inspire a reevaluar el problema que tienes y buscar otro enfoque.

Constantin avatar Feb 26 '2009 23:02 Constantin

Para responder a su pregunta original:

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

Ejemplo:

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

Como ya señaló @rbright, hagas lo que hagas, probablemente haya mejores formas de hacerlo.

jfs avatar Feb 26 '2009 23:02 jfs

Si estás intentando hacer esto, significa que estás haciendo algo mal. Considere usar a dicten su lugar.

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

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

Producción:

Name: b val: 2
recursive avatar Feb 26 '2009 22:02 recursive