我想要一个带有子解析器的程序,它可以处理特定的参数,同时还为之前的解析器保留一些位置和可选参数(事实上,我真正想要的只是一个选项,我的意思是,一个有效的子解析器或一个有效的本地参数)。
我希望拥有的东西的例子:Program [{sectionName [{a,b}]}] [{c,d}]
。如果提供了sectionName,则c/d不兼容,反之亦然。
然而,我能做到的最好的就是这个test.py [-h] {sectionName} ... [{c,d}]
。这意味着,argparse 不允许我在未指定有效的情况下使用位置参数 c 或 dsectionName
.
这是代码:
import argparse
mainparser = argparse.ArgumentParser()
# Subparser
subparser = mainparser.add_subparsers(title="section", required=False)
subparser_parser = subparser.add_parser("sectionName")
subparser_parser.add_argument("attribute", choices=['a', 'b'], nargs='?')
# Main parser positional and optional attributes
mainparser.add_argument("attribute", choices=['c', 'd'], nargs='?')
mainparser.parse_args()
我对此感到疯狂。任何帮助将非常感激!
编辑:我正在使用Python 3.8
The subparser
对象实际上是一个位置Action
,一个需要choices
- 在这种情况下{'sectionName'}
. positinal
参数按照定义的顺序填充,使用nargs
分配字符串的模式。
一旦主解析器获取“sectionName”,它将解析传递给subparser_parser
。 Than 处理其余的输入,例如{'a','b'}
位置性的。它无法处理的任何内容都会被放入“无法识别”列表中,然后控制权返回main
进行最终处理。main
不做任何进一步的参数处理。因此你的attribute
参数被忽略。
你可以定义一个attribute
之前的位置add_subparsers
,但我不会尝试做到这一点nargs='?'
.
所以最好定义所有main
子解析器之前的参数,并使用optionals
。这将提供最干净、最可靠的解析。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)