Python argparse可选的子
我想有一个参数,我的程序有一些必需的参数以及一些可选参数。 像这样的东西:
[--print text [color [size]]
所以你可以通过任何这些:
mycommand --print hello
mycommand --print hello blue
mycommand --print hello red 12
可能有多个,所以它必须是一个add_argument。 例如:
[--print text [color]] [--output filename [overwrite]]
我可以得到接近我想要的论据:
>>> parser = argparse.ArgumentParser()
>>> act = parser.add_argument('--foo', nargs=3, metavar=('x','y','z'))
>>> act = parser.add_argument('--bar', nargs='?')
>>> act = parser.add_argument('--baz', nargs='*')
>>> parser.print_help()
usage: [-h] [--foo x y z] [--bar [BAR]] [--baz [BAZ [BAZ ...]]]
optional arguments:
  -h, --help            show this help message and exit
  --foo x y z
  --bar [BAR]
  --baz [BAZ [BAZ ...]]
  但不完全。  有没有办法用argparse来做到这一点?  我知道我可以让它们都nargs="*"但是--help不会列出可选参数的名称。  如果我将nargs="*"和元组传递给metavar,则argparse会引发异常。 
  阅读源代码(从take_action开始),我相信你想要的是不可能的。  所有参数解析和传递给动作是基于nargs完成的,nargs是数字, OPTIONAL (“?”), ZERO_OR_MORE (“*”), ONE_OR_MORE (“+”), PARSER或REMAINDER 。  这必须在Action对象(处理输入)看到它所得到的内容之前确定,所以它不能动态地计算出nargs 。 
  我认为你需要采取一种解决方法。  我可能会有--foo-x x ,-- --foo-y y和--foo-z z ,也许还有--foo xyz 。 
怎么样
def printText(args):
  print args
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
printer = subparser.add_parser('print')
printer.add_argument('text')
printer.add_argument('color', nargs='?')
printer.add_argument('size', type=int, nargs='?')
printer.set_defaults(func=printText)
cmd = parser.parse_args()
cmd.func(cmd)
然后你得到这样的东西:
$ ./test.py -h
usage: test.py [-h] {print} ...
positional arguments:
  {print}
$ ./test.py print -h
usage: test.py print [-h] text [color] [size]
positional arguments:
  text
  color
  size
$ ./test.py print text
Namespace(color=None, func=<function printText at 0x2a96150b90>, size=None, text='text')
$ ./test.py print text red
Namespace(color='red', func=<function printText at 0x2a96150b90>, size=None, text='text')
$ ./test.py print text red 12
Namespace(color='red', func=<function printText at 0x2a96150b90>, size=12, text='text')
根据Devin Jeanpierre的回答,似乎使用'+'(一个或多个)而不是'*'会做你正在努力实现的。 (PS:如果我有足够的积分,我会在他的回答中评论)
链接地址: http://www.djcxy.com/p/61961.html上一篇: Python argparse optional sub
下一篇: Update query that handles duplicates and increment operator
