Python 单击:如果设置了标志,则忽略缺少参数错误

Python Click: ignore missing argument error if a flag is set

我想制作一个简单的 CLI 程序,它接受 --edit-config 选项以在编辑器中打开其配置。但是,如果我仅指定 --edit-config 标志,我无法弄清楚如何让 Click 忽略缺少的参数错误。

import click

@click.group(invoke_without_command=True)
@click.argument("name")
@click.option("--edit-config", is_flag=True)
def cli(name, edit_config):
    # If we run it like
    # $ myprog --edit-config | Missing Argument: NAME
    if edit_config:
        click.echo("Editing config")
        ...
        exit(0)
    
    # But this is the main functionality
    # $ myprog John
    click.echo(f"Hello, {name}")

@cli.command()
def command_a():
    ...
...

第一个命令导致缺少参数错误。可以有解决方法,例如 nargs=-1required=False,但是,这似乎会使帮助页面完全消失或 name 参数在帮助消息中被标记为可选,在大多数用例中并非如此。

如果指定了某个选项,是否有一种简单的方法可以使 Click 不引发 Missing Argument 错误?

进一步阅读文档后,我发现 this section,它提供了一种实现 --edit-config 或任何其他完全改变执行流程的选项的方法。

def edit_config(ctx, param, value):
    if not value or ctx.resilient_parsing:
        return
    click.echo("Editing config")
    ctx.exit()

@click.group(invoke_without_command=True)
@click.argument("name")
@click.option("--edit-config", is_flag=True, callback=edit_config,
              is_eager=True, expose_value=False)
def cli(name):
    print(f"Hello, {name}!")

@cli.command()
def howareyou():
    print(f"How are you?")
 $ myapp John
Hello, John!

 $ myapp John howareyou
Hello, John!
How are you?

 $ myapp --edit-config
Editing config

 $ myapp --help
Usage: myapp [OPTIONS] NAME COMMAND [ARGS]...

Options:
  --edit-config 
  --help         Show this message and exit.

Commands:
  howareyou