我一定漏掉了一些明显的东西。目标是使用argparse,其中第一个参数是必需的,第二个是可选的,其余任何参数都是可选的。在
为了说明这个问题,我制作了两个测试解析器;它们之间唯一的区别是使用nargs=argparse.remaine其中一个是nargs,另一个是'*'。在
def doParser1(argsin):
parser = argparse.ArgumentParser(description='Parser demo.')
parser.add_argument('req1', help='first required parameter')
parser.add_argument('--opt1', help='first optional parameter')
parser.add_argument('leftovers', nargs=argparse.REMAINDER,
help='all the other parameters')
argsout = parser.parse_args(args=argsin)
print argsout
return argsout
def doParser2(argsin):
parser = argparse.ArgumentParser(description='Parser demo.')
parser.add_argument('req1', help='first required parameter')
parser.add_argument('--opt1', help='first optional parameter')
parser.add_argument('leftovers', nargs='*',
help='all the other parameters')
argsout = parser.parse_args(args=argsin)
print argsout
return argsout
如果没有额外的参数,parser2可以工作。这是parser1和parser 1后面的输入:
^{pr2}$如果有额外的参数,则parser1中缺少opt1值,parser2只会混淆:
input: ['req1value', '--opt1', 'opt1value', 'r1', 'r2']
Namespace(leftovers=['--opt1', 'opt1value', 'r1', 'r2'], opt1=None, req1='req1value')
usage: py-argparse.py [-h] [--opt1 OPT1]
[-leftovers [LEFTOVERS [LEFTOVERS ...]]]
req1
py-argparse.py: error: unrecognized arguments: r1 r2
预期产出应为:
Namespace(leftovers=['r1', 'r2'], opt1='opt1value', req1='req1value')
看起来这应该是一个简单的例子,这里的内容是从我真正想做的事情中简化出来的。我试着让剩菜成为可选的,添加了各种其他的选择,但没有什么比这更好的了。在
任何帮助都将不胜感激。在
当一个或多个位置是“零或多个”类型(
? * REMAINDER
)时,位置和选项的相互混合是很棘手的。简单的解决办法是不要把它们混在一起——先给出选项,然后再给出所有的位置。在事情是这样的:
由于
^{pr2}$req1value
字符串,解析器首先解析位置。req1
想要1个字符串,leftovers
获取其他所有内容,包括opt1
。在对于},没有字符串,因此
*
,leftovers
满足于{None
(实际上我得到[]
)。opt1
被解析为可选的。在如前所述,},那么它将按照您的预期使用它们。在
*
leftovers
被设置为[]
。-opt1
已处理。但现在有2根弦没有地方放。您希望它们进入leftovers
,但这已经被使用了。如果leftovers
是{关键是当它试图解析第一个位置时,它也会尽可能地解析所有的位置。在一个层面上,
parse_args
正在做re.match('(A)(A*)','AOA')
产生('A', '')
的群体。在有2个建议的补丁程序来处理这个问题。一个使用2个步骤
parse_known_args
来实现选项和位置的完全混合。这是optparse
的用户可能会想到的那种行为。在另一个补丁试图延迟处理可以接受
0
参数字符串http://bugs.python.org/issue15112的位置。在opt1
必须在“unnamed”参数之前。真正的测试用例应该是:以及
^{pr2}$您可以使用
parse_known_args
:相关问题 更多 >
编程相关推荐