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. mypy駆動リファクタリング
    (みんなのPython勉強会#98)
    桂川大輝

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. 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

    View Slide

  6. 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)

    View Slide

  7. 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)

    View Slide

  8. 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}")

    View Slide

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

    View Slide