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
750
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(パークシャテクノロジー)
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
200
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
180
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.7k
1000人規模の組織でデザインハーネスを導入するための第一歩
pkshadeck
PRO
4
3.4k
ts-morph でプロジェクト固有のアーキテクチャガードレールを作る
pkshadeck
PRO
4
830
過去のレビュー知見をSkillsで資産化した話
pkshadeck
PRO
1
3.2k
Databricksを用いたセキュアなデータ基盤構築とAIプロダクトへの応用.pdf
pkshadeck
PRO
0
580
人とAIのコミュニケーション方法の違い
pkshadeck
PRO
1
990
ドキュメントからはじめる未来のソフトウェア
pkshadeck
PRO
5
3.7k
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1.1k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Designing Experiences People Love
moore
143
24k
The Cost Of JavaScript in 2023
addyosmani
55
10k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
56k
Done Done
chrislema
186
16k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
370
Producing Creativity
orderedlist
PRO
348
40k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
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 を開発しよう!