我正在将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可以轻松实现吗?
答案 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=VALUE
和KEY:VALUE
怎么办?然后,您只需要编写比arg.split(':')
稍微复杂的内容即可。而且,您可能还需要更好的错误处理。但这足以让您入门。