¿Cómo recuperar el nombre de una variable en python en tiempo de ejecución?

¿Hay alguna forma de saber, durante el tiempo de ejecución, el nombre de una variable (a partir del código)? ¿O se olvidan los nombres de las variables durante la comstackción (código de bytes o no)?

p.ej:

 >>> vari = 15
 >>> imprimir vari. ~~ nombre ~~ ()
 'vari'

Nota : estoy hablando de variables de tipo de datos simples ( int , str , list , etc.)

aquí, una función básica (tal vez extraña) que muestra el nombre de su argumento … la idea es analizar el código y buscar las llamadas a la función (agregada en el método init podría ayudar a encontrar el nombre de la instancia, aunque con una análisis de código más complejo)

 def display(var): import inspect, re callingframe = inspect.currentframe().f_back cntext = "".join(inspect.getframeinfo(callingframe, 5)[3]) #gets 5 lines m = re.search("display\s+\(\s+(\w+)\s+\)", cntext, re.MULTILINE) print m.group(1), type(var), var 

tenga en cuenta: obtener varias líneas del código de llamada ayuda en caso de que la llamada se dividió como en el siguiente ejemplo:

 display( my_var ) 

pero producirá un resultado inesperado en esto:

 display(first_var) display(second_var) 

Si no tiene control sobre el formato de su proyecto, aún puede mejorar el código para detectar y administrar diferentes situaciones …

En general, creo que un análisis de código estático podría producir un resultado más confiable, pero soy demasiado perezoso para comprobarlo ahora

Los nombres de las variables no se olvidan, puede acceder a las variables (y ver qué variables tiene) por introspección, por ejemplo

 >>> i = 1 >>> locals()["i"] 1 

Sin embargo, debido a que no hay punteros en Python, no hay forma de hacer referencia a una variable sin escribir su nombre. Entonces, si desea imprimir un nombre de variable y su valor, puede ir a través de locals() o una función similar. ( [i] convierte en [1] y no hay forma de recuperar la información de que el 1 proviene realmente de i .)

Los nombres de las variables persisten en el código comstackdo (así es como, por ejemplo, puede funcionar el dir incorporado), pero la asignación que hay allí va de un nombre a otro, no al revés. Entonces, si hay varias variables que valen la pena, por ejemplo, 23 , no hay forma de decirlas una de la otra base solo sobre el valor 23 .

Aquí hay una función que utilizo para imprimir el valor de las variables, funciona tanto para locales como para globales:

 import sys def print_var(var_name): calling_frame = sys._getframe().f_back var_val = calling_frame.f_locals.get(var_name, calling_frame.f_globals.get(var_name, None)) print (var_name+':', str(var_val)) 

Entonces el siguiente código:

 global_var = 123 def some_func(): local_var = 456 print_var("global_var") print_var("local_var") print_var("some_func") some_func() 

produce:

 global_var: 123 local_var: 456 some_func:  

Esto funcionará para tipos de datos simples (str, int, float, lista, etc.)

 def my_print(var_str) : print var_str+':', globals()[var_str] 

Puedes hacerlo, simplemente no es bonito.

 import inspect, sys def addVarToDict(d, variable): lineNumber = inspect.currentframe().f_back.f_lineno with open(sys.argv[0]) as f: lines = f.read().split("\n") line = lines[lineNumber-1] varName = line.split("addVarToDict")[1].split("(")[1].split(",")[1].split(")")[0].strip() d[varName] = variable d = {} a=1 print d # {} addVarToDict(d,a) print d # {'a': 1} 

Intenté el siguiente enlace de la publicación anterior sin éxito: Google devolvió este.

http://pythonic.pocoo.org/2009/5/30/finding-objects-names

Ayer mismo vi una publicación de blog con código de trabajo que hace justamente esto. Aquí está el enlace:

http://pyside.blogspot.com/2009/05/finding-objects-names.html