多次指定参数时显示错误

ste*_*wpf 2 python argparse

当多次指定相同的参数时,默认的 argparse 行为是最后指定的值“获胜”,覆盖先前的值。我希望 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
)
Run Code Online (Sandbox Code Playgroud)

调用脚本:

myscript.py -t hello -t world
Run Code Online (Sandbox Code Playgroud)

没有错误,test才有价值世界。我希望 argparse 在这种情况下显示错误,因为从我的角度来看,默认行为很容易出错。

geo*_*org 5

最简单的选项是使用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
Run Code Online (Sandbox Code Playgroud)

但更好的方法是在解析器内解决问题,以便获得统一的错误处理。这可以通过自定义操作来完成,如下所示:

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
)
Run Code Online (Sandbox Code Playgroud)