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

pylint custom ruleで始めるレビュー自動化

pylint custom ruleで始めるレビュー自動化

python meetup fukuoke #2で発表した資料です。

https://lycorptech-jp.connpass.com/event/341890/

---
みなさんは日々開発している中で生まれるベストプラクティスや慣習化されたコーディング規約をどのように管理しているでしょうか。 私のチームではそれらを定例で共有したりレビューで指摘するなどして管理していましたが、すぐに形骸化してしまう問題がありました。 今回の発表では、この問題を解決するために、Linterの独自ルールとしてチーム内に周知した事例をご紹介します。 発表では、PythonのLinterであるPylintを使った独自ルールの具体的な実装方法やその実用的なtipsについてもお話しします。

Shogo Ujiie

February 16, 2025
Tweet

More Decks by Shogo Ujiie

Other Decks in Programming

Transcript

  1. • 氏家 翔吾(@mowmow1259) • エムスリー株式会社 AI・機械学習チーム リーダー ◦ 2021年新卒入社 ◦

    15人のチームメンバー • 福岡オフィス所属 • ML/MLOpsを業務で触っている 2 自己紹介
  2. (※) 2023年10月時点 日本の医師のエムスリー会員率 エムスリーが事業展開している国の数 エムスリーが占める全世界で医師会員の割合 全世界で医師会員合計 17 カ国 (※) 50

    %以上 (※) 650 万人以上 (※) 90 %以上 エムスリー が展開する医療従事者向け情報 サイト「m3.com」は32万人を突破、日本 の医師の9割以上が会員。(※) 日本の医師の9割が登録するエムスリーのサービス グローバルでも医師の5割以上が会員、医療業界に根付く事業基盤 圧倒的な医療データへのアクセス容易性を活かしたAI開発 6
  3. 25 PythonでのLinter候補 ruff ◦ デファクトとなりつつあるRust製のPython Linter ◦ 弊チームでも基本的にはruffを使っている ◦ 独自ルールや外部Pluginの差し込みは不可能

    pylint ◦ vscodeの標準Python Linter ◦ (おそらく)Python Linter界で最もstarが多い ◦ 独自ルールの追加が容易 flake8 ◦ 言わずと知れたPython Linter ◦ 使い勝手はほぼpylintと同じ
  4. 26 PythonでのLinter候補 ruff ◦ デファクトとなりつつあるRust製のPython Linter ◦ 弊チームでも基本的にはruffを使っている ◦ 独自ルールや外部Pluginの差し込みは不可能

    pylint ◦ vscodeの標準Python Linter ◦ (おそらく)Python Linter界で最もstarが多い ◦ 独自ルールの追加が容易 flake8 ◦ 言わずと知れたPython Linter ◦ 使い勝手はほぼpylintと同じ
  5. 40 2. ASTを走査 Module Assign Name BinOp Constant Constant Add

    Pylinter • PyLinter(が持つASTWalker)がノードを深さ優先探索していく
  6. 41 2. ASTを走査 Module Assign Name BinOp Constant Constant Add

    Pylinter • PyLinter(が持つASTWalker)がノードを深さ優先探索していく
  7. 42 2. ASTを走査 Module Assign Name BinOp Constant Constant Add

    Pylinter • PyLinter(が持つASTWalker)がノードを深さ優先探索していく
  8. 44 3. 各ノードでルールをチェック • 各ノード探索時に、Checkerのコールバックを呼び出す Module Assign Name BinOp Constant

    Constant Add Pylinter Checker Checker Checker Checker visit_module コードに違反があった場合 visit_moduleがそれを pylintに返す ルール
  9. 50 独自ルールのコールバック関数を呼び出し Module Assign Name BinOp Constant Constant Add Pylinter

    Checker Checker Checker Checker HogeAssign Checker visit_name 変数(i)
  10. 60 Module For For For Pylinter DeepFor Checker このForが三つ目の入れ子 だった場合に警告したい

    Forは自分が入れ子のい くつ目かの情報は持って いない その①: nestを検知したい(Forを検知)
  11. 62 Module For For For Pylinter DeepFor Checker push その①:

    nestを検知したい(stackを導入)
  12. 63 Module For For For Pylinter DeepFor Checker push その①:

    nestを検知したい(stackを導入)
  13. 64 Module For For For Pylinter DeepFor Checker push その①:

    nestを検知したい(stackを導入)
  14. 66 Module For For For Pylinter DeepFor Checker pop その①:

    nestを検知したい(stackを導入)
  15. 67 Module For For For Pylinter DeepFor Checker さっきpopしたので for_stackは2個しか

    たまっていない その①: nestを検知したい(stackを導入)
  16. 72 その②: importの解決(解決策) Module Import From Expr Call Pylinter Sample

    Checker importに訪問時に モジュールの情報を記録