2011-07-08 9 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

あなたはDIR(、Pythonの組み込みを使用する)またはVARS():

VARS(オブジェクト)DIRを(使用例について

)、参照:this post

例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()) 
{} 

潜在的に問題の事実:新スタイルクラスが

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

も同じ結果を返しません:インスタンス化されたクラス(新旧スタイル)のために、あなたがインスタンス化した後に変数を追加する場合は、返されますvarsはこのようなオブジェクトの辞書

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

を参照してください:http://docs.python.org/library/functions.html#vars

+2

これは質問に答えません、OPはoppersiteがfunc_1の中でどこにあるかを望んでいます、あなたがfunc_2を呼び出すと、func_1のすべての地元住民を見ることができます。 – PsyKzz

関連する問題