我一定错过了一些明显的东西.目标是使用argparse和第一个参数,第二个可选参数和任何其他剩余参数可选.
为了表明这个问题我做了两个测试解析器; 它们之间的唯一区别是在一个中使用nargs = argparse.REMAINDER而在另一个中使用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
Run Code Online (Sandbox Code Playgroud)
如果没有额外的参数,parser2可以工作.这是解析器1和解析器1后面的输入:
input: ['req1value', '--opt1', 'opt1value']
Namespace(leftovers=['--opt1', 'opt1value'], opt1=None, req1='req1value')
Namespace(leftovers=None, opt1='opt1value', req1='req1value')
Run Code Online (Sandbox Code Playgroud)
如果有额外的参数,则在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
Run Code Online (Sandbox Code Playgroud)
预期产量应为:
Namespace(leftovers=['r1', 'r2'], opt1='opt1value', req1='req1value')
Run Code Online (Sandbox Code Playgroud)
看起来这应该是一个简单的案例,这里简化了我真正想做的事情.我尝试过剩饭可选,添加了各种其他选项,但没有什么比这更好了.
任何帮助,将不胜感激.
--opt1需要在“未命名”参数之前。您的真实测试用例应为:
['--opt1', 'opt1value', 'req1value']
Run Code Online (Sandbox Code Playgroud)
和
['--opt1', 'opt1value', 'req1value', 'r1', 'r2']
Run Code Online (Sandbox Code Playgroud)
你可以使用parse_known_args:
import argparse
parser = argparse.ArgumentParser(description='Parser demo.')
parser.add_argument('req1', help='first required parameter')
parser.add_argument('--opt1', help='first optional parameter')
args, leftovers = parser.parse_known_args(['req1value', '--opt1', 'opt1value'])
print(args, leftovers)
# (Namespace(opt1='opt1value', req1='req1value'), [])
args, leftovers = parser.parse_known_args(['req1value', '--opt1', 'opt1value', 'r1', 'r2'])
print(args, leftovers)
# (Namespace(opt1='opt1value', req1='req1value'), ['r1', 'r2'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4241 次 |
| 最近记录: |