首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用click.CommandCollection drops组选项

使用click.CommandCollection drops组选项
EN

Stack Overflow用户
提问于 2017-01-25 15:07:38
回答 1查看 621关注 0票数 2
代码语言:javascript
复制
import click

@click.group()
@click.option('--username')
def cli1(username):
    click.echo(username)

@cli1.command()
def something():
    click.echo('howdy')

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

@cli2.command()
def somethingelse():
    click.echo('doody')

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

if __name__ == '__main__':
    cli()

我希望这将允许我将--username传递给something,但是当我运行这个脚本时:

代码语言:javascript
复制
python script.py something --username hi

我得到:

错误:没有这样的选项:--用户名

似乎使用CommandCollection正在破坏我的选择。以前有没有人处理过这件事?在点击回购有一个开放的门票,这是自2015年以来从未被触及,没有解决方案。

EN

回答 1

Stack Overflow用户

发布于 2017-05-31 01:32:06

有了一些新的管道,这是可以做到的。

怎么做??

您可以继承click.Group,然后将创建的类传递给click.group(),如下所示:

代码语言:javascript
复制
@click.group(cls=GroupWithCommandOptions)

在新的类中,可以将组上的选项应用于用于解析的命令,然后在命令调用期间,可以使用适当的选项调用组函数。

新的小组班:

代码语言:javascript
复制
import click

class GroupWithCommandOptions(click.Group):
    """ Allow application of options to group with multi command """

    def add_command(self, cmd, name=None):
        """ Hook the added command and put the group options on the command """
        click.Group.add_command(self, cmd, name=name)

        # add the group parameters to the command
        for param in self.params:
            cmd.params.append(param)

        # hook the command's invoke with our own
        cmd.invoke = self.build_command_invoke(cmd.invoke)
        self.invoke_without_command = True

    def build_command_invoke(self, original_invoke):

        def command_invoke(ctx):
            """ insert invocation of group function """

            # separate the group parameters
            ctx.obj = dict(_params=dict())
            for param in self.params:
                name = param.name
                ctx.obj['_params'][name] = ctx.params[name]
                del ctx.params[name]

            # call the group function with its parameters
            params = ctx.params
            ctx.params = ctx.obj['_params']
            self.invoke(ctx)
            ctx.params = params

            # now call (invoke) the original command
            original_invoke(ctx)

        return command_invoke

测试代码:

代码语言:javascript
复制
# Pass new group class to our group which needs options
@click.group(cls=GroupWithCommandOptions)
@click.option('--username')
def cli1(username):
    click.echo(username)


@cli1.command()
def something():
    click.echo('howdy')


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


@cli2.command()
def somethingelse():
    click.echo('doody')


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

if __name__ == '__main__':
    cli('something --username hi'.split())

结果:

代码语言:javascript
复制
hi
howdy
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41854933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档