2011-07-08 10 views
20

Deseo recuperar las variables locales de Python de una función llamada. ¿Hay alguna manera de hacer esto? Me doy cuenta de que esto no es correcto para la mayoría de los programas, pero básicamente estoy creando un depurador. Por ejemplo:Obtener locales del espacio de nombres de llamadas en Python

def show_locals(): 
    # put something in here that shows local_1. 

local_1 = 123 
show_locals() # I want this to show local_1. 

¿Qué debo poner en el cuerpo de ? Si tengo que modificar la declaración de llamada, ¿cuál es la modificación mínima que puedo hacer?

Nota: esto debe funcionar cuando está en un módulo diferente a su llamador.

Respuesta

51

Si estás escribiendo un depurador, tendrá que hacer un uso intensivo del módulo inspect:

def show_callers_locals(): 
    """Print the local variables in the caller's frame.""" 
    import inspect 
    frame = inspect.currentframe() 
    try: 
     print(frame.f_back.f_locals) 
    finally: 
     del frame 
+1

bonito, bien parecido. – Peter

+0

Súper útil. Gracias. –

+0

¡Yay! Encontré su solución después de encontrar problemas significativos de rendimiento con una solución alternativa: 'caller = inspect.stack() [1] [0]; myvars = caller.f_locals'. Tu camino es MUCHO más rápido. – TheGerm

-1

utiliza la orden interna pitón, dir() o vars():

vars (objeto)

Para ejemplos utilizando dir(), consulte: this post

Ejemplos usando vars:

>>> class X: 
...  a=1 
...  def __init__(self): 
...   b=2 
... 
>>> 
>>> vars(X) 
{'a': 1, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x100488848>} 
>>> 
>>> vars(X()) 
{} 

Un hecho potencialmente problemático: Nuevas clases de estilo no devuelven el mismo resultado

>>> class X(object): 
...  a=1 
...  def __init__(self): 
...   b=2 
... 
>>> 
>>> vars(X) 
<dictproxy object at 0x1004a1910> 
>>> vars(X()) 
{} 

también: para una clase instanciada (estilo nuevo y viejo), si se agrega una variable después de instanciar, vars volverá dict del objeto así:

>>> x = X() 
>>> x.c = 1 
>>> vars(x) 
{'c': 1} 
>>> 

Ver: http://docs.python.org/library/functions.html#vars

+2

Esto no responde la pregunta, el OP quiere el opresite en el interior de func_1, si llamas a func_2 puedes ver a todos los locales desde func_1. – PsyKzz

Cuestiones relacionadas