2017-02-15 66 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