您的文章解析测试很好,特别是如果测试默认值为is None
适合您的需求。
http://bugs.python.org/issue11588'Add "necessarily inclusive" groups to argparse'
考虑使用groups
机制(mutuall_exclusive_groups的泛化)来实现像这样的测试。
我已经写了一组UsageGroups
实现像xor
(互斥)测试,and
,or
和not
。我认为那些综合性的,但我没有能够就这些行动表达你的情况。 (看起来像我需要nand
- 不和,见下文)
此脚本使用自定义Test
类,基本上实现您的解析后测试。 seen_actions
是解析已经看到的动作的列表。
class Test(argparse.UsageGroup):
def _add_test(self):
self.usage = '(if --argument then -a and -b are required)'
def testfn(parser, seen_actions, *vargs, **kwargs):
"custom error"
actions = self._group_actions
if actions[0] in seen_actions:
if actions[1] not in seen_actions or actions[2] not in seen_actions:
msg = '%s - 2nd and 3rd required with 1st'
self.raise_error(parser, msg)
return True
self.testfn = testfn
self.dest = 'Test'
p = argparse.ArgumentParser(formatter_class=argparse.UsageGroupHelpFormatter)
g1 = p.add_usage_group(kind=Test)
g1.add_argument('--argument')
g1.add_argument('-a')
g1.add_argument('-b')
print(p.parse_args())
示例输出:
1646:~/mypy/argdev/usage_groups$ python3 issue25626109.py --arg=1 -a1
usage: issue25626109.py [-h] [--argument ARGUMENT] [-a A] [-b B]
(if --argument then -a and -b are required)
issue25626109.py: error: group Test: argument, a, b - 2nd and 3rd required with 1st
usage
和错误信息仍然需要工作。它不会做任何解析后测试不能做的事情。
如果(argument & (!a or !b))
您的测试会产生错误。相反,允许的是!(argument & (!a or !b)) = !(argument & !(a and b))
。
p = argparse.ArgumentParser(formatter_class=argparse.UsageGroupHelpFormatter)
g1 = p.add_usage_group(kind='nand', dest='nand1')
arg = g1.add_argument('--arg', metavar='C')
g11 = g1.add_usage_group(kind='nand', dest='nand2')
g11.add_argument('-a')
g11.add_argument('-b')
的使用量(使用!()
标志着一个“非”测试):通过添加nand
测试我UsageGroup
类,我可以为实现你的情况
usage: issue25626109.py [-h] !(--arg C & !(-a A & -b B))
我认为这是使用通用用途组来表达这个问题的最简单,最清晰的方式。
在我的测试中,解析成功是输入:那些应该引发错误
''
'-a1'
'-a1 -b2'
'--arg=3 -a1 -b2'
的是:
'--arg=3'
'--arg=3 -a1'
'--arg=3 -b2'
你看过'argparse'子分析器吗?他们将允许你做'git commit'或'$ git merge '。 –
2014-09-02 14:43:59
乔尔,感谢您的评论。我已经看到了argparse的subparser方面,但我希望能够在没有位置参数的情况下做到这一点。如果这是唯一的方法,但它不是什么大问题 – DJMcCarthy12 2014-09-02 14:49:43
可以单独给出'--a'和'--b'吗? – hpaulj 2014-09-02 19:41:59