如果未指定,则 argparse 存储 false

Posted

技术标签:

【中文标题】如果未指定,则 argparse 存储 false【英文标题】:argparse store false if unspecified 【发布时间】:2012-01-02 11:14:40 【问题描述】:
parser.add_argument('-auto', action='store_true')

如果未指定 -auto,我如何存储 false?我依稀记得这样,如果未指定,它会存储 None

【问题讨论】:

【参考方案1】:

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

运行

% test.py

产量

Namespace(auto=False)

所以它似乎默认存储False

【讨论】:

【参考方案2】:

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

【讨论】:

一些关于这个的cmets。首先,如果选项是-bar,那么dest 会自动设置为bar,基于hg.python.org/cpython/rev/49677cc6d83a。但是,我看不到在代码中设置此默认行为的位置。我总是明确设置 dest 参数。另外,如果--barstore_false,我认为让bar 默认为dest--bar 选项并没有意义。在这种情况下,dest 不应该是 notbar 吗? 我不懂逆向命名约定。 我同意,这有点令人困惑。无论如何,“store_false”或“store_true”被指定为操作而不是默认值。因此,当您将此参数添加到程序时,会触发指定的操作。 'store_true' 和 'store_false' - 这些是 'store_const' 的特殊情况,分别用于存储值 True 和 False。此外,它们分别创建 False 和 True 的默认值。消息来源:docs.python.org/3/library/argparse.html#action【参考方案3】:

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) 对不起,这实际上是 optparse 的默认行为。 argparse 应该默认为 store 的倒数。即,“store_false”默认为“True”。【参考方案4】:

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

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

例如,如果代码是-

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

当 stop_logging 中的值为 true 时,代码阅读器可能希望日志记录语句关闭。但是像下面这样的代码会导致相反的行为 -

if not stop_logging:
    #log

另一方面,如果接口定义如下,那么“if-statement”可以工作并且更易于阅读 -

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

【讨论】:

您可以设置目的地别名,这将提高可读性:parser.add_argument('--stop_logging', action='store_false', dest='use_logging').

以上是关于如果未指定,则 argparse 存储 false的主要内容,如果未能解决你的问题,请参考以下文章

在python中使用argparse将csv转换为xml

argparse 可选位置参数?

如果只给出一个参数,则不同的 argparse 规则

如何创建具有多个位置参数的 argparse 互斥组?

javascript 如果指定的元素在视口中可见,则返回true,否则返回false

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