繁体   English   中英

带有子解析器和可选位置参数的 Python 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM