gpt4 book ai didi

python - 如何捕获导致 argparse 在 Python 中引发错误的值

转载 作者:行者123 更新时间:2023-11-30 22:42:06 24 4
gpt4 key购买 nike

是否可以捕获当 argparse 值的类型错误时引发的错误(无效值,但参数已识别),以便查看导致错误的原因并最终忽略它(继续解析)?

我知道我可以重写 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)。并自定义返回值。这里我只是返回一个带有“错误”字符串和原始字符串的元组。

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'))

关于python - 如何捕获导致 argparse 在 Python 中引发错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42261093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com