单击 Python 调用另一个子命令似乎无法验证字段
Invoking another subcommand with Python click doesn't seem to validate fields
如果我从另一个命令调用 Click 子命令,调用的命令看起来不像是在验证传递的字段。我做错了什么吗?
这是一个小例子:
cli_main.py
import click
import cli_add
import cli_sub
import sys
@click.group()
@click.pass_context
def cli(ctx):
"""Main CLI"""
cli.add_command(cli_add.add)
cli.add_command(cli_sub.subtract)
if __name__ == "__main__":
sys.exit(cli())
cli_sub.py
import click
@click.group()
@click.pass_context
def subtract(ctx):
"""subtract"""
@subtract.command()
@click.option('--number', type=int, required=True)
@click.pass_context
def number(ctx, number):
click.echo("Subtract {}".format(number))
cli_add.py
import click
import cli_sub
@click.group()
@click.pass_context
def add(ctx):
"""add"""
@add.command()
@click.option('--number', type=int, required=True)
@click.pass_context
def number(ctx, number):
if number > 0:
click.echo("Add {}".format(number))
else:
ctx.invoke(cli_sub.number)
调用示例:
python cli_main.py add number --number 1
Add 1
python cli_main.py subtract number --number 1
Subtract 1
python cli_main.py subtract number
Usage: cli_main.py subtract number [OPTIONS]
Try "cli_main.py subtract number --help" for help.
Error: Missing option "--number".
这些按预期工作。但是,如果我调用以下命令,它会以意想不到的方式失败。
python cli_main.py add number --number -1
Subtract None
它确实调用了减法方法。问题是我在调用它时没有传递参数:
ctx.invoke(cli_sub.number)
所以,我预计它会失败并向我提供使用文本,特别是因为需要 number
选项。
我没有正确调用这个子命令吗?为什么调用不触发参数检查与直接调用不带参数的子命令一样?
你分析的问题是正确的,确实需要传递参数。您可以像这样传递参数:
ctx.invoke(cli_sub.number, number=number)
关于你的另一个问题:
Why does the invocation not trigger parameter checks the same way directly calling the sub-command without the parameter does?
这个检查是在解析参数的时候完成的。如果您直接调用 ctx.invoke()
,您应该了解您的命令需要什么。
如果我从另一个命令调用 Click 子命令,调用的命令看起来不像是在验证传递的字段。我做错了什么吗?
这是一个小例子:
cli_main.py
import click
import cli_add
import cli_sub
import sys
@click.group()
@click.pass_context
def cli(ctx):
"""Main CLI"""
cli.add_command(cli_add.add)
cli.add_command(cli_sub.subtract)
if __name__ == "__main__":
sys.exit(cli())
cli_sub.py
import click
@click.group()
@click.pass_context
def subtract(ctx):
"""subtract"""
@subtract.command()
@click.option('--number', type=int, required=True)
@click.pass_context
def number(ctx, number):
click.echo("Subtract {}".format(number))
cli_add.py
import click
import cli_sub
@click.group()
@click.pass_context
def add(ctx):
"""add"""
@add.command()
@click.option('--number', type=int, required=True)
@click.pass_context
def number(ctx, number):
if number > 0:
click.echo("Add {}".format(number))
else:
ctx.invoke(cli_sub.number)
调用示例:
python cli_main.py add number --number 1
Add 1
python cli_main.py subtract number --number 1
Subtract 1
python cli_main.py subtract number
Usage: cli_main.py subtract number [OPTIONS]
Try "cli_main.py subtract number --help" for help.
Error: Missing option "--number".
这些按预期工作。但是,如果我调用以下命令,它会以意想不到的方式失败。
python cli_main.py add number --number -1
Subtract None
它确实调用了减法方法。问题是我在调用它时没有传递参数:
ctx.invoke(cli_sub.number)
所以,我预计它会失败并向我提供使用文本,特别是因为需要 number
选项。
我没有正确调用这个子命令吗?为什么调用不触发参数检查与直接调用不带参数的子命令一样?
你分析的问题是正确的,确实需要传递参数。您可以像这样传递参数:
ctx.invoke(cli_sub.number, number=number)
关于你的另一个问题:
Why does the invocation not trigger parameter checks the same way directly calling the sub-command without the parameter does?
这个检查是在解析参数的时候完成的。如果您直接调用 ctx.invoke()
,您应该了解您的命令需要什么。