【发布时间】:2012-09-09 18:30:52
【问题描述】:
这与question about allowing an argument to be specified multiple times 中涉及的主题略有相关。
我希望能够像这样多次指定一个选项:
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'])
如何在用户指定一个参数后立即不使用默认值的方式添加默认值?
如果只将default=[['spam']] 添加到add_argument() 调用之一,则默认值始终是结果的一部分。一旦用户自己提供参数,我就无法让 argparse 自行删除它。
我希望argparse 已经提供了一个解决方案。
【问题讨论】:
-
迟到:虽然我理解将其全部保存在
argparse内的动机,但对于大多数应用程序来说,一个简单的if len(foo) > 1: foo.pop(0)不会解决问题吗? -
@hBy2Py:理解你的观点(是的),不,我想把它放在图书馆里;-)。我经常是一个理想主义者,为了获得乐趣和学习而超越“足够好”。对于实际提议的代码,它可能是
if len(foo) == 0: foo.append(default)(并且在代码中没有指定默认值)。否则可能会出现奇怪的角落情况(订单不保证,不知道?还有什么?)。有趣的是,在 mgilson 回答之前,我自己按照您在Action的子类中的建议写了一个答案。我删除了它,因为接受的解决方案对我来说效果很好并且更简洁。
标签: python python-3.x default-value argparse