クラスのインスタンス変数の1つで何かが起こっています。変数をプロパティにしたいのですが、変数にアクセスするたびに、その時点までのすべてのコードのスタックトレースを出力して、どこがいじられているのかを確認したいと思います。例外が発生していないときにスタックトレースを出力するにはどうすればよいですか?例外があるかどうかはわかっていますが、traceback.format_tb(sys.exc_info()[2])
のようなことができます。
また、最初のいくつかはおそらくそれほど面白くないので、最後の3〜4レベルのみを印刷することも役立つでしょう。
_>>> def f():
... def g():
... traceback.print_stack()
... g()
...
>>> f()
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in f
File "<stdin>", line 3, in g
_
編集: extract_stack を使用してスライス(例:最初の5つのレベルを除外する場合は_stack[5:]
_)を使用し、 format_list を使用して印刷可能なスタックトレースを取得することもできます( '\n'.join(traceback.format_list(...))
)
Stdoutに出力する代わりに、ロガーに渡す文字列が必要な場合は、次を使用できます。
''.join(traceback.format_stack())
Traceback.format_stack()はスタックトレースをフォーマットされた文字列のリストとして返すため、好きなようにスライスできることに注意してください。スタックトレースの最後のいくつかの要素を取得するには、次のようにします。
''.join(traceback.format_stack()[-N:])
ここで、Nは関心のあるレベルの数です。