2012-09-06 2 views
8

これは、異なる視点からの回答ですが、Setting default option in Python of two mutually exclusive options using the argparse moduleと似ています。相互排他的な別の引数がtrueの場合は、デフォルトをfalseに設定します

コードブロックは、(パーサはargparse.ArgumentParserのインスタンスである):

mutex_group = parser.add_mutually_exclusive_group() 
mutex_group.add_argument("--show", action="store_true", 
    dest="show", default=True) 
mutex_group.add_argument("--insert", action="store_true", 
    dest="insert") 

opts = parser.parse_args() 

どちら--showまたは--insertは私が(それゆえdefault=True--showをデフォルトにしたい指定されている場合が、--insertならば、opts.showはまだ使用されています相互に排他的なブロックの一部であるにもかかわらず、(デフォルトのために)trueを設定します。

opt.showがTrueであるかどうかをテストするときに、他の選択肢のどれも設定されていない現在のコードをチェックし、すなわち:

if opts.show and not opts.insert: 
    do_something() 
elif opts.insert: 
    do_something_else() 

が、これはあなたが相互に排他的に--deleteを追加するときに何が起こるか(スケールしませんグループなど)私は他のすべての変数をopts.show falseにするためのより良い方法を探していますが、それはまだデフォルトとして持っています。

argparseのドキュメントを読むと、私はカスタムアクションが行く方法だと思うが、そこから相互排他的なグループの他のメンバーにアクセスする方法を見ることができないと思う。残りのいずれかが設定されている場合はデフォルトを反転します)。 もう1つのオプションは、if条件を逆にすることですが、それは不正です(デフォルトが変更された場合、if文の順序も変更する必要があります)。

答えて

19

おそらく'store_const'がより適切なアクション(すべての引数が同じ宛先を指している)になることがあります。

import argparse 
parser = argparse.ArgumentParser() 
mutex_group = parser.add_mutually_exclusive_group() 
mutex_group.add_argument("--show", action="store_const", 
    dest="mutex", const="show") 
mutex_group.add_argument("--insert", action="store_const", 
    dest="mutex", const="insert") 
mutex_group.add_argument('--delete', action="store_const", 
    dest="mutex", const="delete") 


parser.set_defaults(mutex='show') 
args = parser.parse_args() 
print(args) 

args.mutexを使用して、実行するアクションを特定できます。

関連する問題