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

17

我正在努力想办法将命令行传递的布尔值 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')

然后我对参数进行了一些处理,以获得我真正想要的布尔值:

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

这种解决方法是有效的。是否有更好的方法来实现这个目标?


bool 将任何非空字符串转换为 True。https://dev59.com/snRB5IYBdhLWcg3wHkPi - dashiell
你也可以使用 store_true 参见:https://dev59.com/8Y_ea4cB1Zd3GeqPRaka - Patrick Haugh
3个回答

14
您可以使用add_argument中的store_falsestore_true参数(请参见argparse文档)。例如,如果您想要默认值为True,则可以添加一个带有action='store_false'的参数:
parser.add_argument('--no-data', action='store_false', help="don't use the history file")

当您执行 python command.py --no-data 命令时,args.no_data 将为 False,而在执行没有 --no-data 参数的 python command.py 命令时,它将为 True


非常感谢!action='store_false' 就是我需要的。 - John Brearley
1
使用其他变量名称会更有意义吗?比如 dest='data' 这样,它不是 args.no_data 是假的,而是 args.data - Wassadamo

5
def my_bool(s):
    return s != 'False'

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

谢谢,这正是我所需要的。目前我无法在我的应用程序中使用标志。 - jonathanking

5
如果一个参数应该是布尔值,你应该简单地使用 store_truestore_false,这样选项本身的存在将导致一个 TrueFalse 值,而选项不存在将分别导致一个 FalseTrue 值。
来自 argparse 文档
>>> 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' 正是我所需要的。 - John Brearley
我可以同时使用 store_truestore_false 吗? - alper
启用这两个选项,您的目标是什么?一个选项的值不能同时为“True”和“False”。 - blhsing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接