如下面的代码所示,我想要一个可选的位置参数files
,我想为其指定一个默认值,当传入路径时,使用指定的路径。
但是因为 --bar
可以有多个参数,所以传入的路径没有进入 args.files
,我该如何解决这个问题?谢谢!
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
parser.add_argument('--bar', nargs='*')
parser.add_argument('files', nargs='?')
cmd = '--foo a --bar b c d '
print parser.parse_args(cmd.split())
# Namespace(bar=['b', 'c', 'd'], files=None, foo='a')
cmd = '--foo a --bar b c d /path/to/file1'
print parser.parse_args(cmd.split())
# Namespace(bar=['b', 'c', 'd', '/path/to/file1'], files=None, foo='a')
你的参数规范本质上是不明确的(因为--bar
可以接受无限参数,所以没有好的方法来判断它何时结束,特别是因为files
是可选的) ,因此需要用户消歧。具体来说,通过将 --
放在仅位置部分之前,可以告诉 argparse“这是开关部分的结尾,所有后续参数都是位置的”。如果您这样做:
cmd = '--foo a --bar b c d -- /path/to/file1'
print parser.parse_args(cmd.split())
你应该得到:
Namespace(bar=['b', 'c', 'd'], files='/path/to/file1', foo='a')
(在 Py3 上测试,但也应适用于 Py2)
或者,用户可以通过避免将位置参数放在 --bar
之后,将位置参数传递到任何明确的位置,例如:
cmd = '/path/to/file1 --foo a --bar b c d'
或
cmd = '--foo a /path/to/file1 --bar b c d'
最后,您可以避免使用 nargs='*'
作为开关,因为它会带来歧义。相反,定义 --bar
被多次接受,每个开关使用一个值,将所有使用累积到一个列表
:
parser.add_argument('--bar', action='append')
然后多次传递 --bar
来一次提供多个值,而不是一次传递多个值:
cmd = '--foo a --bar b --bar c --bar d /path/to/file1'
我是一名优秀的程序员,十分优秀!