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).