17章「デバッグ」の対策ポイントと例題
17章「デバッグ」からは本番40問中2問が出ます。pdb による対話的なデバッグと、例外情報・性能計測の読み方を問う章です。
- pdb
- breakpoint()
- traceback
- warnings
- timeit
- cProfile
この章の出題数と位置づけ
17章「デバッグ」からは本番40問のうち2問が出題されます。 全体に占める割合は5.0%で、15章中6番目タイの出題数です(同じ2問の章が他に7章あります)。 合格に必要なのは28問正解(12問まで不正解可)なので、 この章の2問をどこまで取りに行くかは、他の章との兼ね合いで決めるのが現実的です。
対策のポイント
- breakpoint() が pdb.set_trace() の新しい書き方であることと、pdb のコマンド(n / s / c / l / p)を押さえます。
- n(次の行へ)と s(関数の中に入る)の違いは、そのまま出題されます。
- traceback は下から上ではなく、上から下に呼び出しの深い方へ進む、という読み方を確認します。
- timeit は小さなコードの計測、cProfile は全体のプロファイル、という使い分けも範囲です。
この章の例題(3問)
当サイトで実際に出題している問題から3問を、正解と解説つきで掲載します。 すべて自作のオリジナル問題で、実際の試験問題ではありません。
例題1. Python 3.7 以降で、import なしにデバッガを起動できる組み込み関数はどれか。
- 正解breakpoint()
- debug()
- set_trace()
- trace()
解説: breakpoint() は組み込み関数で、既定では pdb.set_trace() を呼ぶ。環境変数 PYTHONBREAKPOINT で挙動を変えられ、0 を設定すると無効化できる。set_trace() 単体は pdb を import しないと使えない。
例題2. pdb で「現在の行を実行するが、関数呼び出しの中には入らずに次の行へ進む」コマンドはどれか。
- 正解n
- s
- c
- l
解説: n(next)は関数の中に入らない。s(step)は中に入る。c(continue)は次のブレークポイントまで進み、l(list)はソースを表示するだけ。
例題3. timeit モジュールの説明として誤っているものはどれか。
- 正解指定したコードの実行時間とメモリ使用量を測定できる
- timeit() と repeat() は計測対象を文字列でも関数でも渡せる
- repeat() は指定した回数分の結果をリストで返す
- timeit() は指定コードを複数回実行する
解説: timeit が測るのは時間だけ。メモリ使用量を調べたいなら tracemalloc など別のモジュールを使う。「時間の timeit、メモリの tracemalloc」と対で覚える。
この章は当サイトに全5問を収録しています。残りはドリルの「章別に解く」から解けます。