当多次指定相同的参数时,默认的 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 在这种情况下显示错误,因为从我的角度来看,默认行为很容易出错。
最简单的选项是使用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)
| 归档时间: |
|
| 查看次数: |
791 次 |
| 最近记录: |