狠狠撸

狠狠撸Share a Scribd company logo
他人の書いた Python スクリプトを
ステップ実行で理解する
2021-11-20
PyCon mini Shizuoka 2021
西本卓也 @24motz / @nishimotz
1
おまえ誰よ
? 広島 → 東京 → 京都 → 東京 → 広島
? 大学教員 → フリーランス/リモートワーク/エンジニア
? NVDA 日本語チーム
? 視覚障害者のための画面読み上げソフト
? PyCon mini Hiroshima / すごい広島 with Python
? Python Boot Camp
? TA : 広島、岡山、山口
2
夫婦 + 犬(8歳) + 猫(1歳)
アンナ ハコ
4
5
内容
? 素材
? Python Boot Camp テキストから引用改変
? デバッガの操作の基本
? Visual Studio Code の設定と機能
? Python におけるステップ実行
6
デバッガは(たぶん)不滅
7
デバッガとは (Wikipedia)
? デバッグ作業を支援するコンピュータプログラムのこと
? ブレークポイント
? ステップ実行
? ステップイン
? ステップオーバー
? ステップアウト
? 変数確認/変数書き換え
8
すべての行をステップ実行でカバーする
? ブレークポイント設定 → デバッグ開始 → ステップ実行 → 継
続
def fizzbuzz(num):
print('a')
print('b')
print('c')
print('d')
return num
for num in range(1, 101):
fizzbuzz(num)
1回目はステップインで
下の階層もステップ実行
2回目はステップオーバーして
下の階層に入らない
9
ステップオーバー
? 下の階層に入らないで1行ずつ実行
def fizzbuzz(num):
print('a')
print('b')
print('c')
print('d')
return num
for num in range(1, 101):
fizzbuzz(num)
10
ステップイン
? 下の階層にどんどん入りながら1行ずつ実行
def fizzbuzz(num):
print('a')
print('b')
print('c')
print('d')
return num
for num in range(1, 101):
fizzbuzz(num)
11
ステップアウト
? ひとつ上の階層に戻るまで実行
def fizzbuzz(num):
print('a')
print('b')
print('c')
print('d')
return num
for num in range(1, 101):
fizzbuzz(num)
上の階層で
1行分の処理が
終わった状態
12
ブレークポイント
? 関数の実行を止めたいなら中身の1行目がブレークポイント
def fizzbuzz(num):
print('a')
print('b')
print('c')
print('d')
return num
for num in range(1, 101):
fizzbuzz(num)
ここは関数が呼ばれるたびに止まる
def の次にここがステップ実行される
13
ステップ実行の始め方
? 他人が書いたコード
? デバッガそのものの練習になる
? 他の開発者のサポートやメンター
? デバッグ
? オープンソースのプログラムの勉強や改造
? 動かして理解する方が早い場合
? pip install したモジュール
? 後述
14
pdb : 標準装備のデバッガ
? OSC 2021 Online/Hiroshima (9月18日 陶山さん)
15
IDLEのデバッガ
16
Visual Studio Code + Python 拡張
17
18
メニューとショートカット
? F5 : デバッグの開始
? 必要であれば拡張機能のインストールから
? Shift+F5 : デバッグの停止
? F9 : ブレークポイント
? F10 : ステップオーバー
? F11 : ステップイン
? macOS は mission control の設定と衝突
? Shift+F11 : ステップアウト
19
インタープリターを選択
? 選択肢から選ぶだけ
20
デバッガで仮想環境(venv)を有効化
? インタープリターの選択肢として仮想環境を選ぶ
21
構成(configuration)
? Python File : 現在アクティブな Python ファイルをデバッグ
22
ブレークポイントを設定
? 行番号の左をクリックして赤いマルをつける (またはF9キー)
23
breakpoint() = pdb 互換
? 書いた行の直後の行で止まる
24
編集画面の右上の実行ボタンからも
25
ブレークポイントで停止した状態
? 継続 / ステップオーバー / ステップイン / ステップアウト / 再起動 / 停止
26
条件ブレークポイント
? 通過回数(ヒットカウント)
? 評価式
27
ログメッセージ : 出力だけ行う
? 出力先はデバッグコンソール
28
デバッグコンソール
? 式を入力すると値を表示できる
29
ウォッチ式
? 毎回デバッグコンソールで表示しなくても
30
launch.json : 構成を保存
31
自動生成される launch.json
? Syntax Error が出たらコメント行を削除
32
"cwd": "${fileDirname}"
? カレントディレクトリのファイル読み書きのデバッグなど
33
"justMyCode" : false
? requests の中もステップ実行
34
requests の connection pooling
35
Jupyter のデバッグ
? セルごとに Debug Cell できる
36
リスト内包表記
? ステップオーバーで何回止まる?
? 100回
[fizzbuzz(num) for num in range(1, 101)]
37
テストとステップ実行の相性
? doctest は動くが警告が出る
? テストツールによってはデバッガと衝突する可能性
38
5374 = 自治体のゴミの日がわかる
? 富士市
? fuji.5374.jp
? 広島市
? hiroshima.5374.jp
? iCal 対応に不具合
? 9月
? すごい広島 with Python で議論
? 富士市の convert_ical.py を使う検討
? データの持ち方やデプロイ方針が違うので手直し中
39
まとめ
? VS Code の Python デバッガ
? 無料
? エディタに一手間加えるだけで使える
? シンプル、追加ファイルは .vscode/launch.json だけ
? UIやプロトコルが言語に依存しない
? デバッガの作法は普遍的
? 視覚的なデバッガは嬉しい
? お気に入りの pip を読んで勉強しよう

More Related Content

211120 他人の書いたPythonスクリプトをステップ実行で理解する

Editor's Notes

  • #15: https://www.youtube.com/watch?v=525SyowtXH8&list=PL1EP7zsxqFT91hSv3akx7w_N3KhyOJi_d https://docs.python.org/ja/3/library/pdb.html
  • #35: https://stackoverflow.com/questions/34837026/whats-the-meaning-of-pool-connections-in-requests-adapters-httpadapter/34893364