コンテンツへスキップ

Typer

Typer

Typer、素晴らしい CLI を構築しましょう。コーディングが簡単。Python の型ヒントに基づいています。

Test Publish Coverage Package version


ドキュメント: https://typer.dokyumento.jp

ソースコード: https://github.com/tiangolo/typer


Typer は、ユーザーが使用を楽しみ、開発者が作成を楽しむCLIアプリケーションを構築するためのライブラリです。Python の型ヒントに基づいています。

また、スクリプトを CLI アプリケーションに自動的に変換して実行するためのコマンドラインツールでもあります。

主な機能は次のとおりです。

  • 直感的な記述: 優れたエディターサポート。補完があらゆる場所にあります。デバッグ時間の短縮。使いやすく、学習しやすいように設計されています。ドキュメントを読む時間の短縮。
  • 使いやすい: エンドユーザーにとって使いやすいです。自動ヘルプと、すべてのシェルでの自動補完。
  • 短い: コードの重複を最小限に抑えます。各パラメータ宣言からの複数の機能。バグの減少。
  • 単純なスタート: 最も単純な例では、アプリにわずか 2 行のコードを追加します: 1 つの import、1 つの関数呼び出し
  • 大規模に成長: 必要に応じて複雑さを増し、オプションと引数を使用して、コマンドとサブコマンドのグループの任意の複雑なツリーを作成できます。
  • スクリプトの実行: Typer には、スクリプトを実行するために使用できる typer コマンド/プログラムが含まれており、内部で Typer を使用していない場合でも、それらを自動的に CLI に変換します。

CLI の FastAPI

TyperFastAPI の小さな兄弟で、CLI の FastAPI です。

インストール

$ pip install typer
---> 100%
Successfully installed typer rich shellingham

絶対的な最小限

  • main.py ファイルを次のように作成します。
def main(name: str):
    print(f"Hello {name}")

このスクリプトは、内部で Typer を使用していません。しかし、typer コマンドを使用して、CLI アプリケーションとして実行できます。

実行

typer コマンドを使用してアプリケーションを実行します。

// Run your application
$ typer main.py run

// You get a nice error, you are missing NAME
Usage: typer [PATH_OR_MODULE] run [OPTIONS] NAME
Try 'typer [PATH_OR_MODULE] run --help' for help.
╭─ Error ───────────────────────────────────────────╮
│ Missing argument 'NAME'.                          │
╰───────────────────────────────────────────────────╯


// You get a --help for free
$ typer main.py run --help

Usage: typer [PATH_OR_MODULE] run [OPTIONS] NAME

Run the provided Typer app.

╭─ Arguments ───────────────────────────────────────╮
│ *    name      TEXT  [default: None] [required]   |
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --help          Show this message and exit.       │
╰───────────────────────────────────────────────────╯

// Now pass the NAME argument
$ typer main.py run Camila

Hello Camila

// It works! 🎉

これは、内部で Typer を使用しない最もシンプルなユースケースですが、簡単なスクリプトにはすでに非常に役立ちます。

: 自動補完は、Python パッケージを作成して --install-completion で実行した場合、または typer コマンドを使用した場合に機能します。

コードで Typer を使用する

次に、自分のコードで Typer を使い始めましょう。main.py を次のように更新します。

import typer


def main(name: str):
    print(f"Hello {name}")


if __name__ == "__main__":
    typer.run(main)

これで Python で直接実行できます。

// Run your application
$ python main.py

// You get a nice error, you are missing NAME
Usage: main.py [OPTIONS] NAME
Try 'main.py --help' for help.
╭─ Error ───────────────────────────────────────────╮
│ Missing argument 'NAME'.                          │
╰───────────────────────────────────────────────────╯


// You get a --help for free
$ python main.py --help

Usage: main.py [OPTIONS] NAME

╭─ Arguments ───────────────────────────────────────╮
│ *    name      TEXT  [default: None] [required]   |
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --help          Show this message and exit.       │
╰───────────────────────────────────────────────────╯

// Now pass the NAME argument
$ python main.py Camila

Hello Camila

// It works! 🎉

: 同じスクリプトを typer コマンドで呼び出すこともできますが、必須ではありません。

例のアップグレード

これは、可能な限り最も簡単な例でした。

次に、もう少し複雑な例を見てみましょう。

2つのサブコマンドの例

ファイル main.py を変更します。

typer.Typer() アプリを作成し、パラメータを使用して2つのサブコマンドを作成します。

import typer

app = typer.Typer()


@app.command()
def hello(name: str):
    print(f"Hello {name}")


@app.command()
def goodbye(name: str, formal: bool = False):
    if formal:
        print(f"Goodbye Ms. {name}. Have a good day.")
    else:
        print(f"Bye {name}!")


if __name__ == "__main__":
    app()

そして、それは次のようになります。

  • 明示的に typer.Typer アプリを作成します。
    • 前の typer.run は、実際には暗黙的に作成します。
  • @app.command() で2つのサブコマンドを追加します。
  • typer.run の代わりに)関数であるかのように app() 自体を実行します。

アップグレードされた例を実行

新しいヘルプを確認します。

$ python main.py --help

 Usage: main.py [OPTIONS] COMMAND [ARGS]...

╭─ Options ─────────────────────────────────────────╮
│ --install-completion          Install completion  │
│                               for the current     │
│                               shell.              │
│ --show-completion             Show completion for │
│                               the current shell,  │
│                               to copy it or       │
│                               customize the       │
│                               installation.       │
│ --help                        Show this message   │
│                               and exit.           │
╰───────────────────────────────────────────────────╯
╭─ Commands ────────────────────────────────────────╮
│ goodbye                                           │
│ hello                                             │
╰───────────────────────────────────────────────────╯

// When you create a package you get ✨ auto-completion ✨ for free, installed with --install-completion

// You have 2 subcommands (the 2 functions): goodbye and hello

次に、hello コマンドのヘルプを確認します。

$ python main.py hello --help

 Usage: main.py hello [OPTIONS] NAME

╭─ Arguments ───────────────────────────────────────╮
│ *    name      TEXT  [default: None] [required]   │
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --help          Show this message and exit.       │
╰───────────────────────────────────────────────────╯

そして、goodbye コマンドのヘルプを確認します。

$ python main.py goodbye --help

 Usage: main.py goodbye [OPTIONS] NAME

╭─ Arguments ───────────────────────────────────────╮
│ *    name      TEXT  [default: None] [required]   │
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --formal    --no-formal      [default: no-formal] │
│ --help                       Show this message    │
│                              and exit.            │
╰───────────────────────────────────────────────────╯

// Automatic --formal and --no-formal for the bool option 🎉

これで、新しいコマンドラインアプリケーションを試すことができます。

// Use it with the hello command

$ python main.py hello Camila

Hello Camila

// And with the goodbye command

$ python main.py goodbye Camila

Bye Camila!

// And with --formal

$ python main.py goodbye --formal Camila

Goodbye Ms. Camila. Have a good day.

まとめ

要約すると、パラメータの型(CLI 引数CLI オプション)を関数パラメータとして 一度 宣言します。

標準的な現代の Python 型でそれを行います。

特定のライブラリの新しい構文、メソッド、クラスなどを学習する必要はありません。

標準の Python のみです。

たとえば、int の場合は

total: int

または、bool フラグの場合は

force: bool

同様に、ファイルパスenum(選択肢)などにも当てはまります。また、サブコマンドのグループを作成し、メタデータを追加し、追加の検証などを行うツールもあります。

手に入れるもの: あらゆる場所で 補完型チェック を含む、優れたエディターサポート。

ユーザーが手に入れるもの: パッケージをインストールしたとき、または typer コマンドを使用するときに、自動 --help、ターミナル(Bash、Zsh、Fish、PowerShell)での 自動補完

より多くの機能を含むより完全な例については、チュートリアル - ユーザーガイドを参照してください。

依存関係

Typer は巨人の肩に乗っています。内部の必須の依存関係は、Click だけです。

デフォルトでは、追加の標準依存関係も付属しています。

  • rich: きれいにフォーマットされたエラーを自動的に表示します。
  • shellingham: 補完をインストールするときに現在のシェルを自動的に検出します。
    • shellingham を使用すると、--install-completion を使用するだけで済みます。
    • shellingham を使用しない場合は、補完をインストールするシェルの名前を渡す必要があります。例:--install-completion bash

typer-slim

追加の標準オプションの依存関係が不要な場合は、代わりに typer-slim をインストールしてください。

次のようにインストールする場合

pip install typer

...には、次と同じコードと依存関係が含まれます

pip install "typer-slim[standard]"

standard の追加の依存関係は、richshellingham です。

: typer コマンドは、typer パッケージにのみ含まれています。

ライセンス

このプロジェクトは、MIT ライセンスの条項に基づいてライセンスされています。