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

sia*_*mii 86 python command-line-arguments argparse

parser.add_argument('-auto', action='store_true')
Run Code Online (Sandbox Code Playgroud)

如果-auto未指定,我如何存储假?我可以隐约记得这样,如果没有指定,它会存储None

Ray*_*ger 146

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

  • 我不明白逆向命名约定。 (17认同)
  • 我同意,这有点令人困惑。无论如何,“store_false”或“store_true”被指定为操作而不是默认值。因此,当您将此参数添加到程序中时,将触发指定的操作。 (6认同)
  • 关于此的一些评论。首先,如果选项为`-bar`,则基于http:// hg.python.org / cpython / rev / 49677cc6d83a,`dest`会自动设置为`bar`。但是,我看不到在代码中设置此默认行为的位置。我一直在明确设置`dest`参数。另外,我认为,如果--bar选项为store_false,将--bar选项的bar默认设置为dest并没有任何意义。在这种情况下,“ dest”是否应该是“ notbar”? (2认同)
  • @brainLoop我认为'store_true'和'store_false'回答了这个问题 - “当传递这个键/参数时要存储什么布尔值(当然没有值)?”。将布尔值传递给该键会导致“忽略显式参数”行中出现错误消息。例如,假设键是“do_something”,它可以存储 True 或 False 的布尔值。如果 action='store_true' 并且命令行看起来像 `./my_python_script --do_something` 那么 do_something 将被设置为 'True'。相反,如果同一命令行的 action='store_false',则 do_something 将设置为 'False'。 (2认同)

Mon*_*lto 15

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

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

例如,如果代码是 -

parser.add_argument('--stop_logging', action='store_false')
Run Code Online (Sandbox Code Playgroud)

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

if not stop_logging:
    #log
Run Code Online (Sandbox Code Playgroud)

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

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
    #log
Run Code Online (Sandbox Code Playgroud)

  • 您可以设置目标别名,这将提高可读性:`parser.add_argument('--stop_logging', action='store_false', dest='use_logging')`。 (27认同)

unu*_*tbu 10

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)
Run Code Online (Sandbox Code Playgroud)

赛跑

% test.py
Run Code Online (Sandbox Code Playgroud)

产量

Namespace(auto=False)
Run Code Online (Sandbox Code Playgroud)

所以它似乎False默认存储.