みんなのPython勉強会#98( https://startpython.connpass.com/event/296755/ )
mypy駆動リファクタリング(みんなのPython勉強会#98)桂川大輝
View Slide
リファクタリングにおける理想と問題● リファクタリング○ 処理の振る舞いを変えずにソースコードの構造を整理すること○ ソースコードの可読性や堅牢性の向上を実現● 理想:メリットとコストの適切なバランスを実現● 問題:目標の設定が困難/解釈の相違が発生○ メリットの不足○ コストの超過(メリットの超過)● 提案:ツールを活用した目標の設定と評価の導入2
mypy駆動リファクタリング● mypy[1]○ Pythonの静的型チェッカ○ チェックに従うことでソースコードの可読性と堅牢性が向上○ 詳細なチェック項目の設定が可能● mypy駆動リファクタリング○ メリットとコストの適切なバランスを実現する目標をmypyの「詳細なチェック項目の設定」で表現○ mypyのチェック項目が満たされるまでリファクタリングを実施(※mypyのチェック項目を満たした場合は終了)3[1] mypy - Optional Static Typing for Python(http://www.mypy-lang.org/)
mypy駆動リファクタリングのフロー(簡易版)4開始mypyのチェック項目の選定mypyの実行mypyの出力に従ってリファクタリング終了エラーが存在する?はいいいえ
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 mypymypy --disallow-untyped-defs app .py
mypyの実行● 「mypyのチェック項目の選定」に基づいてmypyを実行6# app.pydef print_event_name (number) -> None:print(f"みんなのPython勉強会#{number}")mypy --disallow-untyped-defs app .pyapp.py:1: error: Function is missing a type annotation [no-untyped-def]Found 1 error in 1 file (checked 1 source file)
mypyの出力に従ってリファクタリング● 「mypyの実行」による出力に従ってリファクタリング7# app.pydef 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)
mypyの実行(リファクタリング後)● 「mypyのチェック項目の選定」に基づいてmypyを実行8mypy --disallow-untyped-defs app .pySuccess: no issues found in 1 source file# app.pydef print_event_name (number: int) -> None:print(f"みんなのPython勉強会#{number}")
まとめ● リファクタリングにおける理想と問題○ 理想:メリットとコストの適切なバランスを実現○ 問題:目標の設定が困難/解釈の相違が発生● mypy駆動リファクタリング○ メリットとコストの適切なバランスを実現する目標をmypyの「詳細なチェック項目の設定」で表現○ mypyのチェック項目が満たされるまでリファクタリングを実施(※mypyのチェック項目を満たした場合は終了)9