argparse store false if unspecified

parser.add_argument('-auto', action='store_true')

How can I store false if -auto is unspecified? I can faintly remember that this way, it stores None if unspecified

133295 次浏览

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)

跑步

% test.py

产量

Namespace(auto=False)

因此它似乎默认存储 False

store_true选项自动创建默认值 假的

同样,当不存在命令行参数时,store_false将默认为 没错

这种行为的根源是简洁明了的: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

Argparse 文档对这个主题不清楚,所以我现在更新它们: http://hg.python.org/cpython/rev/49677cc6d83a

Store _ false 在缺省情况下实际默认为 0(可以通过测试来验证)。要更改它的默认值,只需将 default=True添加到声明中。

因此,在这种情况下: parser.add_argument('-auto', action='store_true', default=True)

Raymond Hettinger 已经回答了 OP 的问题。

但是,我的团队在使用“ store _ false”时遇到了可读性问题。特别是当新成员加入我们的团队。这是因为最直观的思维方式是,当用户指定一个参数时,与该参数对应的值将为 True 或1。

例如,如果代码是-

parser.add_argument('--stop_logging', action='store_false')

代码读取器可能预期,当 stop _ log 中的值为 true 时,日志语句将关闭。但是下面这样的代码将导致所需行为的 相反-

if not stop_logging:
#log

另一方面,如果接口定义如下,那么“ if 语句”可以工作,并且读取起来更直观

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
#log

我发现默认值在 OSX 和 Linux 之间有所不同,如果没有指定的话。

使用以下代码行,

parser.add_argument('-auto', action='store_true')

然后从命令行中省略-auto 正如预期的那样,Mac 的结果是 auto 被赋值为 False, 而在 Ubuntu 上,Linux 自动默认为 True。