Skip to content

Typer App

明示的なアプリケーション

ここまでは、1 つの関数を作って、その関数を typer.run() に渡す方法を見てきました。

たとえば次のような形です。

import typer


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


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

ただし、これは実際にはショートカットです。内部では Typer がそれを typer.Typer() を使った CLI アプリケーションに変換し、実行しています。これらはすべて typer.run() の中で行われています。

同じことを実現する、より明示的な書き方もあります。

import typer

app = typer.Typer()


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


if __name__ == "__main__":
    app()

typer.run() を使うとき、Typer はだいたい次のようなことをしています。

  • 新しい typer.Typer() の "アプリケーション" を作成する
  • あなたの関数から新しい "command" を作成する
  • その同じ "アプリケーション" を "app()" のように関数として呼び出す

@decorator Info

Python における @something という構文は "decorator" と呼ばれます。

関数の上に置く構文です。飾りのついた帽子のようなものだと考えてください(たぶん、そこからこの名前が来ています)。

"decorator" は、その下にある関数を受け取り、何らかの処理を行います。

ここでのデコレータは、下の関数が "command" であることを Typer に伝えています。 コマンドについては、後ほど commands セクションでもっと詳しく学びます。

typer.run() を使う方法も、明示的にアプリケーションを作る方法も、ほぼ同じ結果になります。

Tip

もし typer.run() だけで要件を満たせるなら、それで問題ありません。明示的な app を作って @app.command() などを使う必要はありません。

あとでアプリに追加機能が必要になったらその方法を使いたくなるかもしれませんが、まだ必要でなければそれで十分です。

2 番目の例、つまり明示的な app を使う例を実行すると、動作はまったく同じです。

// CLI argument なし
$ python main.py

Usage: main.py [OPTIONS] NAME
Try "main.py --help" for help.

Error: Missing argument 'NAME'.

// NAME CLI argument あり
$ python main.py Camila

Hello Camila

// help を求める
$ python main.py  --help

Usage: main.py [OPTIONS] NAME

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.

CLI アプリケーションの補完

ここで注目しておく価値のある小さなポイントがあります。

help に 2 つの新しい CLI オプション が表示されるようになりました。

  • --install-completion
  • --show-completion

shell/tab completion を使うには、自分や利用者がインストールできて、直接呼び出せる パッケージを作る必要があります。

つまり、次のように Python スクリプトを実行する代わりに:

$ python main.py

✨ Some magic here ✨

...次のように呼び出せるようにする、ということです。

$ magic-app

✨ Some magic here ✨

そのような単体のプログラムにすることで、shell/tab completion をセットアップできるようになります。

インストール可能なパッケージを作成するための最初のステップは、明示的な typer.Typer() アプリを使うことです。

install 可能な単体の CLI アプリケーションを作る一連の流れについては、あとで Build a Package で学べます。

ただ、今の段階では、自分がその道の上にいると分かっていれば十分です。 😎