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=VALUE
和 KEY: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}
我正在为我的命令行界面使用 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=VALUE
和 KEY: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}