您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何将几个参数列表传递给@ click.option

5b51 2022/1/14 8:23:27 python 字数 4407 阅读 623 来源 www.jb51.cc/python

我想通过命令行使用这种参数调用 python脚本(列表可以是任何大小,例如3): python test.py --option1 ["o11", "o12", "o13"] --option2 ["o21", "o22", "o23"] 使用点击.从文档中,我们没有说明我们可以使用列表作为@click.option的参数 当我尝试这样做时: #!/usr/bin/env python impor

概述

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"]

我收到一个错误

Error: Got unexpected extra argument (some option 2])

我不能真正使用可变参数,因为每个命令只允许1个可变参数(http://click.pocoo.org/5/arguments/#variadic-arguments)

因此,如果有人能指出我正确的方向(最好使用点击),我将非常感激.

自定义类:

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()然后调用ast.literal_eval()来解析列表.

测试代码

@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']

总结

以上是编程之家为你收集整理的如何将几个参数列表传递给@ click.option全部内容,希望文章能够帮你解决如何将几个参数列表传递给@ click.option所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶