2011-07-08 11 views
20

Chcę pobrać zmienne lokalne z Pythona z wywołanej funkcji. Czy jest jakiś sposób to zrobić? Rozumiem, że nie jest to odpowiednie dla większości programów, ale zasadniczo buduję debugger. Na przykład:Uzyskaj locals od wywoływania przestrzeni nazw w Pythonie

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

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

Co mam umieścić w ciele ? Jeśli muszę zmodyfikować instrukcję wywołania, jaka jest minimalna modyfikacja, którą mogę wykonać?

Uwaga: to musi działać, gdy jest w innym module do swojego rozmówcy.

Odpowiedz

51

Jeśli piszesz debuggera, będziemy chcieli, aby intensywne użytkowanie modułu 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

ładne, dobrze wyglądające. – Peter

+0

Super pomocny. Dzięki. –

+0

Yay! Znalazłem twoje rozwiązanie po wystąpieniu poważnych problemów z wydajnością z alternatywnym rozwiązaniem: 'caller = inspect.stack() [1] [0]; myvars = caller.f_locals'. Twoja droga jest DUŻO szybsza. – TheGerm

-1

użyć polecenie wbudowane Pythona, dir() lub Vars():

zmiennych (obiekt)

przykłady wykorzystaniem dir(), patrz: this post

przykład za pomocą 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()) 
{} 

Potencjalnie problematyczne fakt: zajęcia Nowe style nie zwracają ten sam wynik

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

także: dla klas instancja (nowego i starego stylu), jeśli dodać zmienną po uruchamianiu, Vars powróci danego obiektu DICT tak:

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

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

+2

To nie odpowiada na pytanie, OP chce oppersite, gdzie w func_1, jeśli wywołasz func_2, możesz zobaczyć wszystkich locals z func_1. – PsyKzz