Python argparse可选子参数

2024-05-19 18:41:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让我的程序有一个参数,它有一些必需的参数和一些可选的参数。像这样的:

[--print text [color [size]]

所以你可以通过以下任何一项:

mycommand --print hello
mycommand --print hello blue
mycommand --print hello red 12

可能有多个这样的参数,所以它必须是一个add_参数。例如:

[--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将引发异常。


Tags: addparserhello参数fooargparsebarhelp
3条回答

怎么样

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的回答,似乎使用“+”(一个或多个)而不是“*”可以实现您想要实现的目标。 (附言:如果我有足够的观点,我会在他的回答中发表评论)

阅读source code(从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 x y z

相关问题 更多 >