【发布时间】: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=-1 或required=False,但是,这似乎使帮助页面要么完全消失,要么在帮助消息中将name 参数标记为可选,这在大多数用例。
如果指定了某个选项,是否有一种简单的方法可以使 Click 不引发 Missing Argument 错误?
【问题讨论】:
-
您可以在点击装饰器中指定默认名称或将代码放在 if name: 条件下。
-
为什么 --edit-config 是一个选项,而不是与 command_a 处于同一级别的命令?
-
@StephenRauch 我认为
--edit-config会比整个子命令更干净,因为我计划的用法是:默认命令:myapp John -> Hello John,其他一些操作:myapp John bye -> Bye John和myapp --edit-config只需编辑配置。在除了编辑配置(使用click.edit())之外的所有用法中,您将 John 指定为整个程序的参数,然后对其进行任何您需要的操作。所以使用一个选项来彻底改变程序的行为对我来说似乎更合乎逻辑。 -
@EricTruett
default=""的行为类似于nargs=-1,它将帮助页面中的参数标记为不正确的可选参数,并且当没有任何内容传递给myapp时,它也会破坏帮助页面。default=None没有改变任何东西,仍然会引发 Missing argument 错误。将代码放入if name: ...不起作用,因为由于错误,它永远不会到达。
标签: python command-line-interface python-click