单击 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(),您应该了解您的命令需要什么。