11

我意识到这很像使用 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()

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

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

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

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

阅读 argparse 文档,我认为自定义操作将是可行的方法,但看不到如何从其中访问互斥组的其他成员(理论是我可以遍历它们,如果其余的任何一个都设置好了)。另一种选择是反转 if 条件,但这似乎不干净(如果默认更改,if 语句的顺序也必须更改)。

4

1 回答 1

21

在我看来,这'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它来确定要执行的操作。

于 2012-09-06T15:58:35.033 回答