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

How to supply multiple options with array validation?

假设我有这样的代码:

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'] 中检索传递的值。

我不想多次通过该选项。

click.option 中的 multiple 关键字是为了让您可以多次传递相同的选项,例如--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)

点击执行里面有个选项argument validation

If you want to apply custom validation logic, you can do this in the parameter callbacks. These callbacks can both modify values as well as raise errors if the validation does not work

下面是您的代码在使用中的样子:

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)                                  

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