16
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)

好像 Click 将字符串参数传递一个字符。打印参数显示正确的结果。

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

4

4 回答 4

16

想通了。我必须传递一个上下文并从那里调用它,而不是仅仅调用一个函数:

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

文档

有时,从另一个命令调用一个命令可能会很有趣。这是 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
于 2016-01-20T16:12:15.693 回答
1

tl;dr从你的论点中删除空格。

如果其他人正在经历相同且以上的答案并不能澄清或为您工作,那么您可能处于我的状态。

对我来说,这个错误是因为我给出的参数之间有空格,并且接受它的函数/模块不允许使用空格分隔的输入,因此输入名称的其余部分被视为单独的参数导致

“有意外的额外参数”错误。

于 2018-06-19T05:35:12.550 回答
1

使用click 方法调用同名方法时出现此错误:


@cli.command()
@click.argument("namespace", nargs=1)
def process(namespace):
    process("foo")  # <---- HERE

通过重命名其中一个来修复它,希望对其他人有帮助!

于 2021-08-26T02:34:37.380 回答
-1

仅在您运行的主脚本中使用 click 模块可能会有所帮助。就我而言,从主模块以外的模块中删除点击有助于解决这个问题。

于 2020-02-17T05:50:14.360 回答