2012-09-06 6 views
8

Ich weiß, das ist sehr ähnlich wie Setting default option in Python of two mutually exclusive options using the argparse module, obwohl aus einer anderen Perspektive (und die dort gegebenen Antworten scheinen nicht zu helfen).Setzen Sie den Standardwert auf "false", wenn ein anderes, sich gegenseitig ausschließendes Argument zutrifft.

Codeblock (Parser ist eine Instanz argparse.ArgumentParser):

mutex_group = parser.add_mutually_exclusive_group() 
mutex_group.add_argument("--show", action="store_true", 
    dest="show", default=True) 
mutex_group.add_argument("--insert", action="store_true", 
    dest="insert") 

opts = parser.parse_args() 

Wenn weder --show oder --insert angegeben ich --show auf Standard wollen (daher default=True), aber wenn --insert verwendet wird, dann opts.show noch ist true (aufgrund des Standards), obwohl sie Teil eines gegenseitig ausschließenden Blocks sind.

Der aktuelle Code überprüft, dass keine der anderen Optionen eingestellt wurden bei der Prüfung, ob opt.show Wahr ist, das heißt:

if opts.show and not opts.insert: 
    do_something() 
elif opts.insert: 
    do_something_else() 

aber nicht Maßstab (was passiert, wenn Sie --delete an die sich gegenseitig ausschließende hinzufügen Gruppe usw.), also suche ich nach einer besseren Möglichkeit, jede andere Variable dazu zu bringen, opts.show false zu machen, während sie immer noch als Standard eingestellt ist.

Ich lese die argparse docs, ich denke, eine benutzerdefinierte Aktion wäre der Weg zu gehen, aber nicht sehen, wie man auf die anderen Mitglieder der sich gegenseitig ausschließenden Gruppe von innen zugreifen kann (die Theorie, ich könnte über sie iterieren, und kippen Sie den Standard, wenn einer der anderen eingestellt wurde). Die andere Möglichkeit wäre, die if-Bedingungen umzukehren, aber das scheint unrein zu sein (wenn sich der Standard ändert, müsste sich auch die Reihenfolge der if-Anweisungen ändern).

Antwort

19

Es kommt mir vor, dass vielleicht 'store_const' eine geeignetere Aktion wäre (mit allen Argumenten, die auf dasselbe Ziel verweisen).

import argparse 
parser = argparse.ArgumentParser() 
mutex_group = parser.add_mutually_exclusive_group() 
mutex_group.add_argument("--show", action="store_const", 
    dest="mutex", const="show") 
mutex_group.add_argument("--insert", action="store_const", 
    dest="mutex", const="insert") 
mutex_group.add_argument('--delete', action="store_const", 
    dest="mutex", const="delete") 


parser.set_defaults(mutex='show') 
args = parser.parse_args() 
print(args) 

Jetzt können Sie args.mutex verwenden, um herauszufinden, welche Aktion auszuführen.

Verwandte Themen