请考虑以下代码:
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
是必需的。
答案 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 arguments
和optional 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
'需要'的东西是在解析结束时进行一些错误检查。