如果未指定,则argparse存储为false


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

如果-auto未指定,如何存储假?我可以淡淡地记得这种方式,如果未指定,它将存储None

Answers:


171

store_true选项自动创建默认值False

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

此行为的来源简洁明了:http : //hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

argparse文档尚不清楚,所以我现在将对其进行更新:http : //hg.python.org/cpython/rev/49677cc6d83a


2
关于此的一些评论。首先,如果该选项为-bar,则似乎基于hg.python.org/cpython/rev/49677cc6d83adest自动设置为。但是,我看不到在代码中设置此默认行为的位置。我一直在明确设置参数。另外,我觉得让默认为为选项并没有真正意义,如果是。不应该是在这种情况下?bardestbardest--bar--barstore_falsedestnotbar
Faheem Mitha 2013年

4
我不了解反向命名惯例。
brainLoop19年

我同意,这有点令人困惑。无论如何,“ store_false”或“ store_true”被指定为操作而不是默认值。因此,当您将此参数添加到程序时,将触发指定的操作。
ady

15

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

跑步

% test.py

产量

Namespace(auto=False)

因此False,默认情况下它似乎正在存储。


3

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

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

-4

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 2015年

2
抱歉,这实际上是optparse的默认行为。argparse应该默认为存储的倒数。即,“ store_false”默认为“ True”。
Unix忍者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.