Python argparse:将可选参数与nargs = argparse.REMAINDER组合 [英] Python argparse: Combine optional parameters with nargs=argparse.REMAINDER

查看:263
本文介绍了Python argparse:将可选参数与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起作用.这是输入,后面是parser1和parser 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆