如果未指定,argparse存储false。

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

如果未指定 -auto,如何存储 false?我依稀记得这种情况会将 None 存储下来。

5个回答

290

2
关于这个问题,我有几点评论。首先,根据http://hg.python.org/cpython/rev/49677cc6d83a,如果选项是“-bar”,那么“dest”会自动设置为“bar”。然而,我没有看到在代码中设置这种默认行为的地方。我一直都是显式地设置“dest”参数。此外,如果“--bar”是“store_false”,那么让“bar”默认为“--bar”选项的“dest”似乎并没有什么意义。在这种情况下,“dest”应该是“notbar”,不是吗? - Faheem Mitha
46
我不理解反向命名规则。 - brainLoop
6
我同意,这有点令人困惑。无论如何,“store_false”或“store_true”都被指定为操作而不是默认值。因此,当您将此参数添加到程序中时,指定的操作将被触发。 - ady
1
'store_true'和'store_false' - 这些是'store_const'的特殊情况,用于分别存储True和False值。此外,它们分别创建默认值为False和True。 - Purushothaman Srikanth
2
@brainLoop 我认为 'store_true' 和 'store_false' 已经回答了这个问题 - "当传递该键/参数时(当然没有值),要存储什么布尔值?"。将布尔值传递给该键会导致错误消息,例如“忽略显式参数”。例如,假设键是'do_something',它可以存储True或False的布尔值。如果action='store_true',并且cmdline看起来像 ./my_python_script --do_something,那么do_something将被设置为'True'。相反,如果对于同样的cmdline,action='store_false',那么do_something将被设置为'False'。 - ZeZNiQ
1
store_true选项会自动创建默认值False,需要澄清的是当arg选项不存在时也是默认值。简而言之,如果找到arg选项,store_true会分配True; 如果找到arg选项,store_false会分配False。如果未找到arg选项,则分配默认值(请检查答案的前两行),人们称之为“反面惯例”,经过一些澄清后我认为不会引起混淆。 - milpita

33

使用

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-flag', action='store_true')
args = parser.parse_args()

print(args.flag)

跑步产量
False

所以默认情况下,它似乎存储的是False

15

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

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

例如,如果代码是 -

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

当stop_logging的值为true时,代码读取器可能会期望记录语句关闭。但是像下面的代码将导致与预期行为相反 -

if not stop_logging:
    #log

另一方面,如果接口定义如下,则"if语句"有效,并且更易于阅读 -

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

25
你可以设置目标别名来提高可读性: parser.add_argument('--stop_logging', action='store_false', dest='use_logging') - Krassi

1

我发现在未指定时,默认值在OSX和Linux之间有所不同。

使用以下代码行:

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

然后在命令行中省略-auto,结果是在Mac上将自动分配一个值为False,正如预期的那样,而在Ubuntu Linux上,默认情况下将分配True给auto。


-6

store_false 实际上默认为 0(您可以测试以验证)。 要更改其默认值,只需在声明中添加 default=True

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


在Python 2.7和3.4中似乎不是这种情况:`>>> parser.add_argument('--bar', action='store_false')` `_StoreFalseAction(option_strings=['--bar'], dest='bar', nargs=0, const=False, default=True, type=None, choices=None, help=None, metavar=None)` `>>> parser.parse_args([])` `Namespace(bar=True)` - Leynos
2
抱歉,这实际上是optparse的默认行为。argparse应该默认为存储的相反值。即,'store_false' 默认为 'True'。 - Unix-Ninja

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