Python argparse';s";“必需”;在帮助屏幕中被忽略?
考虑以下代码:Python argparse';s";“必需”;在帮助屏幕中被忽略?,python,argparse,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
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
通常,argparse
的范例是按位置传递所需的参数,而作为选项传递的参数应该是可选的。考虑到这种“糟糕的形式”,甚至不鼓励设置required
标志
我只能说,生成的误导性帮助消息是argparse中的一个小缺点,您可以在python的bug跟踪器上为它创建一个记录单
如果您需要一个必需的选项,则可以覆盖默认用法消息。这是尚未修复的。你可以在那里读更多。请注意,用法行确实正确地指示需要开关(如果不需要,用法行将读取use:test.py[-h][-o]
,而不是use:test.py[-h]-o
)
为了解决这个问题,您可以给它一个
标题
。如链接页面上的示例所示,这允许您使用自己选择的名称创建组,而不是默认的位置参数
和可选参数
分组。简单的答案是没有“必需参数”组。标记了两个默认组(无论好坏)
实际上有4个“需求”选项-普通选项、普通位置、必需选项、可选位置。如果名称混淆,请使用前两个名称。:)
产生:
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
这些备选方案以符号形式显示在使用行中,没有(可能)混淆的标签
值得一提的是,“optionals”和“positional”之间的区别深深地嵌入到
argparse
代码中。一种由标志字符串('-f','-foo')标识,另一种由位置标识。一个或另一个是“必需”的事实是肤浅的。唯一使一些选项成为“必需”的是在解析结束时进行一点错误检查。这不是我想问的。问题是为什么它说它是可选的,而不是必需的。我很确定help标志的特殊情况是忽略其余的参数,因为期望它们不重要,因为您要做的只是打印帮助,然后立即退出。尽管如此,“帮助”屏幕显然是错误的。正如“推荐”是构建CLI的一个非常好的库一样,我会说它没有显示足够的信息,但并不是说它错了。它并没有说-o
是可选的。。。它只是没有指定。你能详细说明一下如何最好地更改ArgumentParser
对象的默认用法消息(部分内容)吗?该修补程序正在失效,部分原因是没有人提出一个简单的、被广泛接受的备选名称对。
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