【问题标题】:Get params sent to a subcommand of a click.group()获取发送到 click.group() 子命令的参数
【发布时间】:2017-10-18 11:56:48
【问题描述】:

如果我有一个带有多个子命令的click.group(),有没有办法可以将命令行参数传递给组内的这些子命令?

我知道你可以通过context 从组往下走,而且我知道我可以使用将在命令之前执行的callback 函数,但我不知道是否有更好的方法这样做比使用callback

一个例子:

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

@cli.command()
@click.argument('task')
@click.argument('task_id')
def sync(task, task_id):
    click.echo('Synching: {}'.format(task))

在这个例子中,有没有办法在group方法中获取tasktask_id

【问题讨论】:

    标签: python python-click


    【解决方案1】:

    这可以通过覆盖click.Group.invoke() 方法来完成,例如:

    自定义类:

    class MyGroup(click.Group):
        def invoke(self, ctx):
            ctx.obj = tuple(ctx.args)
            super(MyGroup, self).invoke(ctx)
    

    使用自定义类:

    然后要使用自定义组,请将其作为 cls 参数传递给 group 装饰器,例如:

    @click.group(cls=MyGroup)
    @click.pass_context
    def cli(ctx):
        args = ctx.obj
        ....
    

    这是如何工作的?

    这是因为click 是一个设计良好的OO 框架。 @click.group() 装饰器通常实例化 click.Group 对象,但允许使用 cls 参数覆盖此行为。因此,在我们自己的类中继承 click.Group 并覆盖所需的方法是一件相对容易的事情。

    在这种情况下,我们覆盖click.Group.invoke() 并获取参数并将它们放入ctx.obj 字段。然后可以在 cli() 函数中访问它们。

    测试代码:

    import click
    
    class MyGroup(click.Group):
        def invoke(self, ctx):
            ctx.obj = tuple(ctx.args)
            super(MyGroup, self).invoke(ctx)
    
    @click.group(cls=MyGroup)
    @click.pass_context
    def cli(ctx):
        args = ctx.obj
        click.echo('cli: {} {}'.format(ctx.invoked_subcommand, ' '.join(args)))
    
    @cli.command()
    @click.argument('task')
    @click.argument('task_id')
    def sync(task, task_id):
        click.echo('Synching: {}'.format(task))
    
    cli('sync task taskid'.split())
    

    结果:

    cli: sync task taskid
    Synching: task
    

    【讨论】:

    • 太棒了!这正是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多