带有子parser和可选位置参数的Python argparse

带有子parser和可选位置参数的Python argparse,python,python-3.x,argparse,Python,Python 3.x,Argparse,我希望有一个带有子parser的程序,它可以处理特定的参数,同时还可以为以前的解析器保留一些位置参数和可选参数(事实上,我真正想要的只是一个选项,我的意思是,一个有效的子parser或一个有效的局部参数) 我想要的东西的例子:程序[{sectionName[{a,b}]}][{c,d}]。如果提供了sectionName,则c/d不兼容,反之亦然 然而,我能达到的最好效果是test.py[-h]{sectionName}。。。[{c,d}]。这意味着,argparse不允许在未指定有效的节名的情

我希望有一个带有子parser的程序,它可以处理特定的参数,同时还可以为以前的解析器保留一些位置参数和可选参数(事实上,我真正想要的只是一个选项,我的意思是,一个有效的子parser或一个有效的局部参数)

我想要的东西的例子:
程序[{sectionName[{a,b}]}][{c,d}]
。如果提供了sectionName,则c/d不兼容,反之亦然

然而,我能达到的最好效果是
test.py[-h]{sectionName}。。。[{c,d}]
。这意味着,argparse不允许在未指定有效的
节名的情况下使用位置参数c或d

代码如下:

import argparse
mainparser=argparse.ArgumentParser()
#亚帕瑟
subparser=mainparser.add_subparser(title=“section”,required=False)
subparser\u parser=subparser.add\u parser(“sectionName”)
子parser_parser.add_参数(“属性”,选项=['a','b'],nargs='?'))
#主解析器位置属性和可选属性
mainparser.add_参数(“attribute”,choices=['c','d'],nargs='?'))
mainparser.parse_args()
我都快疯了。任何帮助都将不胜感激


编辑:我使用的是
Python3.8

子parser
对象实际上是一个位置
操作
,它接受
选择
——在本例中是
{'sectionName'}
positinal
参数按照定义的顺序填充,使用
nargs
模式分配字符串

一旦主解析器获得“sectionName”,它就会将解析传递给
子解析器
。然后处理其余的输入,例如
{'a','b'}
位置。它无法处理的任何内容都会被放在“unrecognized”列表中,控件会返回
main
进行最终处理
main
不进行任何进一步的参数处理。因此,
属性
参数被忽略

您可以将define一个
属性
positional放在
add_subparser
之前,但我不会尝试将其设置为
nargs='?'


因此,最好在子parser之前定义所有
main
参数,并使用
optionals
。这将提供最干净、最可靠的解析。

子parser
对象实际上是一个位置
操作
,它执行
选择
——在本例中是
{'sectionName'}
positinal
参数按照定义的顺序填充,使用
nargs
模式分配字符串

一旦主解析器获得“sectionName”,它就会将解析传递给
子解析器
。然后处理其余的输入,例如
{'a','b'}
位置。它无法处理的任何内容都会被放在“unrecognized”列表中,控件会返回
main
进行最终处理
main
不进行任何进一步的参数处理。因此,
属性
参数被忽略

您可以将define一个
属性
positional放在
add_subparser
之前,但我不会尝试将其设置为
nargs='?'


因此,最好在子parser之前定义所有
main
参数,并使用
optionals
。这将提供最干净、最可靠的解析。

感谢您的回复!但是,我想让位置参数保持可选。我的意思是,我真正的目的是在内部使用argparse的python cmd2下使用它。为此,命令应该有一些语法,如:
show interface
show interface interfaceName
,因此它们可以有(或没有)具有多个子阵列级别的位置。某些命令要求具有可选参数,同时可能具有用于“复杂”位置的某些子参数。可能的示例:
show interface interfaceName onDevice xxx
其中
onDevice
是一个处理devs的子角色。此外,我尝试使用不同的
require
nargs
选项对命令进行重新排序,但没有一个选项接近我所说的:-(请记住,在解析位置时,
argparse
严格按位置工作,使用
nargs
进行模式匹配。它不检查值。
选项
测试在分配后完成。在您的示例中,它不查找“d”或“b”或“sectionName”字符串。使用
optionals
查找r特定的标志值。我想我理解你的观点。这不是我期望的答案,但有时会有难以克服的限制。非常感谢@hpaulj占用你的时间。感谢hpaulj的回复!但是,我想让位置参数保持可选。我的意思是,我的真正目的是在python cmd2 whic下使用它h在内部使用argparse。为此,命令应该有一些语法,如:
show interface
show interface interfaceName
,因此它们可以有(或没有)具有多个子分区级别的位置。一些命令要求同时具有可选参数,它可能有一些子分区用于“complex”位置。可能的示例:
show interface interface name onDevice xxx
其中
onDevice
是一个处理devs的子角色。此外,我尝试使用不同的
require
nargs
选项对命令进行重新排序,但没有一个选项接近我所说的:-(请记住,在解析位置时,
argparse
严格按位置工作,使用
nargs
进行模式匹配。它不检查值。
选项
测试在分配后完成。在您的示例中,它不查找“d”或“b”或“sectionName”字符串。使用
optionals
查找我想我理解你的观点。这不是我期望的答案,但是