python-click:添加修改其他参数行为的选项

标签 python command-line-interface python-click

这个问题是关于 click 的包裹:

Click is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary. It’s the “Command Line Interface Creation Kit”. It’s highly configurable but comes with sensible defaults out of the box.

It aims to make the process of writing command line tools quick and fun while also preventing any frustration caused by the inability to implement an intended CLI API.

我想向我的 click.Command 添加一个 click.Option,它会更改该命令的其他参数的行为。考虑以下示例:

@click.option('--x', default=42, prompt=True)
@click.command
def cli_a(x):
  print(x)


@click.option('--x', default=42, prompt=False)
@click.command
def cli_b(x):
  print(x)

如果在未明确指定 x 的情况下调用 cli_a,系统会提示用户提供一个值(或使用 ENTER 确认默认值)。如果在未指定 x 的情况下调用 cli_b,则使用默认值而不提示用户。

我现在想添加一个标记 click.Option,允许用户在上述变体之一(在运行时)之间进行选择。因此,调用 cli_c --i 的行为类似于 cli_a,而调用 cli_c 的行为类似于 cli_b

@click.option('--i', is_flag=True, default=False, expose_value=False)
@click.option('--x', default=42, prompt=False)
@click.command
def cli_c(x):
  print(x)

当前的 API 是否可行?可行吗?

类似的用例类似于 anwser-all-confimation-prompts-with-yes 标志。如果 cli 工具应该可以由用户交互使用,并且可以通过脚本或类似的东西在自动化模式下使用,通常会出现这种情况。

最佳答案

我想出了以下代码,它产生了所需的行为:

def deactivate_prompts(ctx, param, value):
    if not value:
        click.echo("entering batch mode, deactivating all prompts ...")
        for p in ctx.command.params:
            if isinstance(p, click.Option) and p.prompt is not None:
                p.prompt = None
    return value

@click.option('--i/--b', default=True, is_eager=True, expose_value=False, callback=deactivate_prompts)
@click.option('--x', default=42, prompt=True)
@click.command
def cli_c(x):
  print(x)

想法是使用急切选项的回调来修改 Command 的所有(其他)Options

潜在弱点:

  • 这是一个全有或全无的解决方案,即所有提示都处于事件状态或没有。对于我的用例,这正是我想要的,但对于其他情况可能并非如此。
  • 这只能在一个方向上起作用,即关闭提示。因此,每个可能会或可能不会显示提示的 Option 都必须配置为显示提示。
  • 如果我们关闭提示,我们仍然需要那个Option 的值,所以一个替代的值源是必须的。 IE。必须提供默认值。

关于python-click:添加修改其他参数行为的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32656571/

相关文章:

python - 带有生菜和碎片的 Django,打开浏览器但不显示任何内容

python - 交换数组中的元素

python - 如何在 get_or_create 保存到数据库之前调用 clean 方法?

regex - grep手册中的-F选项是什么意思

python - 在 Python 中,单击如何查看其父项具有必需参数的子命令的 --help?

python - 如何检测两个Python迭代器产生相同的项目?

amazon-web-services - 如何使用 aws cli 获取 dynamodb 表中所有项目的列表

video - 压缩 MP4 文件时 FFMPEG 命令行不使用 GPU

python - python-click MultiCommand 的全局选项

python - 如何将 ctx(上下文)传递给 CliRunner?