2012-09-06 42 views
8

我知道这很像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),但如果--insert被使用,则opts.show仍设置为true(因为默认),尽管它是互斥块的一部分。

当前的代码将检查没有其它选项已经被设置测试opt.show是否属实,当即:

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

但这并不规模(会发生什么,当你添加--delete的互斥组等),所以我正在寻找一种更好的方式,使其他变量的默认值为opts.show,同时仍将其设置为默认值。

阅读argparse文档,我认为一个自定义操作将是路要走,但无法看到如何从内部访问互斥组的其他成员(理论是我可以遍历它们,并且如果其余设置中的任何一个被设置,则翻转默认值)。 另一种选择是改变if条件,但似乎不清楚(如果默认更改,if语句的顺序也必须改变)。

回答

19

对我来说,也许'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来确定要执行的操作。

相关问题