#
2 どのように動作しているか

いくつかの変更がインタプリタへ加えられました:

- `sys.settrace(func)`がグローバルトレース関数を設定します
- そこで、ローカルトレース関数を使うこともできます(後ろを参照)

トレース関数は三つの引数、 frame、eventおよびarg を持ちます。 frameは現在のスタックフレームです。 eventは文字列で、`'call'`、`'line'`、`'return'`、 `'exception'`、`'c_call'`、`'c_return'` または`'c_exception'`です。 argはイベント型に依存します。

新しいローカルスコープに入ったときはいつでも、グローバルトレース関数が(`'call'`に設定されたeventとともに)呼び出されます。そのスコープで用いられるローカルトレース関数への参照を返すか、またはスコープがトレースされるべきでないならば`None`を返します。

ローカルトレース関数はそれ自身への(あるいは、さらにそのスコープ内でさらにトレースを行うための他の関数への)参照を返します。または、そのスコープにおけるトレースを停止させるために`None`を返します。

トレース関数としてインスタンスメソッドが受け入れられます(また、とても便利です)。

イベントは以下のような意味を持ちます:

`'call'`
  関数が呼び出されます(または、他のコードブロックに入ります)。グローバルトレース関数が呼び出されます。argは`None`です。戻り値はローカルトレース関数を指定します。

`'line'`
  インタプリタがコードの新しい行を実行しようとしているところです(ときどき、一行に複数行イベントが存在します)。ローカルトレース関数が呼び出されます。argは`None`です。戻り値は新しいローカルトレース関数を指定します。

`'return'`
  関数(または、コードブロック)が返ろうとしているところです。ローカルトレース関数が呼び出されます。argは返るであろう値です。トレース関数の戻り値は無視されます。

`'exception'`
  例外が生じています。ローカルトレース関数が呼び出されます。argは三要素の`(exception, value, traceback)`です。戻り値は新しいローカルトレース関数を指定します。

`'c_call'`
  拡張モジュールまたは組み込みの C 関数が呼び出されようとしています。 arg は C 関数オブジェクトです。

`'c_return'`
  C 関数が処理を戻しました。arg は`None` です。

`'c_exception'`
  C 関数が例外を送出しました。arg は`None` です。

例外が一連の呼び出し元を伝えられて行くときに、`'exception'`イベントは各レベルで生成されることことに注意してください。

コードとフレームオブジェクトについてさらに情報を得るには、Python Reference Manualを参照してください。