Python单击:多个键值对参数

时间:2018-07-03 23:32:35

标签: python python-click

我正在将Python Click库用于我的命令行界面。我想有一个需要多个键值对的命令。我在api上很灵活。例如

my_cli my_command FOO=1 BAR=2

或者也许

my_cli my_command FOO 1 BAR 2

甚至

my_cli my_command {"FOO": 1, "BAR": 2}

使用Click可以轻松实现吗?

1 个答案:

答案 0 :(得分:3)

最简单的解决方案基本上与您想要使用这样的API的常规Python函数相同。

采用单个参数,将可变长度的参数流分组为一个元组。然后,您的操作取决于是否需要单独的参数:

>>> def func(*args):
...     d = dict(zip(args[::2], args[1::2]))
...     print(d)
>>> func('FOO', 1, 'BAR', 2)
{'FOO': 1, 'BAR': 2}

…或组合的key:value参数:

>>> def func(*args):
...     d = dict(arg.split(':') for arg in args)
...     print(d)

使用此代码有点笨拙,因为在Python中,参数不仅是空格分隔的单词,还请允许我忍受这一点:

>>> func('FOO:1', 'BAR:2')
{'FOO': 1, 'BAR': 2}

第一个click等效项如下:

@click.command()
@click.argument('args', nargs=-1)
def my_command(args):
    d = dict(zip(args[::2], args[1::2]))
    click.echo(d)

(显然,您可以像其他任何命令一样将其粘贴在click.group等中。)

现在:

$ ./clicky.py FOO 1 BAR 2
{'FOO': 1, 'BAR': 2}

第二个看起来像这样:

@click.command()
@click.argument('args', nargs=-1)
def my_command(args):
    d = dict(arg.split(':') for arg in args)
    click.echo(d)

请注意,现在,使用它根本不是hacky,因为对于您的shell,参数只是用空格分隔的单词:

$ ./clicky.py FOO:1 BAR:2
{'FOO': 1, 'BAR': 2}

如果要同时处理KEY=VALUEKEY:VALUE怎么办?然后,您只需要编写比arg.split(':')稍微复杂的内容即可。而且,您可能还需要更好的错误处理。但这足以让您入门。