##
3.11.4 インタープリタ スタック

以下の関数には、戻り値として``フレームレコード''を返す関数があります。`` フレームレコード''は長さ6のタプルで、以下の値を格納しています:フレームオ ブジェクト・ファイル名・実行中の行番号・関数名・コンテキストのソース行の リスト・ソース行リストの実行中行のインデックス。

警告:

フレームレコードの最初の要素などのフレームオブジェクトへの参照を保存する と、循環参照になってしまう場合があります。循環参照ができると、Pythonの循 環参照検出機能を有効にしていたとしても関連するオブジェクトが参照している すべてのオブジェクトが解放されにくくなり、明示的に参照を削除しないとメモ リ消費量が増大する恐れがあります。

参照の削除をPythonの循環参照検出機能にまかせる事もできますが、 `finally`節で循環参照を解除すれば確実にフレーム（とそのローカル 変数）は削除されます。また、循環参照検出機能はPythonのコンパイルオプショ ンや``gc`. disable()`で無効とされている場合があります ので注意が必要です。例：

    def handle_stackframe_without_leak():
        frame = inspect.currentframe()
        try:
            # do something with the frame
        finally:
            del frame

以下の関数でオプション引数contextには、戻り値のソース行リストに何 行分のソースを含めるかを指定します。ソース行リストには、実行中の行を中心 として指定された行数分のリストを返します。

`getframeinfo`( | frame[, context])

  フレーム又はトレースバックオブジェクトの情報を取得します。フレームレ コードの先頭要素を除いた、長さ5のタプルを返します。

`getouterframes`( | frame[, context])

  指定したフレームと、その外側の全フレームのフレームレコードを返します。 外側のフレームとはframeが生成されるまでのすべての関数呼び出しを 示します。戻り値のリストの先頭はframeのフレームレコードで、末尾 の要素はframeのスタックにあるもっとも外側のフレームのフレームレ コードとなります。

`getinnerframes`( | traceback[, context])

  指定したフレームと、その内側の全フレームのフレームレコードを返します。 内のフレームとはframeから続く一連の関数呼び出しを示します。戻り 値のリストの先頭はtracebackのフレームレコードで、末尾の要素は例 外が発生した位置を示します。

`currentframe`( | )

  呼び出し元のフレームオブジェクトを返します。

`stack`( | [context])

  呼び出し元スタックのフレームレコードのリストを返します。最初の要素は呼 び出し元のフレームレコードで、末尾の要素はスタックにあるもっとも外側の フレームのフレームレコードとなります。

`trace`( | [context])

  実行中のフレームと処理中の例外が発生したフレームの間のフレームレコード のリストを返します。最初の要素は呼び出し元のフレームレコードで、末尾の 要素は例外が発生した位置を示します。