这个问题与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工具应该由用户以交互方式使用,并且通过脚本或某些此类事件以自动模式使用,则会出现这种情况。
答案 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
的值,因此必须使用备用值源。即必须提供默认值。