如何让嵌套命令组对同一级别的子命令使用相同的名称,但在点击时实现不同?

How to have nested command groups use the same name for the same level of subcommands but different implementation in click?

我用的是click 8.0.3

我正在阅读这篇文章https://click.palletsprojects.com/en/8.0.x/commands/#merging-multi-commands,但我仍然感到困惑。

我想要的

我希望能够拥有这个

cli cli1 new

cli cli2 new

我试过的

我复制上面link中的相同代码

import click

@click.group()
def cli1():
    pass

@cli1.command()
def cmd1():
    """Command on cli1"""

@click.group()
def cli2():
    pass

@cli2.command()
def cmd2():
    """Command on cli2"""

cli = click.CommandCollection(sources=[cli1, cli2])

if __name__ == '__main__':
    cli()

但我不知道如何在每个命令组 cli1 和 cli2 中添加单独的 def new 函数,以便每个 def new 可以显示为 new 但具有不同的实现。

我也不希望 cmd1 和 cmd2 处于同一级别。我希望 cli 以这种方式工作,其中延迟加载单独的 cli1 和 cli2 组。

我该怎么做?

我用下面的代码让它工作。基本上,创建一个顶级 cli 组,以及两个将作为命令添加的嵌套组,cli1cli2。定义方法非常简单,如 new_cli1new_cli2 所示。默认情况下,单击从方法名称获取命令名称,但您可以选择通过将名称显式传递给 command 方法来自定义它,就像我们在此处所做的那样。

不过,您可以使用 click 提供的 CommandCollection 而不是显式添加 cli1cli2。但是不确定延迟加载。


@click.group()
def cli():
    pass


@click.group()
def cli1():
    pass


@cli1.command('new')
def new_cli1():
    print('cli1 > new')


@click.group()
def cli2():
    pass


@cli2.command('new')
def new_cli2():
    print('cli2 > new')


if __name__ == '__main__':
    cli.add_command(cli1)
    cli.add_command(cli2)
    cli()

很好。我只是想建议你,如果你的代码可能会超过这 20 行,将每个组分开在它自己的模块中。更容易维护,你不会再有这样的问题:)