argparse" s" required"在帮助屏幕中被忽略了?

时间:2015-09-29 23:42:44

标签: python argparse

请考虑以下代码:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-o', required=True, nargs=1)
parser.parse_args(['-h'])

为什么即使我说-o是必需的,我也会得到以下输出?

usage: test.py [-h] -o O

optional arguments:
  -h, --help  show this help message and exit
  -o O

我希望帮助文字说明-o是必需的。

3 个答案:

答案 0 :(得分:5)

这是issue #9694 on the Python bug tracker,尚未修复。你可以在那里阅读更多。请注意,使用行确实表明需要切换(如果不是,则使用行将显示为usage: test.py [-h] [-o O]而不是usage: test.py [-h] -o O)。

要解决此问题,您可以use argument groups获得title。如示例在链接页面上显示的那样,您可以使用您选择的名称创建组,而不是默认的positional argumentsoptional arguments分组。

答案 1 :(得分:1)

通常required的范例是所需的参数是按位置传递的,而作为选项传递的参数应该是可选。考虑到这种“糟糕的形式”,docs甚至不鼓励设置.near标志。

我只能建议产生的误导性帮助消息是argparse的一个小缺点,你可以在python的bug跟踪器上为它创建一张票。

如果您拥有必需选项至关重要,则可以覆盖默认用法消息。

答案 2 :(得分:1)

简单的答案是没有“必需参数”组。标记了两个默认组(无论好坏)

positional arguments
optional arguments

实际上有4个“要求”替代方案 - 正常选项,正常位置,所需选项,可选位置。如果名字令人困惑,坚持前两个。 :)

parser = argparse.ArgumentParser()
parser.add_argument('foo', help='a positional argument')
reqgroup=parser.add_argument_group('required arguments')
reqgroup.add_argument('-o', required=True, help='required optional')
parser.add_argument('-n',  help='normal optional')
parser.add_argument('bar',nargs='?', help='optional positional argument')
parser.print_help()

产生

usage: ipython3.5 [-h] -o O [-n N] foo [bar]

positional arguments:
  foo         a positional argument
  bar         optional positional argument

optional arguments:
  -h, --help  show this help message and exit
  -n N        normal optional

required arguments:
  -o O        required optional

这些替代品在使用行中象征性地显示,没有(可能)令人困惑的标签。

对于它的价值,“选项”和“位置”之间的区别深深地嵌入在argparse代码中。一种由标志字符串('-f',' - foo')标识,另一种由位置标识。一个或另一个是“必需的”这一事实是肤浅的。唯一让optionals'需要'的东西是在解析结束时进行一些错误检查。