我希望我的程序有一个参数,它有一些必需的参数以及一些可选参数。像这样:
[--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会抛出异常。
答案 0 :(得分:8)
怎么样
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')
答案 1 :(得分:6)
阅读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
。
答案 2 :(得分:1)
根据Devin Jeanpierre的回答,似乎使用&#39; +&#39; (一个或多个)而不是&#39; *&#39;会做你想要达到的目标。 (PS:如果我有足够的分数,我会在他的回答中做出评论)
答案 3 :(得分:0)
适用于单个arg:
parser.add_argument('--write_google', nargs='?', const='Yes',
choices=['force', 'Yes'],
help="write local changes to google")