Skip to content

デフォルト値付き CLI 引数

同じ typer.Argument() を使ってデフォルト値を設定することもできます。

そうすると、その CLI 引数 は省略可能になるだけでなく、デフォルト値も持つようになります。

デフォルト値を持つ省略可能な CLI 引数

typer.Argument() を使って、CLI 引数None 以外のデフォルト値を持たせることもできます。

from typing import Annotated

import typer

app = typer.Typer()


@app.command()
def main(name: Annotated[str, typer.Argument()] = "Wade Wilson"):
    print(f"Hello {name}")


if __name__ == "__main__":
    app()
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

import typer

app = typer.Typer()


@app.command()
def main(name: str = typer.Argument("Wade Wilson")):
    print(f"Hello {name}")


if __name__ == "__main__":
    app()

Tip

この場合、値は利用者が渡す str か、デフォルト値 "Wade Wilson" のどちらかで、どちらも str です。したがって、値が None になることはないので、Optional[str] を使う必要はありませんし、使うべきでもありません。

Optional[something] は、Python に「その値は None になり得る」と伝えるものです。ただし Optional を使っても、Typer に対して値が必須かどうかを伝えることにはなりません。

確認してみましょう。

// help を確認します
$ python main.py --help

// [default: Wade Wilson] ✨ に注目してください
Usage: main.py [OPTIONS] [NAME]

Arguments:
  [NAME]  [default: Wade Wilson]

Options:
  --help                Show this message and exit.

// 省略可能な CLI 引数なし
$ python main.py

Hello Wade Wilson

// CLI 引数を 1 つ渡す
$ python main.py Camila

Hello Camila

動的なデフォルト値

default_factory 引数に関数を渡せば、デフォルト値を動的に生成することもできます。

import random
from typing import Annotated

import typer

app = typer.Typer()


def get_name():
    return random.choice(["Deadpool", "Rick", "Morty", "Hiro"])


@app.command()
def main(name: Annotated[str, typer.Argument(default_factory=get_name)]):
    print(f"Hello {name}")


if __name__ == "__main__":
    app()
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

import random

import typer

app = typer.Typer()


def get_name():
    return random.choice(["Deadpool", "Rick", "Morty", "Hiro"])


@app.command()
def main(name: str = typer.Argument(default_factory=get_name)):
    print(f"Hello {name}")


if __name__ == "__main__":
    app()

この場合は、毎回ランダムな str を返す get_name 関数を作成しています。

そして、それを typer.Argument() の最初の関数引数として渡しています。

Tip

default_factory の "factory" という言葉は、単に「デフォルト値を作る関数」という意味です。

確認してみましょう。

// help を確認します
$ python main.py --help

Usage: main.py [OPTIONS] [NAME]

Arguments:
  [NAME]  [default: (dynamic)]

Options:
  --help                Show this message and exit.

// 何度か試してみてください。毎回ランダムなデフォルト値が使われます
$ python main.py

Hello Deadpool

$ python main.py

Hello Hiro

$ python main.py

Hello Rick

// 今度は CLI 引数に値を渡します
$ python main.py Camila

Hello Camila