web-dev-qa-db-ja.com

文字列を渡すときに「予期しない余分な引数を取得しました」をクリックします

_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が文字列引数を1文字渡すかのように。引数を出力すると、正しい結果が表示されます。

PS:KEYSディクショナリが定義され、期待どおりに機能しています。

13
Benjamin Dean

これを理解しました。関数を呼び出すだけでなく、コンテキストを渡してそこから呼び出す必要があります。

@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
12
Benjamin Dean

tl; dr引数から空白を削除します。

他の誰かが同じことを経験していて、上記の答えがあなたのために明確にならないか、うまくいかない場合、おそらくあなたは私の状態にあります。

私にとって、このエラーは、間にスペースを含む引数を指定し、それを受け入れる関数/モジュールがスペースで区切られた入力を受け取ることが許可されなかったために発生していました。したがって、入力名の残りは別々の引数として受け取られていました。

「予期しない余分な引数を取得しました」エラー。

0
Akansha Jain