¿Cómo se puede imprimir un nombre de variable en Python? [duplicar]
Digamos que tengo una variable cuyo nombre choice
es 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_param
y accede al archivo y encuentra el parámetro.
Creo que evitaré el problema por completo leyendo el archivo . config
archivo 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!
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.
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.
Si estás intentando hacer esto, significa que estás haciendo algo mal. Considere usar a dict
en 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