Python argparse:将可选参数与 nargs=argparse.REMAINDER 结合 [英] Python argparse: Combine optional parameters with nargs=argparse.REMAINDER
问题描述
我一定遗漏了一些明显的东西.目标是将 argparse 与需要的第一个参数、第二个可选参数和任何其他可选参数一起使用.
I must be missing something obvious. The goal is to use argparse with the first parameter required, a second optional and any other remaining parameters optional.
为了说明问题,我做了两个测试解析器;它们之间的唯一区别是在一个中使用 nargs=argparse.REMAINDER,在另一个中使用 nargs='*'.
To show the issue I made two test parsers; the only difference between them is using nargs=argparse.REMAINDER in one and nargs='*' in the other.
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 可以工作.这是输入后跟解析器1和解析器1:
If there are no extra parameters, parser2 works. This is the input followed by parser1 and parser 1:
input: ['req1value', '--opt1', 'opt1value']
Namespace(leftovers=['--opt1', 'opt1value'], opt1=None, req1='req1value')
Namespace(leftovers=None, opt1='opt1value', req1='req1value')
如果有额外的参数,在 parser1 中缺少 opt1 值,而 parser2 只会混淆:
If there are extra parameters, the opt1 value is missed in parser1 and parser2 just gets confused:
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')
这似乎应该是一个简单的案例,这里的内容是从我真正想做的事情中简化出来的.我试过让剩菜可选,添加各种其他选项,但没有任何效果更好.
It seems this should be a simple case and what is here is simplified from what I'm really trying to do. I've tried making leftovers optional, adding a variety of other options, but nothing works any better.
任何帮助将不胜感激.
推荐答案
--opt1
需要出现在未命名"参数之前.您真正的测试用例应该是:
--opt1
needs to come before "unnamed" arguments. Your real test cases should be:
['--opt1', 'opt1value', 'req1value']
和
['--opt1', 'opt1value', 'req1value', 'r1', 'r2']
这篇关于Python argparse:将可选参数与 nargs=argparse.REMAINDER 结合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!