带默认值的 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]
告诉 Python 一个值“可能是 None
”。但是,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)
在这种情况下,我们创建了函数 get_name
,它每次都会返回一个随机 str
。
我们将其作为第一个函数参数传递给 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