2017-01-14 2 views
1

私はPythonプログラムに柔軟なコマンドライン引数を受け入れるためにargparseモジュールを使用しようとしています。単純なブール値のフラグを渡して、TrueまたはFalseと言って、自分のコードで適切な分岐を実行したいと思います。argparseがブール値フラグを正しく解析しないのはなぜですか?

以下を考慮してください。

import argparse 

parser = argparse.ArgumentParser(prog='test.py',formatter_class=argparse.ArgumentDefaultsHelpFormatter) 
parser.add_argument('-boolflag', type=bool, default=True) 
parser.add_argument('-intflag' , type=int, default=3) 
args = parser.parse_args() 

boolflag = args.boolflag 
intflag = args.intflag 


print ("Bool Flag is ", boolflag) 
print ("Int Flag is ", intflag) 

私はpython scrap.py -boolflag False -intflag 314でそれを実行しようとしたとき、私は

Bool Flag is True 
Int Flag is 314 

これはなぜですか?結果を得ました! intフラグは正しく解析されているように見えますが、ブール値フラグは、Falseになるようにコマンドライン引数で明示的に言及しても、常にTrueとして解析されます。

どこが間違っていますか?

答えて

4

あなたはブール値に文字列"False"をオンにしようとしている。

>>> bool("False") 
True 

文字列"False"が空でない値であるため、動作しないこと。 すべて空でない文字列は、Trueブール値を持ちます。

使用して、代わりにstore_false action:あなたはそのスイッチを使用する場合さて、Falseが保存されている

parser.add_argument('--disable-feature', dest='feature', 
        action='store_false') 

、そうでない場合、デフォルトはTrueaction='store_false'で設定)されます。

+0

'action = 'store_false'' [自動的にデフォルトをTrueに設定](https://stackoverflow.com/q/8203622/2201041) – JETM

+0

@JETM:gah、yes 、 もちろん。 –

関連する問題