单击:传递字符串时“得到意外的额外参数”

新手上路,请多包涵
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 字典已定义并按预期工作。

原文由 Benjamin Dean 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 975
2 个回答

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

 @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

原文由 Benjamin Dean 发布,翻译遵循 CC BY-SA 3.0 许可协议

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


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

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

原文由 Itachi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题