Click 中是否有相当于 argparse
的 nargs='*'
可选参数的功能?
我正在编写命令行脚本,其中一个选项需要能够接受无限数量的参数,例如:
foo --users alice bob charlie --bar baz
所以 users
将是 ['alice', 'bob', 'charlie']
和 bar
将是 'baz'
在 argparse
中,我可以通过设置 nargs='*'
指定多个可选参数来收集它们后面的所有参数。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--users', nargs='*')
>>> parser.add_argument('--bar')
>>> parser.parse_args('--users alice bob charlie --bar baz'.split())
Namespace(bar='baz', users=['alice', 'bob', 'charlie'])
我知道 Click 允许您通过设置 nargs=-1
来指定 接受无限输入 的参数,但是当我尝试将可选参数的 nargs
设置为 -1 时,我得到:
类型错误:选项不能有 nargs < 0
有没有办法让 Click 接受一个选项的未指定数量的参数?
更新:
我需要能够在采用无限参数的选项之后指定选项。
更新:
@Stephen Rauch 的回答回答了这个问题。但是,我不建议使用我在这里要求的方法。我的功能请求 有意未在 Click 中实现,因为它可能会导致意外行为。 Click 推荐的方法是使用 multiple=True
:
@click.option('-u', '--user', 'users', multiple=True)
在命令行中,它看起来像:
foo -u alice -u bob -u charlie --bar baz
原文由 jpyams 发布,翻译遵循 CC BY-SA 4.0 许可协议
处理您所追求的方法的一种方法是继承 click.Option,并自定义解析器。
自定义类:
使用自定义类:
要使用自定义类,请将
cls
参数传递给@click.option()
装饰器,例如:或者如果希望该选项将吃掉整个命令行的其余部分,而不考虑其他选项:
这是如何运作的?
这是可行的,因为 click 是一个设计良好的 OO 框架。
@click.option()
装饰器通常实例化一个click.Option
对象,但允许使用 cls 参数覆盖此行为。因此,在我们自己的类中继承click.Option
并覆盖所需的方法是一件相对容易的事情。在这种情况下,我们超越了
click.Option.add_to_parser()
并且猴子修补了解析器,以便我们可以根据需要吃掉多个标记。测试代码:
试验结果: