这可以通过覆盖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