Upgrade to Pro — share decks privately, control downloads, hide ads and more …

mypy駆動リファクタリング

 mypy駆動リファクタリング

みんなのPython勉強会#98( https://startpython.connpass.com/event/296755/

Daiki Katsuragawa

October 12, 2023
Tweet

More Decks by Daiki Katsuragawa

Other Decks in Programming

Transcript

  1. リファクタリングにおける理想と問題 • リファクタリング ◦ 処理の振る舞いを変えずにソースコードの構造を整理すること ◦ ソースコードの可読性や堅牢性の向上を実現 • 理想:メリットとコストの適切なバランスを実現 •

    問題:目標の設定が困難/解釈の相違が発生 ◦ メリットの不足 ◦ コストの超過(メリットの超過) • 提案:ツールを活用した目標の設定と評価の導入 2
  2. mypy駆動リファクタリング • mypy[1] ◦ Pythonの静的型チェッカ ◦ チェックに従うことでソースコードの可読性と堅牢性が向上 ◦ 詳細なチェック項目の設定が可能 •

    mypy駆動リファクタリング ◦ メリットとコストの適切なバランスを実現する目標を mypyの「詳細なチェック項目の設定」で表現 ◦ mypyのチェック項目が満たされるまでリファクタリングを実施 (※mypyのチェック項目を満たした場合は終了) 3 [1] mypy - Optional Static Typing for Python(http://www.mypy-lang.org/)
  3. 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
  4. 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)
  5. 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)
  6. 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}")
  7. まとめ • リファクタリングにおける理想と問題 ◦ 理想:メリットとコストの適切なバランスを実現 ◦ 問題:目標の設定が困難/解釈の相違が発生 • mypy駆動リファクタリング ◦

    メリットとコストの適切なバランスを実現する目標を mypyの「詳細なチェック項目の設定」で表現 ◦ mypyのチェック項目が満たされるまでリファクタリングを実施 (※mypyのチェック項目を満たした場合は終了) 9