当多次指定相同的参数时,默认的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在这种情况下显示错误,因为从我的角度来看,默认行为是易于出错。
答案 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
)