关于自定义usage的问题:
解析器构造函数采用usage 参数。立竿见影的效果是设置一个属性:
parser = argparse.ArgumentParser( ... usage=custom_usage...)
print(parser.usage)
# should show None or the custom_usage string
作为一个普通的 Python 对象属性,您可以在创建解析器后更改它。
usage_str = parser.format_usage()
format_usage 方法要求解析器创建将在帮助(和错误消息)中显示的用法。如果parser.usage 的值为None,它会根据参数对其进行格式化。如果是字符串,则按原样使用(我认为它填充像%(prog)s 这样的值)。
因此您可以从头开始编写用法字符串。或者您可以设置解析器,获取当前使用字符串,然后根据您的需要对其进行编辑。编辑很可能是您在开发期间所做的事情,同时在 IDE 中测试解析器。但它可以即时完成。
一个粗略的例子:
In [441]: parser=argparse.ArgumentParser()
In [442]: g=parser.add_mutually_exclusive_group()
In [443]: g.add_argument('--foo')
In [444]: g.add_argument('--bar')
In [445]: ustr = parser.format_usage()
# 'usage: ipython3 [-h] [--foo FOO | --bar BAR]\n'
In [450]: parser.usage = ustr.replace('[','(').replace(']',')')
In [451]: parser.format_usage()
# 'usage: usage: ipython3 (-h) (--foo FOO | --bar BAR)\n'
我已将 [] 替换为 ()(甚至在 -h 上:()。
目前测试args 属性的逻辑组合是最佳选择。在 parse_args 函数中,解析器维护一个它所看到的参数列表(实际上是一组)。这用于测试所需的参数和相互排斥的参数,但它在该代码之外不可用。
对于store_true(或错误)参数,只需检查它们的真值即可。对于其他人,我喜欢测试默认的None。如果您使用其他 default 值,请进行相应测试。 None 的一个好处是用户不能给你那个值。
也许测试参数最通用的方法是计算不是None的属性的数量:
In [461]: args=argparse.Namespace(one=None, tow=2, three=None)
In [462]: ll = ['one','tow','three']
In [463]: sum([getattr(args,l,None) is not None for l in ll])
Out[463]: 1
0 表示没有找到; >0至少有一份; ==len(ll) 全部找到; >1 违反互斥性; '==1' 表示必需的互斥。