![](/img/trans.png)
[英]How do I add optional positional arguments with subparsers in argparse?
[英]Python argparse with subparsers and optional positional arguments
我想要一个带有子解析器的程序,它可以处理特定的参数,同时还保留一些位置和可选参数给以前的解析器(事实上,我真正想要的只是一个选项,我的意思是,一个有效的子解析器或一个有效的本地参数)。
我希望拥有的示例: Program [{sectionName [{a,b}]}] [{c,d}]
。 如果提供了 sectionName,则 c/d 不兼容,反之亦然。
然而,我能做到的最好的是这个test.py [-h] {sectionName} ... [{c,d}]
。 这意味着, argparse 不允许我使用位置参数 c 或 d 而不指定有效的sectionName
。
这是代码:
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
subparser
对象实际上是一个位置Action
,一个需要choices
- 在本例中为{'sectionName'}
。 positinal
参数按照定义的顺序填充,使用nargs
模式分配字符串。
一旦主解析器获得“sectionName”,它就会将解析传递给subparser_parser
。 Than 处理输入的其余部分,例如{'a','b'}
位置。 它无法处理的任何内容都放在“无法识别”列表中,并且控制返回main
以进行最终处理。 main
不做任何进一步的参数处理。 因此您的attribute
参数被忽略。
您可以在add_subparsers
之前定义一个位置attribute
,但我不会尝试使其nargs='?'
.
所以最好在子解析器之前定义所有main
参数,并使用optionals
。 这将提供最干净和最可靠的解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.