多次指定参数时显示错误

时间:2019-03-30 10:50:27

标签: python argparse

当多次指定相同的参数时,默认的argparse行为是最后指定的值“ wins”,覆盖先前的值。我希望argparse在多次指定相同的参数时显示错误,而不是静默覆盖第一个指定的值。

那怎么办?

我当前的代码:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
    '-t', '--test',      # either of this switches
    type=str,            # parameter is string
    dest='test',         # store in 'test'.
    required=True        # required
)

调用脚本:

myscript.py -t hello -t world

没有错误,test的值为 world 。我希望argparse在这种情况下显示错误,因为从我的角度来看,默认行为是易于出错。

1 个答案:

答案 0 :(得分:3)

最简单的选择是使用action="append"并检查结果是否为len> 1:

parser.add_argument(
    '-t', '--test',
    type=str,
    dest='test',
    action='append',
    required=True
)

args = parser.parse_args()

if len(args.test) > 1:
   ...error

但是更好的方法是在解析器中解决问题,以便获得统一的错误处理。可以使用这样的自定义操作来完成此操作:

class Once(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        if hasattr(self, 'seen'):
            raise argparse.ArgumentError(self, 'only one please')
        setattr(self, 'seen', True)
        setattr(namespace, self.dest, values)


parser = argparse.ArgumentParser()
parser.add_argument(
    '-t', '--test',
    type=str,
    dest='test',
    action=Once,
    required=True
)