5

我创建了一个这样的 argparser:

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

但是,仅对于选项“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 

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

4

2 回答 2

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)
  • 这与您的规范不同,因为-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)

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

parser.error('-b required with -a x')
于 2013-07-31T22:22:26.533 回答
2

ArgumentParser 支持使用 add_subparsers() 方法创建此类子命令。add_subparsers() 方法通常不带参数调用,并返回一个特殊的操作对象。这个对象有一个方法,add_parser(),它接受一个命令名和任何 ArgumentParser 构造函数参数,并返回一个可以像往常一样修改的 ArgumentParser 对象。

ArgumentParser.add_subparsers()
于 2013-07-29T06:32:20.167 回答