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

vorbei Laufen run('some string') produziert:Click: "Got unerwartete zusätzliche Argumente", wenn String

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

Wie Klicken Sie geht durch eine Zeichenfolge Argument. Das Ausdrucken eines Arguments zeigt das korrekte Ergebnis.

PS: KEYS Wörterbuch definiert und funktioniert wie erwartet.

Antwort

5

Ich habe das herausgefunden. Anstatt nur eine Funktion aufruft, muss ich einen Kontext übergeben und von dort aus rufen:

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

Vom docs:

Manchmal könnte es interessant sein, einen Befehl von einem anderen Befehl aufzurufen. Dies ist ein Muster, das im Allgemeinen mit Click, , aber nichtsdestotrotz möglich ist. Dazu können Sie die Methoden Context.invoke() oder Context.forward() verwenden.

Sie funktionieren ähnlich, aber der Unterschied ist, dass Context.invoke() nur einen anderen Befehl mit den Argumenten aufruft, die Sie als Anrufer zur Verfügung stellen, während Context.forward() füllt die Argumente aus dem aktuellen Befehl. Beide akzeptieren den Befehl als erstes Argument und alles andere wird weitergegeben, wie Sie erwarten würden.

Beispiel:

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) 

Und wie es aussieht:

$ cli dist 
Count: 1 
Count: 42