Python单击API-具有未知数字的多值选项



我想从click API接收多值选项,但值的数量未知。我浏览了click API的文档,但当之前知道值的数量并且可以在nargs参数中提及时,它只直接支持多值。在我的情况下,值的数量可以更改,我希望接收所有值。

python demo.py shop --fruits apple --vegetable potato
python demo.py shop --fruits apple bananna --vegetable potato

例如,如果我们认为商店是我们在第一种情况下调用的点击命令,我们应该得到

fruits: 'apple', vegetable: 'potato'

在第二种情况下

fruits: 'apple banana', vegetable: 'potato'

当然,输出的格式可以更改为数组或其他形式,但我们在接收输入的方式上没有任何自由。

我能够通过重写解析器对该选项采取的操作来实现这一点,显式地append任何选项的值,而不是重写它。我已经用注释标记了显式行。


class ManyParser(OptionParser):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def add_option(self, obj: "CoreOption", opts: t.Sequence[str], dest: t.Optional[str],
action: t.Optional[str] = None, nargs: int = 1, const: t.Optional[t.Any] = None) -> None:
action = 'append' # This line here is all I've had to add
super().add_option(obj, opts, dest, action, nargs, const)

class ManyVarCommand(click.Command):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def make_parser(self, ctx: Context) -> OptionParser:
"""Creates the underlying option parser for this command."""
parser = ManyParser(ctx)
for param in self.get_params(ctx):
param.add_to_parser(parser, ctx)
return parser

@click.command(cls=ManyVarCommand)
@click.option('--fruit', default="", required=False)
@click.option('--veggie', default="", required=False)
def com(fruit, veggie):
print(fruit)
print(veggie)
python main.py --fruit apple --fruit banana --veggie potato --veggie cabbage
['apple', 'banana']
['potato', 'cabbage']

最新更新