はじめに
ちょっとデバッグ中にラムダ式の中のプログラムがどうなってるか確認したいケースがあったので、そのやり方について調べてみた。
状況
逐次二次計画法を使っていたのだが
事前に解く数式が分かっておらず入力によって変わるケースだったため、constraintに何が入ってるのかが実行時にしかわからず、デバッグがしにくかった。
そこで、constraintに代入していたラムダ式を確認できるようにしてみた。
結論
サンプル
import inspect
l = lambda x: x*x
print(inspect.getsource(l))
解説
そもそもinspectというモジュールに、実行中の様々な情報にアクセスするための関数を用意してくれている。
inspect は、活動中のオブジェクト (モジュール、クラス、メソッド、関数、トレースバック、フレームオブジェクト、コードオブジェクトなど) から情報を取得する関数を定義しており、クラスの内容を調べたり、メソッドのソースコードを取得したり、関数の引数リストを取り出して整形したり、詳細なトレースバックを表示するのに必要な情報を取得したりするために利用できます。
このモジュールの機能は4種類に分類することができます。型チェック、ソースコードの情報取得、クラスや関数からの情報取得、インタープリタのスタック情報の調査です。
今回は、
inspect.getsource(object)を使うことで、引数に渡したlambda式のソースコードが返えってきた。
ただ、再帰的にはたどってくれないようなので、lambdaの中で関数呼び出しとかをしていた場合、その中身を確認することはできない。
import inspect
def func(x):
return x * x
l = lambda x: func(x)
print(inspect.getsource(l))
例えば、上記の場合は、l = lambda x: func(x)
という出力になる。