デフォルト値付きの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