Pythonで「例外が投げられた関数のローカル変数」を取得
ローカル変数は関数の外側から参照したり書き換えたりできない、というのはプログラムをモジュール化する上では非常に重要な特徴です。普通にプログラムを組む上では、この縛りを破るべきではないとは思います。 しかし、何か事件が起きたときにはルールに縛られずに思ったことができる力が欲しいですよね。例えば下のようなコード。
def someFunc(): 何かとても時間のかかる処理 ファイルを開いて処理の結果を出力
いざ計算が終わってファイルに出力する段になって「しまった、出力先のファイルをエディタで開いていたせいで書き込みモードで開くのに失敗した!」なんていうシチュエーション、ありますよね。そんなときに泣きながらもう一度計算をやり直さないでいい方法がこちら。
def getLocals():
import sys
tb = sys.last_traceback
while tb.tb_next:
tb = tb.tb_next
return tb.tb_frame.f_locals
これを対話型シェルに貼り付けて実行すれば、 getLocals()で例外の発生した関数のローカル変数が取得できるようになります。 たとえばresultという変数に結果が入っているのなら result = getLocals()["result"] などとやって変数を取得できます。なお、あまりおすすめはしませんがローカル変数を全部グローバル変数に変える(グローバルスコープに同じ名前の変数を作る)には globals().update(getLocals()) と書くといいでしょう。