2011-07-08 25 views
20

我想從被調用函數中從Python中檢索局部變量。有沒有辦法做到這一點?我意識到這是不適合大多數編程,但我基本上構建一個調試器。例如:從Python調用名稱空間獲取本地人

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

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

我在的身上放什麼?如果我必須修改調用語句,我可以進行的最小修改是什麼?

注意:當位於與其調用者不同的模塊中時,它必須工作。

回答

51

如果你正在寫一個調試器,你要大量使用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

不錯,看起來不錯。 – Peter

+0

超級有用。謝謝。 –

+0

耶!我發現你的解決方案在遇到重要的性能問題後可以使用另一種解決方案:'caller = inspect.stack()[1] [0]; myvars = caller.f_locals'。你的方式要快得多。 – TheGerm

-1

您使用Python內置,DIR()或增值經銷商():

VARS(對象)

對於使用DIR(實施例),見:this post

實例使用瓦爾:

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

在可能有問題的事實:新樣式類不返回相同的結果

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

另外:對於一個實例化類(新和舊的風格),如果你實例化後添加一個變量,乏將返回對象的字典這樣的:

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

請參見:http://docs.python.org/library/functions.html#vars

+2

這並不回答問題,OP希望opciteite位於func_1內部,如果您調用func_2,則可以從func_1看到所有當地人。 – PsyKzz

相關問題