这与有关允许多次指定参数的问题有一定的关联。
我想要能够像这样多次指定一个选项:
tool --foo 1 --foo 2 --foo 3
也可以像这样:
tool a b c
我也想同时支持两者:
tool a b c --foo 1 --foo2 --foo 3
这个方法与以下情况兼容:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo', nargs='*', action='append')
parser.add_argument('--foo', nargs='*', dest='foo', action='append')
结果列表可以很容易地展开:args = parser.parse_args('a b c --foo 1 --foo 2 --foo 3'.split())
args.foo = [el for elements in args.foo for el in elements]
返回结果: 产生:
>>> args
Namespace(foo=['a', 'b', 'c', '1', '2', '3'])
我该如何添加默认值,以便在用户指定一个参数时不会立即使用默认值?
如果只是在其中一个add_argument()
调用中添加default=[['spam']]
,则默认值始终是结果的一部分。我无法让argparse自己在用户提供自己的参数时删除它。
我希望argparse本身已经提供了解决方案。
if len(foo) > 1: foo.pop(0)
是否解决了问题? - hBy2Pyif len(foo) == 0: foo.append(default)
(并在代码中不指定默认值)。否则可能会有奇怪的边缘情况(顺序不能保证,不知道?或其他什么原因产生的?)。有趣的是,在mgilson回答之前,我自己写了一个Action
子类来执行您建议的操作。我删除它是因为被接受的解决方案对我很好,而且更加简洁。 - cfi