跳至内容

带默认值的 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