我试图使用Python库Click,但是很难让一个示例正常工作。我定义了两个组,其中一个组(group2
)用于处理这组命令的公共参数。我想实现的是,这些公共参数由group函数(group2
)处理并分配给上下文变量,以便实际命令可以使用它们。在
一个用例是许多需要用户名和密码的命令,而有些命令则不需要(甚至不需要)。在
这是密码
import click
@click.group()
@click.pass_context
def group1(ctx):
pass
@click.group()
@click.option('--optparam', default=None, type=str)
@click.option('--optparam2', default=None, type=str)
@click.pass_context
def group2(ctx, optparam):
print 'in group2', optparam
ctx['foo'] = create_foo_by_processing_params(optparam, optparam2)
@group2.command()
@click.pass_context
def command2a(ctx):
print 'command2a', ctx['foo']
@group2.command()
@click.option('--another-param', default=None, type=str)
@click.pass_context
def command2b(ctx, another_param):
print 'command2b', ctx['foo'], another_param
# many more more commands here...
# @group2.command()
# def command2x():
# ...
@group1.command()
@click.argument('argument1')
@click.option('--option1')
def command1(argument1, option1):
print 'In command2', argument1, option1
cli = click.CommandCollection(sources=[group1, group2])
if __name__ == '__main__':
cli(obj={})
这是使用command2时的结果:
^{pr2}$这个例子有什么问题吗。我试着密切关注文档,但是opt-param
似乎没有被识别出来。在
所需方案的基本问题是
click.CommandCollection
不调用group函数。它直接跳到命令。此外,还需要通过decorator将选项应用于组,但是命令将解析这些选项。即:而不是:
^{pr2}$怎么做的?
这个
click.Group
派生类钩住命令的命令调用以截获组参数,并将它们传递给group命令。在Group.add_command
中,将参数添加到命令中Group.add_command
中,重写command.invoke
command.invoke
中,将从组中插入的特殊参数放入ctx.obj
,并从params
中删除它们command.invoke
中,调用group命令,然后调用命令本身代码:
测试代码:
结果:
这不是我要找的答案,而是朝着这个方向迈出的一步。本质上引入了一种新的组(
GroupExt
),并且添加到组中的选项现在被添加到命令中。在这不是我要找的东西。理想情况下,}中处理的。也许有人知道如何扩展这一点。在
optparam
将由group2
处理并将结果放入上下文中,但目前它是在{相关问题 更多 >
编程相关推荐