【问题标题】:Python Click: ignore missing argument error if a flag is setPython Click:如果设置了标志,则忽略缺少的参数错误
【发布时间】:2021-04-10 20:09:40
【问题描述】:

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

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 错误?

【问题讨论】:

  • 您可以在点击装饰器中指定默认名称或将代码放在 if name: 条件下。
  • 为什么 --edit-config 是一个选项,而不是与 command_a 处于同一级别的命令?
  • @StephenRauch 我认为--edit-config 会比整个子命令更干净,因为我计划的用法是:默认命令:myapp John -> Hello John,其他一些操作:myapp John bye -> Bye Johnmyapp --edit-config只需编辑配置。在除了编辑配置(使用click.edit())之外的所有用法中,您将 John 指定为整个程序的参数,然后对其进行任何您需要的操作。所以使用一个选项来彻底改变程序的行为对我来说似乎更合乎逻辑。
  • @EricTruett default="" 的行为类似于nargs=-1,它将帮助页面中的参数标记为不正确的可选参数,并且当没有任何内容传递给myapp 时,它也会破坏帮助页面。 default=None 没有改变任何东西,仍然会引发 Missing argument 错误。将代码放入if name: ... 不起作用,因为由于错误,它永远不会到达。

标签: python command-line-interface python-click


【解决方案1】:

进一步阅读文档后,我发现 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多