python argparser用于部分选择的多个参数

python argparser用于部分选择的多个参数,python,argparse,Python,Argparse,我创建了一个argparser,如下所示: parser = argparse.ArgumentParser(description='someDesc') parser.add_argument(-a,required=true,choices=[x,y,z]) parser.add_argument( ... ) 但是,仅对于选项“x”,而不是选项“y,z”,我想要一个额外的必需参数。例如 python test -a x // not fine...needs a

我创建了一个argparser,如下所示:

  parser = argparse.ArgumentParser(description='someDesc')
  parser.add_argument(-a,required=true,choices=[x,y,z])
  parser.add_argument( ... )
但是,仅对于选项“x”,而不是选项“y,z”,我想要一个额外的必需参数。例如

python test -a x       // not fine...needs additional MANDATORY argument b
python test -a y       // fine...will run
python test -a z       // fine...will run  
python test -a x -b "ccc"       // fine...will run 
如何使用ArgumentParser实现这一点?我知道用bash OptPasser是可能的

ArgumentParser支持使用 添加_subparsers()方法。add_subparsers()方法通常是 不带参数调用并返回特殊操作对象。这 对象有一个方法add_parser(),该方法采用命令名 和任何ArgumentParser构造函数参数,并返回 ArgumentParser对象,可以像往常一样修改


要详细说明次帕瑟方法,请执行以下操作:

sp = parser.add_subparsers(dest='a')
x = sp.add_parser('x')
y=sp.add_parser('y')
z=sp.add_parser('z')
x.add_argument('-b', required=True)
  • 这与您的规范不同,因为不需要
    -a
  • dest='a'
    参数确保名称空间中存在“a”属性
  • 通常不需要像'-b'这样的可选选项。子Parser“x”也可以采取所需的位置
如果必须使用
-a
可选,则两步解析可能会起作用

p1 = argparse.ArgumentParser()
p1.add_argument('-a',choices=['x','y','z'])
p2 = argparse.ArgumentParser()
p2.add_argument('-b',required=True)
ns, rest = p1.parse_known_args()
if ns.a == 'x':
    p2.parse_args(rest, ns)
第三种方法是事后自己做测试。您仍然可以使用argparse错误机制

parser.error('-b required with -a x')
parser.error('-b required with -a x')