Python 点击:多个键值对参数

Python Click: Multiple Key Value Pair Arguments

我正在为我的命令行界面使用 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 执行此操作的简单方法?

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

采用单个参数,将可变长度的参数流分组到一个元组中。然后,你做什么取决于你是否想要单独的参数:

>>> 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 中,参数不仅仅是 space 分隔的单词,但请耐心等待:

>>> 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,参数只是由 spaces:

分隔的单词
$ ./clicky.py FOO:1 BAR:2
{'FOO': 1, 'BAR': 2}

如果要同时处理 KEY=VALUEKEY:VALUE 怎么办?那么你只需要写一些比arg.split(':')稍微复杂的东西。您可能还需要更好的错误处理。但这应该足以让您入门。

同样可以使用选项而不是参数,参见 Tuples as Multi Value Options in combination with Multiple Options

import click

@click.command()
@click.option("--dict", "-d", "mydict", type=(str, int), multiple=True)
def cli(mydict):
    d = dict(mydict)
    click.echo(d)

if __name__ == "__main__":
    cli()

示例:

$ python3 ./clickexample.py -d hello 1 -d foo 2 -d baz 3
{'hello': 1, 'foo': 2, 'baz': 3}