🦔
Typer の基本的な使い方まとめ
はじめに
こんにちは。@hayata-yamamotoです。
弊社では、バッチジョブやちょっとしたコマンドライン実行を行うためのツールとして、Typer を採用しています。FastAPI と親和性が高く、使用感も類似しておりシームレスな開発体験を提供してくれています。
今回は、Typer の使い方をどうしても忘れてしまう私のために備忘録として、Typer の使い方をまとめたコードを共有します。
コメントに、該当するページが記載されておりますため、Typer を利用されている方々もどうぞご活用ください。
main.py
import time
from typing import Optional
import typer
from rich import print, progress, prompt
app = typer.Typer()
# https://typer.tiangolo.com/tutorial/commands/callback/
@app.callback(help="app のコールバック定義")
def callback(
arg1: str = typer.Argument(..., help="app全体に適用される必須引数"),
option1: bool = typer.Option(default=False, help="app全体に適用される任意引数定義"),
) -> None:
print(f"{arg1=}")
print(f"{option1=}")
# https://typer.tiangolo.com/tutorial/commands/arguments/
@app.command(help="必須引数を渡す時のコマンド定義")
def command_with_required_argument(
arg1: str = typer.Argument(..., help="単一引数のヘルプ"),
arg2: list[str] = typer.Argument(..., help="複数引数のヘルプ"),
) -> None:
print(f"{arg1=}")
print(f"{arg2=}")
# https://typer.tiangolo.com/tutorial/commands/options/
@app.command(help="任意引数を渡す時のコマンド定義")
def command_with_optional_argument(
option1: str = typer.Option(default="option", help="単一オプションのヘルプ"),
option2: Optional[list[str]] = typer.Option(default=None, help="複数オプションのヘルプ"),
option3: str = typer.Option(..., prompt=True, help="プロンプトを入力させる時のヘルプ"),
option4: str = typer.Option(
..., prompt=True, confirmation_prompt=True, help="プロンプト入力させて、かつ再入力を求める時のヘルプ"
),
) -> None:
print(f"{option1=}")
print(f"{option2=}")
print(f"{option3=}")
print(f"{option4=}")
def do_something(s: str) -> dict[str, str]:
return {"text": s}
# https://typer.tiangolo.com/tutorial/printing/#use-rich
# Typer Echo でも良いが、基本的には Rich 推奨とのこと
# https://typer.tiangolo.com/tutorial/printing/#typer-echo
@app.command(help="実行ログを出す時の定義")
def command_with_print_log() -> None:
print(do_something("sample"))
# https://typer.tiangolo.com/tutorial/progressbar/
@app.command(help="途中で処理を終了する時の定義")
def command_with_exit() -> None:
for i in progress.track(range(1, 15), description="Processing..."):
if i % 10 == 0:
raise typer.Exit()
time.sleep(0.2)
# https://typer.tiangolo.com/tutorial/prompt/#prompt-with-rich
@app.command(help="処理の途中でプロンプトを出す時の定義")
def command_with_prompt() -> None:
text = prompt.Prompt.ask("Please input [Yes]")
if text == "Yes":
print("Yes was inputted")
else:
print(text)
if __name__ == "__main__":
app()
終わりに
もし、この記事や弊社に少しでもご興味持っていただけたら、是非カジュアル面談などにお越しください!
Discussion