2016-04-25 11 views
0

ich eine cli Spezifikation mit docopt geschaffen, die aus irgendeinem Grund groß, jedoch arbeitet ich neu schreiben müssen, um esmutually_exclusive_group mit optional und Positions Argument

Usage: 
    update_store_products <store_name>... 
    update_store_products --all 

    Options: 
     -a --all  Updates all stores configured in config 

Wie argparse das zu tun?

Was ist wichtig, ich will nicht, so etwas haben:

update_store_products [--all] <store_name>... 

ich denke, es eher so etwas wie dieses wäre:

update_store_products (--all | <store_name>...) 

Ich versuchte add_mutually_exclusive_group zu verwenden, aber ich Fehler:

ValueError: mutually exclusive arguments must be optional 

Antwort

5

Zunächst einmal sollten Sie the shortest code necessary to reproduce the error in the question itself einschließen. Ohne es ist eine Antwort nur ein Schuss in die Dunkelheit.

Nun, ich bin bereit, Ihre argparse Definitionen wie diese ein bisschen etwas aussehen zu wetten:

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group(required=True) 
group.add_argument('--all', action='store_true') 
group.add_argument('store_name', nargs='*') 

Die Argumente in einer unvereinbaren Gruppe muss optional sein, weil es nicht viel Sinn machen würde, eine haben, Argument erforderlich, da die Gruppe dann nur dieses Argument jemals haben könnte. Die nargs='*' allein ist nicht genug - das required Attribut der erstellten action wird True sein - um die Mutex-Gruppe zu überzeugen, dass das Argument wirklich optional ist. Was Sie tun müssen, ist eine Standard hinzuzufügen:

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group(required=True) 
group.add_argument('--all', action='store_true') 
group.add_argument('store_name', nargs='*', default=[]) 

Dies wird zur Folge haben:

[~]% python2 arg.py 
usage: arg.py [-h] (--all | store_name [store_name ...]) 
arg.py: error: one of the arguments --all store_name is required 

[~]% python2 arg.py --all 
Namespace(all=True, store_name=[]) 

[~]% python2 arg.py store1 store2 store3 
Namespace(all=False, store_name=['store1', 'store2', 'store3']) 
Verwandte Themen