コンテンツにスキップ

デフォルト値付きのCLI引数

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

そうすれば、CLI引数はオプションになり、さらにデフォルト値を持つことになります。

デフォルトを持つオプションのCLI引数

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

import typer
from typing_extensions import Annotated


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


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

ヒント

可能であれば、Annotatedバージョンを使用することを推奨します。

import typer


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


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

ヒント

値はユーザーによって渡されたstrか、デフォルト値の"Wade Wilson"(これもstr)になるため、値がNoneになることは決してありません。したがって、Optional[str]を使用する必要はありません(使用すべきではありません)。

Optional[something]は、値が「Noneになる可能性がある」ことをPythonに伝えます。ただし、Optionalの使用はTyperには影響を与えません。たとえば、値が必須かどうかをTyperに伝えるわけではありません。

確認してください

// Check the help
$ python main.py --help

// Notice the [default: Wade Wilson] ✨
Usage: main.py [OPTIONS] [NAME]

Arguments:
  [NAME]  [default: Wade Wilson]

Options:
  --help                Show this message and exit.

// With no optional CLI argument
$ python main.py

Hello Wade Wilson

// With one CLI argument
$ python main.py Camila

Hello Camila

動的なデフォルト値

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

import random

import typer
from typing_extensions import Annotated


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


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


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

ヒント

可能であれば、Annotatedバージョンを使用することを推奨します。

import random

import typer


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


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


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

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

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

ヒント

default_factoryの「factory」という言葉は、「デフォルト値を作成する関数」を意味するだけの洒落た言い方です。

確認してください

// Check the help
$ python main.py --help

Usage: main.py [OPTIONS] [NAME]

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

Options:
  --help                Show this message and exit.

// Try it several times, it will use a random default each time
$ python main.py

Hello Deadpool

$ python main.py

Hello Hiro

$ python main.py

Hello Rick

// Now pass a value for the CLI argument
$ python main.py Camila

Hello Camila