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

GJa*_*ain 5 python argparse

我创建了一个像这样的argparser:

  parser = argparse.ArgumentParser(description='someDesc')
  parser.add_argument(-a,required=true,choices=[x,y,z])
  parser.add_argument( ... )
Run Code Online (Sandbox Code Playgroud)

但是,仅用于选择"x"而不用于选择"y,z",我想要一个额外的REQUIRED参数.例如.

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 
Run Code Online (Sandbox Code Playgroud)

如何使用ArgumentParser实现这一目标?我知道它可能与bash optparser

hpa*_*ulj 5

要详细说明次解析器方法:

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)
Run Code Online (Sandbox Code Playgroud)
  • 这与您的规范不同,因为-a不需要。
  • dest='a' 参数确保名称空间中有一个“ a”属性。
  • 通常不需要可选的'-b'。子解析器“ 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)
Run Code Online (Sandbox Code Playgroud)

第三种方法是在事实发生后进行自己的测试。您仍然可以使用argparse错误机制

parser.error('-b required with -a x')
Run Code Online (Sandbox Code Playgroud)