如何通过数组验证提供多个选项?

Seb*_*oth 2 python python-click

鉴于我有这样的代码:

columns = ['col1', 'col2', 'col3', 'col4']

@click.option('--columns', is_flag=False, 
  default=columns, show_default=True, metavar='<columns>', type=click.Choice(columns), 
  help='Sets target columns', multiple=True)
Run Code Online (Sandbox Code Playgroud)

然后,我可以这样调用我的应用程序:

./myapp --columns=col1
Run Code Online (Sandbox Code Playgroud)

但是,如何使多个项目之间用逗号分隔,如下所示:

./myapp --columns=col1,col3
Run Code Online (Sandbox Code Playgroud)

我的目标是从结果columns数组中检索传递的值['col1', 'col3']

我不想多次通过该选项。

Rah*_*sim 5

中的multiple关键字click.option是,因此您可以多次传递相同的选项,例如--columns=col1 --columns=col2。相反,您可以接受列的字符串,然后自己提取并验证列:

cols = ['col1', 'col2', 'col3', 'col4']

@click.option('--columns', is_flag=False, default=','.join(cols), show_default=True,
              metavar='<columns>', type=click.STRING, help='Sets target columns')
@click.command()
def main(columns):
    # split columns by ',' and remove whitespace
    columns = [c.strip() for c in columns.split(',')]

    # validate passed columns
    for c in columns:
        if c not in cols:
            raise click.BadOptionUsage("%s is not an available column." % c)

    print(columns)
Run Code Online (Sandbox Code Playgroud)

  • 似乎很奇怪,这没有作为默认“click”包的一部分提供。 (3认同)
  • 这是一个很棒的答案和很棒的 python 代码。(我从未见过“[c.strip()...”部分,太棒了。谢谢! (2认同)