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

Posted

技术标签:

【中文标题】如果另一个互斥参数为真,则将默认值设置为假【英文标题】:Set the default to false if another mutually exclusive argument is true 【发布时间】:2012-08-31 11:28:18 【问题描述】:

我意识到这很像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是否为True时检查是否没有设置其他选项,即:

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

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

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

【问题讨论】:

【参考方案1】:

我突然想到'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 来确定要执行的操作。

【讨论】:

以上是关于如果另一个互斥参数为真,则将默认值设置为假的主要内容,如果未能解决你的问题,请参考以下文章

jieba.lcut方法

and 与 or的计算规则

如果数组中的所有值都为真(字符串)并且其中一个值为假(字符串),则如何返回布尔值 true 停止使用 Javascript 进行检查

jinja模版

当应该为真时,Android Studio 改造响应返回布尔值为假

如何将数据框中的真假值转换为 1 为真,0 为假