Python argparse 如何从命令行传递 False?

Posted

技术标签:

【中文标题】Python argparse 如何从命令行传递 False?【英文标题】:Python argparse how to pass False from the command line? 【发布时间】:2018-11-29 22:58:32 【问题描述】:

我正在尝试整理如何将布尔值 False 从命令行传递给 argparser。我的原始代码如下所示:

import argparse
parser = argparse.ArgumentParser(allow_abbrev=True)
parser.add_argument('-data', default=True, type=bool, help='uses the history file')
args = parser.parse_args(sys.argv[1:])

我在命令行中输入:python myscript.py -data False

还有单引号和双引号围绕 False 的变体。当我检查 args 命名空间的内容时,args.data 始终为 True。

所以我把参数定义从bool改成了str,字符串“True”默认如下:

parser.add_argument('-data', default="True", type=str, help='uses the history file')

然后我添加了一些 args 的按摩以获得我真正想要的布尔值:

if re.search("f", args.data, re.I):
   args.data = False
else:
   args.data = True

此解决方法确实有效。有没有更好的方法来做到这一点?

【问题讨论】:

bool 将任何非空字符串转换为 True ***.com/questions/715417/… 你也可以使用store_true查看:***.com/questions/32884131/… 【参考方案1】:

您可以将store_falsestore_true 参数用于add_argument(请参阅the argparse documentation)。例如,如果您希望默认为 True,那么您可以使用 action='store_false' 添加参数:

parser.add_argument('--no-data', action='store_false', help="don't use the history file")

如果你运行 python command.py --no-dataTrue 如果你运行 python command.py 没有 --no-data 参数,那么 args.no_data 将是 False

【讨论】:

非常感谢! action='store_false' 是我需要的。 使用其他变量名不是更有意义吗?像dest='data' 这样的话,不是args.no_data 是错误的,而是args.data【参考方案2】:
def my_bool(s):
    return s != 'False'

parser.add_argument('-data',default=True,type=my_bool)

【讨论】:

谢谢,这正是我所需要的。我现在不能在我的应用程序中使用标志。【参考方案3】:

如果参数是布尔值,您应该简单地使用store_truestore_false,这样选项本身的存在将导致TrueFalse 值,并且不存在该选项将分别产生FalseTrue 值。

来自argparse's documentation:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)

【讨论】:

非常感谢! action='store_false' 是我需要的。 我可以同时使用store_truestore_false吗? 启用这两个选项意味着什么?选项的值不能同时是TrueFalse

以上是关于Python argparse 如何从命令行传递 False?的主要内容,如果未能解决你的问题,请参考以下文章

在 argparse 中从变量而不是命令行获取值

python argparse - 在没有命令行的情况下传递值

使用 argparser 将参数传递给入口点 python 脚本

如何使用 argparse 将列表作为命令行参数传递?

python命令行传递参数的两种方式

python使用argparse解析命令行参数