2017-02-15 13 views
0

エラーの原因を調べるために、argparse(値が無効ですが引数が認識されます)で値の型が間違っているときに発生するエラーをキャッチすることは可能ですか?最終的にはは無視してです(解析を続けます)?argparseがPythonでエラーを発生させる原因となる値をキャッチする方法

私はArgumentParserのエラーメソッドをオーバーライドできますが、エラーメッセージのみを文字列として返します。この文字列の解析を避けたいと思います。

これは、argparseで定義されたタイプに関係なく、CLIでいくつかのマジックキーワードを処理するためです。私は以下の関連質問を読ん

注:

Handle invalid arguments with argparse in Python

とPythonドキュメントは、どちらもが答えを与えるように思われます。

答えて

1

type機能をキャッチするエラーを定義できます。これは、他のタイプの機能を処理するために一般化することができる

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ファクトリ関数であってもよい)、例えばようintを包みます。また、すべてのエラータイプ(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' 

1つの引数に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

関連する問題