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 做到这一点?
使用选项而不是参数也可以实现同样的效果,请参阅元组作为多值选项与多个选项的组合。
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)
最简单的解决方案基本上与您使用常规 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}\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\xa6 或组合key:value参数:
>>> def func(*args):\n... d = dict(arg.split(':') for arg in args)\n... print(d)\nRun Code Online (Sandbox Code Playgroud)\n\n这个使用起来有点麻烦,因为在 Python 中,参数不仅仅是空格分隔的单词,但请耐心听我说:
\n\n>>> func('FOO:1', 'BAR:2')\n{'FOO': 1, 'BAR': 2}\nRun Code Online (Sandbox Code Playgroud)\n\n第一个的等效项click如下所示:
@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)\nRun Code Online (Sandbox Code Playgroud)\n\n(显然,您可以将其粘贴在 等中click.group,就像任何其他命令一样。)
现在:
\n\n$ ./clicky.py FOO 1 BAR 2\n{'FOO': 1, 'BAR': 2}\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,现在使用它一点也不 hacky,因为对于您的 shell 来说,参数只是用空格分隔的单词:
\n\n$ ./clicky.py FOO:1 BAR:2\n{'FOO': 1, 'BAR': 2}\nRun Code Online (Sandbox Code Playgroud)\n\n如果您想同时处理KEY=VALUE和该怎么办KEY:VALUE?然后你只需要写一些比 稍微复杂的东西arg.split(':')。您可能还需要一些更好的错误处理。但这应该足以让您开始。
| 归档时间: |
|
| 查看次数: |
3238 次 |
| 最近记录: |