4

鉴于我有这样的代码:

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)

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

./myapp --columns=col1

但是,如何使用逗号分隔的多个项目使其工作,如下所示:

./myapp --columns=col1,col3

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

我不想多次传递该选项。

4

2 回答 2

9

multiple关键字 in是为了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)
于 2015-12-07T17:19:45.903 回答
3

点击有一个选项来执行参数验证

如果要应用自定义验证逻辑,可以在参数回调中执行此操作。如果验证不起作用,这些回调既可以修改值也可以引发错误

以下是您的代码在使用时的样子:

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


def _arg_split(ctx, param, value):                                              
    # split columns by ',' and remove whitespace                                
    columns = [c.strip() for c in value.split(',')]                             

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

    return columns                                                              


@click.option('--columns', is_flag=False, default=','.join(cols),               
              show_default=True, metavar='<columns>',                           
              required=True, type=click.STRING, help='Sets target columns',     
              callback=_arg_split)                                              
@click.command()                                                                
def main(columns):                                                              
    print(columns)                                  

请注意,输入到main中的columns变量已经是一个列表,因此您可以立即使用而无需任何处理

于 2017-05-07T10:56:49.837 回答