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