在定制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
(或false)参数,只需检查它们的真值。对于其他我喜欢测试默认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
意味着没有找到;至少有一个礼物; ==len(ll)
全部找到; >1
违反互相排斥; '== 1'表示需要互斥。
对于Python错误/问题补丁我想知道什么是这种'需要任何'条件的良好用法消息。 '|'已经用于互斥'xor'条件。像这样的条件测试更容易设计一个好的API。 – hpaulj