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

时间:2015-09-18 16:11:10

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

这个问题与click包有关:

  

Click是一个用于创建漂亮命令行的Python包   以可组合的方式接口,只需要很少的代码。它的   “命令行界面创建工具包”。它具有高度可配置性   但是开箱即用的是合理的默认值。

     

它旨在快速编写命令行工具的过程   有趣的同时还可以避免因无法造成的任何挫败感   实现预期的CLI API。

我想在我的 EntityCollection result = serviceProxy.RetrieveMultiple(querybyattribute); DataTable dt = new DataTable(); dt.Columns.Add("Title"); dt.Columns.Add("Created On", typeof(DateTime)); foreach (Entity entity in result.Entities) { DataRow dr = dt.NewRow(); dr["Title"] = entity.Attributes["title"].ToString(); dr["Created On"] = entity.Attributes["createdon"]; dt.Rows.Add(dr); } DataView dv = dt.DefaultView; dv.Sort = "Created On desc"; DataTable sortedDT = dv.ToTable(); dataGridView1.DataSource = sortedDT; 中添加click.Option,这会更改该命令的其他参数的行为。请考虑以下示例:

click.Command

如果在未明确指定@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) 的情况下调用cli_a,则提示用户提供值(或使用ENTER确认默认值)。如果在未指定x的情况下调用cli_b,则会使用默认值而不会提示用户。

我现在想添加一个标志x,允许用户在上述变体之一(运行时)之间进行选择。因此,调用click.Option的行为与cli_c --i相同,调用cli_a的行为与cli_c相同。

cli_b

目前的API是否可行?这可行吗?

类似的用例类似于 anwser-all-confimation-prompts-with-yes 标志。通常,如果cli工具应该由用户以交互方式使用,并且通过脚本或某些此类事件以自动模式使用,则会出现这种情况。

1 个答案:

答案 0 :(得分:3)

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

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)

我们的想法是使用急切选项的回调来修改Options的所有({1}}。

潜在的弱点:

  • 这是一个全有或全无的解决方案,即所有提示都是活动的或没有。对于我的用例,这正是我想要的,但对于其他可能不是这种情况。
  • 仅在一个方向上起作用,即通过关闭提示。因此,必须配置可能显示或不显示提示的每个Command,就像显示提示一样。
  • 如果我们关闭提示,我们仍需要Option的值,因此必须使用备用值源。即必须提供默认值。
相关问题