如何将几个参数列表传递给@ click.option
我想通过命令行使用这种参数调用
python脚本(列表可以是任何大小,例如3):
python test.py --option1 ["o11","o12","o13"] --option2 ["o21","o22","o23"] 使用点击.从文档中,我们没有说明我们可以使用列表作为@click.option的参数 当我尝试这样做时: #!/usr/bin/env python import click @click.command(context_settings=dict(help_option_names=['-h','--help'])) @click.option('--option',default=[]) def do_stuff(option): return # do stuff if __name__ == '__main__': do_stuff() 在我的test.py中,通过命令行调用它: python test.py --option ["some option","some option 2"] 我收到一个错误:
我不能真正使用可变参数,因为每个命令只允许1个可变参数(http://click.pocoo.org/5/arguments/#variadic-arguments) 因此,如果有人能指出我正确的方向(最好使用点击),我将非常感激. 解决方法
如果通过使用自定义选项类将列表格式化为python列表的字符串文字,则可以强制单击以获取多个列表参数:
自定义类: import click import ast class PythonLiteralOption(click.Option): def type_cast_value(self,ctx,value): try: return ast.literal_eval(value) except: raise click.BadParameter(value) 该类将使用Python的Abstract Syntax Tree模块将参数解析为python文字. 自定义类用法: 要使用自定义类,请将cls参数传递给@ click.option()装饰器,如: @click.option('--option1',cls=PythonLiteralOption,default=[]) 这是如何运作的? 这是有效的,因为click是一个设计良好的OO框架. @ click.option()装饰器通常实例化click.Option对象,但允许使用cls参数覆盖此行为.因此,从我们自己的类中继承click.Option并过度使用所需的方法是一个相对容易的事情. 在这种情况下,我们遍历click.Option.type_cast_value()然后调用 测试代码: @click.command(context_settings=dict(help_option_names=['-h','--help'])) @click.option('--option1',default=[]) @click.option('--option2',default=[]) def cli(option1,option2): click.echo("Option 1,type: {} value: {}".format( type(option1),option1)) click.echo("Option 2,type: {} value: {}".format( type(option2),option2)) # do stuff if __name__ == '__main__': import shlex cli(shlex.split( '''--option1 '["o11","o13"]' --option2 '["o21","o23"]' ''')) 检测结果: Option 1,type: <type 'list'> value: ['o11','o12','o13'] Option 2,type: <type 'list'> value: ['o21','o22','o23'] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |