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

查看:23
本文介绍了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 可以工作.这是输入后跟解析器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屋!

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