2011-07-08 2 views
20

Je souhaite récupérer les variables locales de Python à partir d'une fonction appelée. Est-ce qu'il y a un moyen de faire ça? Je réalise que ce n'est pas bon pour la plupart des programmations, mais je suis en train de construire un débogueur. Par exemple:Récupère les locals de l'espace de noms appelant 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. 

Que dois-je mettre dans le corps de ? Si je dois modifier la déclaration d'appel, quelle est la modification minimale que je peux faire?

Remarque: cela doit fonctionner lorsque se trouve dans un module différent de celui de l'appelant.

Répondre

51

Si vous écrivez un débogueur, vous aurez envie de faire un usage intensif du module 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

agréable, l'air bien. – Peter

+0

Super utile. Merci. –

+0

Yay! J'ai trouvé votre solution après avoir rencontré des problèmes de performances significatifs avec une solution alternative: 'caller = inspect.stack() [1] [0]; myvars = caller.f_locals'. Votre chemin est BEAUCOUP plus rapide. – TheGerm

-1

Vous utilisez la commande interne python, dir() ou vars():

vars (objet)

Pour des exemples d'utilisation dir(), voir: this post

Exemples d'utilisation 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 fait potentiellement problématique: nouvelles classes de style ne retournent pas le même résultat

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

aussi: pour une classe instanciée (nouveau style et vieux), si vous ajoutez une variable après l'instanciation, VARS retour dict de l'objet comme celui-ci:

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

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

+2

Cela ne répond pas à la question, l'OP veut l'oppersite où à l'intérieur de func_1, si vous appelez func_2 vous pouvez voir tous les locaux de func_1. – PsyKzz

Questions connexes