2015-09-16 16 views
7

sys.settrace呼び出し内の関数引数の値を調べるにはどうすればよいですか?引数を除いてすべてのもの(行、ファイル名、スタックトレース、戻り値など)を出力する可能性があるようです。関数の引数の値も追跡できる回避策がありますか?Pythonのsys.settraceの関数引数を表示

答えて

9

コードオブジェクトとフレームオブジェクトの組み合わせを使用できます。

Python Data-Model Referenceのこれらの説明を参照してください。

import sys 

def fn(frame, msg, arg): 
    if msg != 'call': return 
    # Filter as appropriate 
    if frame.f_code.co_filename.startswith("/usr"): return 
    print("Called", frame.f_code.co_name) 
    for i in range(frame.f_code.co_argcount): 
     name = frame.f_code.co_varnames[i] 
     print(" Argument", name, "is", frame.f_locals[name]) 

sys.settrace(fn) 

def hai(a, b, c): 
    print(a, b, c) 

hai("Hallo", "Welt", "!") 

実現するための重要な事は

  1. 我々はf_localsとして、フレーム内のすべてのローカル変数を見ることができるということです。
  2. パラメータリスト内の変数名をf_code.co_varnamesから抽出することができます。
+0

トレースされた各関数の戻り値を出力する方法は? – river

+0

戻り値をキャッチするには、[docs](https://docs.python.org/3.5/library/sys.html#sys.settrace)のように 'msg == 'return''をチェックします。返される値は 'arg'になります。 – marc

関連する問題