2017-02-15 63 views
0

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

我知道我可以重写ArgumentParser的错误方法,但它只给出错误信息作为字符串,我想避免解析这个字符串。

这是为了处理CLI中的一些魔术关键字,无论使用argparse定义何种类型。

注意,我读了以下相关问题:

Handle invalid arguments with argparse in Python

和Python文档,没有一个似乎给出一个答案。

回答

1

您可以定义捕获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在一个参数,漂浮在另一:

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

谢谢,这是一个不错的方式! – dtrckd