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