« 日記 |Main| PythonでYコンビネータを勉強 »

« PythonとXML-RPCとグラフ可視化ソフトGRINEditを使ったCollatz角谷問題の計算ステップが最大になる数の求め方 | Python | PythonでYコンビネータを勉強 »

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()) と書くといいでしょう。

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/189

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.