2016-01-20 12 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) 

を渡すときに、「予期しない余分な引数を手に入れたが、」生産:クリック:<code>run('some string')</code>を実行している文字列

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

をクリックして、1つの文字で文字列引数を渡すかのように。引数を表示すると、正しい結果が表示されます。

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

答えて

5

これを実証しました。だけではなく、関数を呼び出すのは、私はコンテキストを渡し、そこからそれを呼び出す必要があります:

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

docsから:

時には、別の コマンドから一つのコマンドを呼び出すには面白いかもしれません。これは、クリック、 で一般的に推奨されていませんが、それにもかかわらず可能なパターンです。このためには、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 
関連する問題