Python:在引发argparse.ArgumentError后,argparse会引发泛型错误
我为需要遵循精确格式的参数定义了自定义正则表达式类型。我使用了另一篇文章()中的代码,非常有用。我的问题是,我正在编写单元测试,预计正则表达式会失败,并试图断言引发了Python:在引发argparse.ArgumentError后,argparse会引发泛型错误,python,regex,assert,argparse,Python,Regex,Assert,Argparse,我为需要遵循精确格式的参数定义了自定义正则表达式类型。我使用了另一篇文章()中的代码,非常有用。我的问题是,我正在编写单元测试,预计正则表达式会失败,并试图断言引发了argparse.ArgumentError(assertRaises(argparse.ArgumentError,parser.parse_args(inargs.split()))。问题是argparse似乎正在捕获ArgumentError并抛出一个泛型错误,阻止我验证失败的原因。我错过什么了吗 以下是回溯: Error T
argparse.ArgumentError
(assertRaises(argparse.ArgumentError,parser.parse_args(inargs.split())
)。问题是argparse似乎正在捕获ArgumentError并抛出一个泛型错误,阻止我验证失败的原因。我错过什么了吗
以下是回溯:
Error
Traceback (most recent call last):
File "/Users/markebbert/PyCharmProjects/newproject/unittests.py", line 203, in test_set_operation_parameter
self.assertRaises(argparse.ArgumentError, parser.parse_args(inargs.split()))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1688, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1727, in parse_known_args
self.error(str(err))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 2347, in error
self.exit(2, _('%s: error: %s\n') % (self.prog, message))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 2335, in exit
_sys.exit(status)
SystemExit: 2
以下是我定义的自定义类型和解析器代码:
class RegexValidator(object):
"""
Performs regular expression match on value.
If match fails an ArgumentError is raised
"""
def __init__(self, pattern, statement=None):
self.pattern = re.compile(pattern)
self.statement = statement
if not self.statement:
self.statement = "must match pattern %s" % self.pattern
def __call__(self, string):
match = self.pattern.search(string)
if not match:
raise argparse.ArgumentError(None, self.statement)
return string
operatorRV = RegexValidator(
"^((\w+)=)?[iIuUcC]\[(\w+(\[\w+(,\w+)*\])?)(:\w+(\[\w+(,\w+)*\])?)*\]$",
"Set operations must conform to...")
parser = argparse.ArgumentParser(
description='Compare variants across individuals',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
group.add_argument('-s', '--set-operation', dest='operation', nargs='+',
type=operatorRV,
help="blah.")
下面是单元测试:
# Fail for ending colon
inargs = "-s out=i[one[id1]:]"
self.assertRaises(argparse.ArgumentError, parser.parse_args(inargs.split()))
Argparse是一个命令行解析器,错误总是以调用
Argparse.exit()
结束,而Argparse.exit()又调用带有错误代码的sys.exit()
。这是故意的
对于单元测试,您必须对解析器的.error()
或.exit()
方法进行monkeypatch(可能使用模拟)<使用错误消息调用code>.error()并打印使用情况消息,然后使用退出代码和错误消息调用.exit()
它们当前的实现:
# ===============
# Exiting methods
# ===============
def exit(self, status=0, message=None):
if message:
self._print_message(message, _sys.stderr)
_sys.exit(status)
def error(self, message):
"""error(message: string)
Prints a usage message incorporating the message to stderr and
exits.
If you override this in a subclass, it should not return -- it
should either exit or raise an exception.
"""
self.print_usage(_sys.stderr)
self.exit(2, _('%s: error: %s\n') % (self.prog, message))
Argparse会引发一个
SystemExit
,因为这是命令行工具应该做的事情;错误时返回系统退出代码。您能详细说明吗?我不会考虑ARPARSE命令行工具,因为它是一个Python模块。与任何模块一样,我希望能够“捕获”argparse的错误并自己处理它们。我补充了一个答案。