🦔

Typer の基本的な使い方まとめ

2023/02/04に公開

はじめに

こんにちは。@hayata-yamamotoです。

弊社では、バッチジョブやちょっとしたコマンドライン実行を行うためのツールとして、Typer を採用しています。FastAPI と親和性が高く、使用感も類似しておりシームレスな開発体験を提供してくれています。

https://typer.tiangolo.com/

今回は、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()

終わりに

もし、この記事や弊社に少しでもご興味持っていただけたら、是非カジュアル面談などにお越しください!
https://todoker.notion.site/efc2eea5eb054b6e8757fa3553af58d1

Discussion