命令 CLI 选项
命令还可以有自己的CLI 选项。
事实上,每个命令都可以有不同的CLI 参数和CLI 选项
import typer
from typing_extensions import Annotated
app = typer.Typer()
@app.command()
def create(username: str):
print(f"Creating user: {username}")
@app.command()
def delete(
username: str,
force: Annotated[
bool, typer.Option(prompt="Are you sure you want to delete the user?")
],
):
if force:
print(f"Deleting user: {username}")
else:
print("Operation cancelled")
@app.command()
def delete_all(
force: Annotated[
bool, typer.Option(prompt="Are you sure you want to delete ALL users?")
],
):
if force:
print("Deleting all users")
else:
print("Operation cancelled")
@app.command()
def init():
print("Initializing user database")
if __name__ == "__main__":
app()
提示
如果可能,最好使用Annotated
版本。
import typer
app = typer.Typer()
@app.command()
def create(username: str):
print(f"Creating user: {username}")
@app.command()
def delete(
username: str,
force: bool = typer.Option(..., prompt="Are you sure you want to delete the user?"),
):
if force:
print(f"Deleting user: {username}")
else:
print("Operation cancelled")
@app.command()
def delete_all(
force: bool = typer.Option(
..., prompt="Are you sure you want to delete ALL users?"
),
):
if force:
print("Deleting all users")
else:
print("Operation cancelled")
@app.command()
def init():
print("Initializing user database")
if __name__ == "__main__":
app()
这里我们有多个命令,具有不同的CLI 参数
create
:username
:一个CLI 参数。
delete
:username
:一个CLI 参数。--force
:一个CLI 选项,如果没有提供,则会提示。
delete-all
:--force
:一个CLI 选项,如果没有提供,则会提示。
init
:- 不接受任何CLI 参数。
// Check the help
python main.py --help
Usage: main.py [OPTIONS] COMMAND [ARGS]...
Options:
--install-completion Install completion for the current shell.
--show-completion Show completion for the current shell, to copy it or customize the installation.
--help Show this message and exit.
Commands:
create
delete
delete-all
info
提示
检查命令delete-all
,默认情况下,命令名称会从函数名称生成,用 -
替换 _
。
测试它
// Check the command create
$ python main.py create Camila
Creating user: Camila
// Now test the command delete
$ python main.py delete Camila
# Are you sure you want to delete the user? [y/n]: $ y
Deleting user: Camila
$ python main.py delete Wade
# Are you sure you want to delete the user? [y/n]: $ n
Operation cancelled
// And finally, the command delete-all
// Notice it doesn't have CLI arguments, only a CLI option
$ python main.py delete-all
# Are you sure you want to delete ALL users? [y/n]: $ y
Deleting all users
$ python main.py delete-all
# Are you sure you want to delete ALL users? [y/n]: $ n
Operation cancelled
// And if you pass the --force CLI option, it doesn't need to confirm
$ python main.py delete-all --force
Deleting all users
// And init that doesn't take any CLI parameter
$ python main.py init
Initializing user database