Python Click:多个键值对参数

Jes*_*ieh 6 python python-click

我的命令行界面使用 Python Click 库。我想要一个接受多个键值对的命令。我在 api 上很灵活。例如

my_cli my_command FOO=1 BAR=2
Run Code Online (Sandbox Code Playgroud)

或者可能

my_cli my_command FOO 1 BAR 2
Run Code Online (Sandbox Code Playgroud)

甚至

my_cli my_command {"FOO": 1, "BAR": 2}
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以通过 Click 做到这一点?

reo*_*eox 8

使用选项而不是参数也可以实现同样的效果,请参阅元组作为多值选项多个选项的组合。

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()
Run Code Online (Sandbox Code Playgroud)

例子:

$ python3 ./clickexample.py -d hello 1 -d foo 2 -d baz 3
{'hello': 1, 'foo': 2, 'baz': 3}
Run Code Online (Sandbox Code Playgroud)


aba*_*ert 5

最简单的解决方案基本上与您使用常规 Python 函数执行的操作相同,您需要这样的 API。

\n\n

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

\n\n
>>> def func(*args):\n...     d = dict(zip(args[::2], args[1::2]))\n...     print(d)\n>>> func('FOO', 1, 'BAR', 2)\n{'FOO': 1, 'BAR': 2}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 或组合key:value参数:

\n\n
>>> def func(*args):\n...     d = dict(arg.split(':') for arg in args)\n...     print(d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个使用起来有点麻烦,因为在 Python 中,参数不仅仅是空格分隔的单词,但请耐心听我说:

\n\n
>>> func('FOO:1', 'BAR:2')\n{'FOO': 1, 'BAR': 2}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

第一个的等效项click如下所示:

\n\n
@click.command()\n@click.argument('args', nargs=-1)\ndef my_command(args):\n    d = dict(zip(args[::2], args[1::2]))\n    click.echo(d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

现在:

\n\n
$ ./clicky.py FOO 1 BAR 2\n{'FOO': 1, 'BAR': 2}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二个看起来像这样:

\n\n
@click.command()\n@click.argument('args', nargs=-1)\ndef my_command(args):\n    d = dict(arg.split(':') for arg in args)\n    click.echo(d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$ ./clicky.py FOO:1 BAR:2\n{'FOO': 1, 'BAR': 2}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n