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

时间:2012-09-06 15:33:44

标签: python arguments command-line-arguments argparse

我意识到这很像Setting default option in Python of two mutually exclusive options using the argparse module,虽然从不同的角度来看(那里给出的答案似乎没有帮助)。

代码块(解析器是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()

如果未指定--show--insert,我希望默认为--show(因此default=True),但如果使用--insertopts.show仍然设置为true(因为默认值),尽管它是互斥块的一部分。

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

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

但这不会扩展(当你将--delete添加到互斥组时会发生什么等等)所以我正在寻找一种更好的方法来使每个其他变量都成为opts.show如果仍然将其作为默认值,则为false。

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

1 个答案:

答案 0 :(得分: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)

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