Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
脱 argparse! Typer + Rich を使った型安全でモダンな CLI 開発 / ...
Search
PKSHA Technology(パークシャテクノロジー)
PRO
October 20, 2025
670
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
脱 argparse! Typer + Rich を使った型安全でモダンな CLI 開発 / Modern, Type-Safe CLI Development with Typer and Rich — Moving Beyond argparse
PKSHA Technology(パークシャテクノロジー)
PRO
October 20, 2025
More Decks by PKSHA Technology(パークシャテクノロジー)
See All by PKSHA Technology(パークシャテクノロジー)
ts-morph でプロジェクト固有のアーキテクチャガードレールを作る
pkshadeck
PRO
4
680
過去のレビュー知見をSkillsで資産化した話
pkshadeck
PRO
1
2.6k
Databricksを用いたセキュアなデータ基盤構築とAIプロダクトへの応用.pdf
pkshadeck
PRO
0
470
人とAIのコミュニケーション方法の違い
pkshadeck
PRO
1
680
ドキュメントからはじめる未来のソフトウェア
pkshadeck
PRO
5
3.5k
「協働」で拓くAI開発の最前線 VoC活⽤と⽣成AIエージェント開発の舞台裏
pkshadeck
PRO
0
810
自動システムテストのための テスト再設計と人材育成
pkshadeck
PRO
0
2.3k
AIエージェント縛りで社内ハッカソンを開催した話(20250723-名古屋LLM_MeetUp#7_LT)
pkshadeck
PRO
3
1.7k
AIエージェント開発を加速させるLLM実験基盤
pkshadeck
PRO
3
1.3k
Featured
See All Featured
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
770
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
720
The Curious Case for Waylosing
cassininazir
1
380
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
WCS-LA-2024
lcolladotor
0
620
A Tale of Four Properties
chriscoyier
163
24k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
380
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
420
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Transcript
株式会社 PKSHA Technology 中村 光伴 2025年10⽉22⽇ 『Pythonの多様性 深掘りLT Night 』
@Findy TECH BATON 脱 argparse! Typer + Rich を使った 型安全でモダンな CLI 開発 © PKSHA Technology Inc. 1
© PKSHA Technology Inc. ⾃⼰紹介 • 2024年に新卒で PKSHA Technology に⼊社
• いわゆる Web フルスタックエンジニア • よく使う:Python / TypeScript / AWS • ハンドルネームの Arumakan は Nakamura の逆順⽂字列 • We’re hiring !! 2 ソフトウエアエンジニア 中村 光伴 なかむら こうすけ X: @Arumakan_ei1727
© PKSHA Technology Inc. OSS 開発でなくとも CLI を書く機会は多い • 開発⽤の補助ツール
• PoC • データ処理 • AWS Batch などのジョブ / Docker エントリポイント 3 コマンドライン引数でパラメータを注⼊できるようにしたい
© PKSHA Technology Inc. argparse のつらみ • 型推論が効かない • バリデーションロジックを
⼿続き的に書く必要がある • サブコマンドの定義が⼤変 • シェルのタブ補完スクリプトは ⾃前で書く必要がある 4 Any 型に推論されてしまう
© PKSHA Technology Inc. 1分でできる Typer クイックスタート uv init →
uv add typer → 下記を main.py に保存して uv run python main.py Bob --times 3 5 ※わかりやすさのため、 1 <= times <= 5 のバリデーションは⼀旦⼊れていません
© PKSHA Technology Inc. 実⾏結果 6 正常系: --times に⾮整数を渡した場合:
© PKSHA Technology Inc. typo したら正しいオプション名をサジェストしてくれる 7
© PKSHA Technology Inc. Typer の基本 FastAPI と同様の書き味 (FastAPI の作者と同じ
@tiangolo ⽒が作ったもの) ちなみに CLI 構築ライブラリの Click を裏で使っている 8 typing.Literal にも対応 (⻑らく enum を使う必要があったが 1ヶ⽉前のリリースで対応された)
© PKSHA Technology Inc. 前述の例の --help の出⼒ 9 前述の例ではデフォルト値付きの引数が Option
になる https://typer.tiangolo.com/tutorial/options/required/#required-cli-options
© PKSHA Technology Inc. typer.Argument と typer.Option 10
© PKSHA Technology Inc. ファイルの存在判定や環境変数からの読み取りもできる 11 ディレクトリは拒否 ファイルの存在を要求 環境変数からも読み取り
© PKSHA Technology Inc. サブコマンドは関数を複数定義してデコレートするだけ app = typer.Typer() → @app.command()
でデコレート 関数名がサブコマンド名になる (@app.command() の name 引数で設定可) 12 ※デコレートが2つ以上ある場合にサブコマンドとして扱われる [^1] [^1]: https://typer.tiangolo.com/tutorial/commands/one-or-multiple/
© PKSHA Technology Inc. コマンドラインのパース以外にも CLI のための便利機能がいろいろ 13 [^2] :
Rich がインストールされている場合に限る。 typer.run() は内部で app() (つまり Typer.__call__) を呼び出しているだけ。 https://github.com/fastapi/typer/blob/3dcb16b2693bbd8e968fe6e5f4c7c4b47f1d2ba8/typer/main.py#L1068-L1071 やりたいこと 操作 yes/no の確認 typer.confirm() ファイルパスと “-” (stdin) の統⼀的な open typer.open_file() プログレスバーの表⽰ typer.progressbar() スタックトレースのリッチな表⽰ typer.run() または app() で自動で有効化 [^2]
© PKSHA Technology Inc. スタックトレースのリッチな表⽰ 例外発⽣時に整形されたスタックトレースを表 ⽰してくれる 各スタックフレームのローカル変数を表⽰して くれてデバッグが捗る! typer.Typer(pretty_exceptions_enalbe=False)
で無効化できる Rich の機能を使っているため、Rich がインストールされて いない場合はリッチな表⽰にならない [^3] 14 [^3]: https://github.com/fastapi/typer/blob/3dcb16b2693bbd8e968fe6e5 f4c7c4b47f1d2ba8/typer/main.py#L75-L81
© PKSHA Technology Inc. Typer と Rich の関係 Typer のコアは
typer-slim というライブラリ pip install typer を実⾏すると typer-slim, rich, shellingham, typer コマンドが⼊る ※shellingham はカレントシェルの検出をするパッケージ 15 インストールコマンド typer-slim (Typerのコア) rich, shellingham typer コマンド pip install typer ✅ ✅ ✅ pip install typer-slim ✅ pip install ‘typer-slim[standard]’ ✅ ✅ 出典: https://typer.tiangolo.com/#typer-slim
© PKSHA Technology Inc. Rich の便利な機能 • rich.traceback.install() • rich.logging.RichHandler
• rich.print() • rich.inspect() • …etc. たくさんあるので詳細は Rich のドキュメントへ 16
© PKSHA Technology Inc. CLI 開発中でもシェルのタブ補完を効かせたい! • python main.py --show-completion
/ --install-completion で補完シェルスクリプトを⽣成 / インストールできる typer コマンドで実⾏すれば解決する 17 しかしこれはビルドしてインストールされた状態で使われる想定 ⼀般的にはコマンドラインの $0 で補完スクリプトが決まる ▶ python main.py のように実⾏する限り python の補完しか出てこない!
© PKSHA Technology Inc. typer コマンドの補完を効かせる⽅法 python main.py [ARGS]--. は
typer main.py run [ARGS]--. でも実⾏できる ⼿順 1. typer コマンドへの PATH を通す ◦ mise use pip:typer や ./.venv/bin/activate や uv tool install typer など 2. typer --install-completion 3. ご使⽤のシェルで補完を有効化する ◦ zsh の例: autoload -Uz compinit -& compinit 4. typer main.py run -- でタブを押すと補完が効く 18 ※ mise や direnv で⾃動化できる mise.toml なら [env] セクションで _.python.venv = { path='.venv', create=true } .envrc なら layout python
© PKSHA Technology Inc. 19 EOF 快適に CLI を開発しよう!