2016-01-20 53 views
5
import click 

@cli.command() 
@click.argument("namespace", nargs=1) 
def process(namespace): 
..... 

@cli.command() 
def run(): 
    for namespace in KEYS.iterkeys(): 
     process(namespace) 

运行run('some string')生产:点击:“收到意想不到的额外的参数”传递字符串时

Error: Got unexpected extra arguments (o m e s t r i n g)

仿佛点击一个字符传递字符串参数。打印参数显示正确的结果。

PS:KEYS字典定义和按预期工作。

回答

5

想通了。而不是仅仅调用一个函数,我必须通过一个背景,并从那里调用它:

@cli.command() 
@click.pass_context 
def run(): 
    for namespace in KEYS.iterkeys(): 
     ctx.invoke(process, namespace=namespace) 

docs

有时,它可能是有趣的,从另一个 命令调用一个命令。这是一种通常不鼓励使用Click, 但仍然可能的模式。为此,您可以使用Context.invoke() 或Context.forward()方法。

他们类似的工作,但不同的是,Context.invoke() 只是调用与您提供的 主叫方的论点另一个命令,而Context.forward()填充从 当前命令的参数。两者都接受命令作为第一个参数,并且其他所有内容都按照您的预期向前传递。

例子:

cli = click.Group() 

@cli.command() 
@click.option('--count', default=1) 
def test(count): 
    click.echo('Count: %d' % count) 

@cli.command() 
@click.option('--count', default=1) 
@click.pass_context 
def dist(ctx, count): 
    ctx.forward(test) 
    ctx.invoke(test, count=42) 

什么样子:

$ cli dist 
Count: 1 
Count: 42