如果另一个互斥参数为true,则将默认值设置为false

tol*_*ien 10 python arguments command-line-arguments argparse

我意识到这很像使用argparse模块在Python中设置两个互斥选项的默认选项,尽管从不同的角度来看(并且给出的答案似乎没有帮助).

代码块(解析器是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()
Run Code Online (Sandbox Code Playgroud)

如果没有--show--insert指定我想默认为--show(因此default=True),但如果--insert被使用,则opts.show仍设置为true(因为默认的),尽管是一个互斥块的一部分.

当前代码检查在测试是否opt.show为True 时没有设置任何其他选项,即:

if opts.show and not opts.insert:
    do_something()
elif opts.insert:
    do_something_else()
Run Code Online (Sandbox Code Playgroud)

但是这不会扩展(当您添加--delete到互斥组时会发生什么,等等)所以我正在寻找一种更好的方法来使其他变量变为opts.showfalse,同时仍然将其作为默认值.

阅读argparse文档,我认为自定义操作将是可行的方法,但无法看到如何从内部访问互斥组的其他成员(理论是我可以迭代它们,并翻转默认值,如果剩下的任何一个都设定了).另一种选择是反转if条件,但这似乎是不清洁的(如果默认更改,if语句的顺序也必须改变).

mgi*_*son 20

在我看来,这'store_const'可能是一个更合适的行动(所有参数都指向同一个目的地).

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)
Run Code Online (Sandbox Code Playgroud)

现在您可以args.mutex用来确定要执行的操作.