如果未指定,则 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
参数。另外,如果--bar
是store_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的主要内容,如果未能解决你的问题,请参考以下文章