如何捕获导致 argparse 在 Python 中引发错误的值
How to catch the value that cause argparse to raise an error in Python
是否有可能捕获当值的类型与 argparse 错误时引发的错误(无效值但参数被识别)以便查看导致错误的原因并最终 ignore 它(继续解析)?
我知道我可以覆盖 ArgumentParser 的错误方法,但它只提供错误消息作为字符串,我想避免解析这个字符串。
这是为了在 CLI 中处理一些魔术关键字,无论使用 argparse 定义的类型如何。
请注意,我阅读了以下相关问题:
Handle invalid arguments with argparse in Python
和Python文档,似乎都没有给出答案。
您可以定义一个错误捕获 type
函数。例如将 int
包装为:
def trytype(astr, fn=int):
try:
ret = fn(astr)
except ValueError:
ret = ('error', astr)
return ret
In [51]: parser = argparse.ArgumentParser()
In [52]: parser.add_argument('-f', type=trytype);
In [53]: parser.parse_args('-f 123'.split())
Out[53]: Namespace(f=123)
In [54]: parser.parse_args('-f abc'.split())
Out[54]: Namespace(f=('error', 'abc'))
这可以推广到处理其他类型的函数(可能是一个 trytype 工厂函数)。还让它捕获所有错误类型(ValueError、TypeError、ArgumentTypeError)。并自定义 return 值。在这里,我只是 return 编辑了一个带有 'error' 字符串和原始字符串的元组。
In [55]: from functools import partial
In [56]: partial(trytype, fn=float)
Out[56]: functools.partial(<function trytype at 0xac13a8e4>, fn=<class 'float'>)
In [57]: partial(trytype, fn=float)('12.34')
Out[57]: 12.34
In [58]: partial(trytype, fn=int)('12.34')
Out[58]: ('error', '12.34')
In [59]: partial(trytype, fn=str)('abc')
Out[59]: 'abc'
在一个参数中接受 int 而在另一个参数中接受 float:
In [60]: parser = argparse.ArgumentParser()
In [61]: parser.add_argument('-i', type=partial(trytype, fn=int));
In [62]: parser.add_argument('-f', type=partial(trytype, fn=float));
In [63]: parser.parse_args('-f abc -i123'.split())
Out[63]: Namespace(f=('error', 'abc'), i=123)
In [64]: parser.parse_args('-f 12.32 -ia23'.split())
Out[64]: Namespace(f=12.32, i=('error', 'a23'))
In [65]: parser.parse_args('-f 12e32 -ia23'.split())
Out[65]: Namespace(f=1.2e+33, i=('error', 'a23'))
In [66]: parser.parse_args('-f x2e32 -ia23'.split())
Out[66]: Namespace(f=('error', 'x2e32'), i=('error', 'a23'))
是否有可能捕获当值的类型与 argparse 错误时引发的错误(无效值但参数被识别)以便查看导致错误的原因并最终 ignore 它(继续解析)?
我知道我可以覆盖 ArgumentParser 的错误方法,但它只提供错误消息作为字符串,我想避免解析这个字符串。
这是为了在 CLI 中处理一些魔术关键字,无论使用 argparse 定义的类型如何。
请注意,我阅读了以下相关问题:
Handle invalid arguments with argparse in Python
和Python文档,似乎都没有给出答案。
您可以定义一个错误捕获 type
函数。例如将 int
包装为:
def trytype(astr, fn=int):
try:
ret = fn(astr)
except ValueError:
ret = ('error', astr)
return ret
In [51]: parser = argparse.ArgumentParser()
In [52]: parser.add_argument('-f', type=trytype);
In [53]: parser.parse_args('-f 123'.split())
Out[53]: Namespace(f=123)
In [54]: parser.parse_args('-f abc'.split())
Out[54]: Namespace(f=('error', 'abc'))
这可以推广到处理其他类型的函数(可能是一个 trytype 工厂函数)。还让它捕获所有错误类型(ValueError、TypeError、ArgumentTypeError)。并自定义 return 值。在这里,我只是 return 编辑了一个带有 'error' 字符串和原始字符串的元组。
In [55]: from functools import partial
In [56]: partial(trytype, fn=float)
Out[56]: functools.partial(<function trytype at 0xac13a8e4>, fn=<class 'float'>)
In [57]: partial(trytype, fn=float)('12.34')
Out[57]: 12.34
In [58]: partial(trytype, fn=int)('12.34')
Out[58]: ('error', '12.34')
In [59]: partial(trytype, fn=str)('abc')
Out[59]: 'abc'
在一个参数中接受 int 而在另一个参数中接受 float:
In [60]: parser = argparse.ArgumentParser()
In [61]: parser.add_argument('-i', type=partial(trytype, fn=int));
In [62]: parser.add_argument('-f', type=partial(trytype, fn=float));
In [63]: parser.parse_args('-f abc -i123'.split())
Out[63]: Namespace(f=('error', 'abc'), i=123)
In [64]: parser.parse_args('-f 12.32 -ia23'.split())
Out[64]: Namespace(f=12.32, i=('error', 'a23'))
In [65]: parser.parse_args('-f 12e32 -ia23'.split())
Out[65]: Namespace(f=1.2e+33, i=('error', 'a23'))
In [66]: parser.parse_args('-f x2e32 -ia23'.split())
Out[66]: Namespace(f=('error', 'x2e32'), i=('error', 'a23'))