Slide 1

Slide 1 text

mypy駆動リファクタリング (みんなのPython勉強会#98) 桂川大輝

Slide 2

Slide 2 text

リファクタリングにおける理想と問題 ● リファクタリング ○ 処理の振る舞いを変えずにソースコードの構造を整理すること ○ ソースコードの可読性や堅牢性の向上を実現 ● 理想:メリットとコストの適切なバランスを実現 ● 問題:目標の設定が困難/解釈の相違が発生 ○ メリットの不足 ○ コストの超過(メリットの超過) ● 提案:ツールを活用した目標の設定と評価の導入 2

Slide 3

Slide 3 text

mypy駆動リファクタリング ● mypy[1] ○ Pythonの静的型チェッカ ○ チェックに従うことでソースコードの可読性と堅牢性が向上 ○ 詳細なチェック項目の設定が可能 ● mypy駆動リファクタリング ○ メリットとコストの適切なバランスを実現する目標を mypyの「詳細なチェック項目の設定」で表現 ○ mypyのチェック項目が満たされるまでリファクタリングを実施 (※mypyのチェック項目を満たした場合は終了) 3 [1] mypy - Optional Static Typing for Python(http://www.mypy-lang.org/)

Slide 4

Slide 4 text

mypy駆動リファクタリングのフロー(簡易版) 4 開始 mypyの チェック項目の選定 mypyの実行 mypyの出力に従って リファクタリング 終了 エラーが 存在する? はい いいえ

Slide 5

Slide 5 text

mypyのチェック項目の選定 ● mypyのチェック項目[2]を選定して実行コマンドか設定ファイルに反映 5 [2] The mypy command line - mypy 1.6.0 documentation(https://mypy.readthedocs.io/en/stable/command_line.html) pip install mypy mypy --disallow-untyped-defs app .py

Slide 6

Slide 6 text

mypyの実行 ● 「mypyのチェック項目の選定」に基づいてmypyを実行 6 # app.py def print_event_name (number) -> None: print(f"みんなのPython勉強会#{number}") mypy --disallow-untyped-defs app .py app.py:1: error: Function is missing a type annotation [no-untyped-def] Found 1 error in 1 file (checked 1 source file)

Slide 7

Slide 7 text

mypyの出力に従ってリファクタリング ● 「mypyの実行」による出力に従ってリファクタリング 7 # app.py def print_event_name (number: int) -> None: print(f"みんなのPython勉強会#{number}") app.py:1: error: Function is missing a type annotation [no-untyped-def] Found 1 error in 1 file (checked 1 source file)

Slide 8

Slide 8 text

mypyの実行(リファクタリング後) ● 「mypyのチェック項目の選定」に基づいてmypyを実行 8 mypy --disallow-untyped-defs app .py Success: no issues found in 1 source file # app.py def print_event_name (number: int) -> None: print(f"みんなのPython勉強会#{number}")

Slide 9

Slide 9 text

まとめ ● リファクタリングにおける理想と問題 ○ 理想:メリットとコストの適切なバランスを実現 ○ 問題:目標の設定が困難/解釈の相違が発生 ● mypy駆動リファクタリング ○ メリットとコストの適切なバランスを実現する目標を mypyの「詳細なチェック項目の設定」で表現 ○ mypyのチェック項目が満たされるまでリファクタリングを実施 (※mypyのチェック項目を満たした場合は終了) 9