7
sys.settrace呼び出し内の関数引数の値を調べるにはどうすればよいですか?引数を除いてすべてのもの(行、ファイル名、スタックトレース、戻り値など)を出力する可能性があるようです。関数の引数の値も追跡できる回避策がありますか?Pythonのsys.settraceの関数引数を表示
sys.settrace呼び出し内の関数引数の値を調べるにはどうすればよいですか?引数を除いてすべてのもの(行、ファイル名、スタックトレース、戻り値など)を出力する可能性があるようです。関数の引数の値も追跡できる回避策がありますか?Pythonのsys.settraceの関数引数を表示
コードオブジェクトとフレームオブジェクトの組み合わせを使用できます。
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", "!")
実現するための重要な事は
f_locals
として、フレーム内のすべてのローカル変数を見ることができるということです。f_code.co_varnames
から抽出することができます。
トレースされた各関数の戻り値を出力する方法は? – river
戻り値をキャッチするには、[docs](https://docs.python.org/3.5/library/sys.html#sys.settrace)のように 'msg == 'return''をチェックします。返される値は 'arg'になります。 – marc